2012-01-16 46 views
2

我試着用kolibri bootloader執行簡單的內核。 它被加載到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.我想要得到這個內核KOLIBRI裝載機工作: 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

三通調試器拆解32位代碼(你告訴彙編程序生成與use32僞運算32位碼)爲16位的代碼。因此指令mov ax, 10h被解釋爲mov eax, d88e0010h,其中d88e部分實際上是下一條指令的操作碼mov ds,ax

mov esp, 0xffff類似,它被解釋爲mov sp, 0xffff,另外兩個零字節顯示爲僞指令add byte ptr...

處理器實際執行的內容取決於其當前狀態 - 它處於保護模式,實模式,平面模式等。查看狀態寄存器以查找。可能你可以告訴調試器解釋不同的代碼。