X86: защищенный режим, GDT, IDT - PullRequest
       45

X86: защищенный режим, GDT, IDT

2 голосов
/ 16 января 2012

Я пытался запустить простое ядро ​​с загрузчиком колибри. Он загружается в 1000: 0000. Я не понимаю, что не так в этой части:

...
; switch to PM
mov eax, cr0
or  al, 1
mov cr0, eax

use32
PROTECTED_ENTRY:
mov  ax, 00010000b  ; DATA
mov  ds, ax
mov  ss, ax
mov  esp, 0xFFFF

jmp $

mov  ax, 00011000b  ; VIDEO
mov  es, ax
mov  edi, 0

mov  esi, string
int 1

jmp $

потому что в отладчике это выглядит так enter image description here

Что здесь происходит? Почему ES и DS не меняются?

P.S. я пытаюсь заставить это ядро ​​работать с загрузчиком колибри: http://wasm.ru/article.php?article=ia32int

Ответы [ 2 ]

3 голосов
/ 16 января 2012

Процессор не входит в защищенный режим автоматически, когда вы устанавливаете защищенный бит в cr0.Он входит в защищенный режим, когда cs изменяется после этого.Самый простой способ сделать это - вставить дальний прыжок сразу после записи в cr0.

mov cr0, eax
.db 066h
jmp CODE_SEGMENT:PROTECTED_ENTRY

use32
PROTECTED_ENTRY:

Надеюсь, я понял это правильно.(Я привык к синтаксису AT & T.) То, что .db является переопределением размера операнда, чтобы разрешить 32-битный адрес.

2 голосов
/ 16 января 2012

Tee-отладчик разбирает 32-битный код (вы сказали ассемблеру генерировать 32-битный код с псевдооперацией use32) как 16-битный код.Таким образом, инструкция mov ax, 10h интерпретируется как mov eax, d88e0010h, где часть d88e в действительности является кодом операции для следующей инструкции, mov ds,ax.

Аналогично для mov esp, 0xffff, что интерпретируется как mov sp, 0xffff и два дополнительных нулевых байта отображаются как ложные инструкции add byte ptr....

То, что процессор фактически выполняет, зависит от его текущего состояния - в защищенном режиме, в реальном режиме, в плоском режиме и т. д. Посмотрите нарегистры статуса выяснить.Возможно, вы можете сказать отладчику интерпретировать код по-другому.

...