Система cra sh при попытке обновить регистр DS - PullRequest
0 голосов
/ 23 апреля 2020

Я пишу простой загрузчик, в котором я читаю следующий сектор с диска, загружаю gdt, переключаюсь в 32-битный режим и печатаю письмо, указывающее на успешность. На эмуляторе (qemu) все работает нормально, но физические системы сразу же перезагружаются при попытке обновить регистр 'ds' после входа в 32-битный режим. Если я попытаюсь обновить другие регистры сегментов, то на эмуляторе тоже будет взломано sh.

Код, вызывающий взлом sh

mov ax, 0x10
mov ds, ax

Если я закомментирую этот код, загрузчик работает отлично. gdt:

null:
dd 0x0
dd 0x0
code:
dw 0xffff
dw 0x0
db 0x0
db 10011010b
db 01000111b
db 0x0

data0:
dw 0xffff
dw 0x0
db 0x0
db 10010010b
db 01000111b
db 0x0

Ответы [ 2 ]

2 голосов
/ 26 апреля 2020

Да! Это потому, что мой сегмент данных только расширился до 7FFFF, но я пытался напечатать т.е. запись по адресу B8000, вот и все! Этот код для печати был внутри моего «ядра», которое находится в C, поэтому я понятия не имел, что будет, особенно если он работает, если я его не установил. Спасибо всем за ваше руководство.

Я не удаляю сообщение, как для тех, кто может сделать такую ​​же глупость ??

0 голосов
/ 26 апреля 2020

Нашел это. Это часть данных GDT. В частности, предел (15-19), хотя я не знаю почему, поэтому всегда приветствуются объяснения.

...