2012-01-16 3 views
2

Я попытался выполнить простое ядро ​​с помощью загрузчика kolibri. Загружается в 1000: 0000. Я не понимаю, что плохого в этой части:X86: защищенный режим, GDT, IDT

... 
; 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

ответ

3

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

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

use32 
PROTECTED_ENTRY: 

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

2

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

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

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