[英]X86: protected mode, GDT, IDT
我試圖用kolibri引導程序執行簡單的內核。 它正在加載到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 $
因為在調試器中看起來像這樣
這里發生了什么? 為什么不更改ES和DS?
PS我正在嘗試讓此內核與kolibri loader一起使用: http ://wasm.ru/article.php?article=ia32int
當您在cr0
設置保護位時,處理器不會自動進入保護模式。 此后在更改cs
時進入保護模式。 最簡單的方法是在寫入cr0
之后立即插入一個遠跳轉。
mov cr0, eax
.db 066h
jmp CODE_SEGMENT:PROTECTED_ENTRY
use32
PROTECTED_ENTRY:
希望我沒錯。 (我習慣於AT&T語法。)。 .db
是一個操作數大小重寫,可以使用32位地址。
Tee調試器確實將32位代碼(您告訴匯編程序使用use32
偽操作生成32位代碼)反匯編為16位代碼。 因此,指令mov ax, 10h
被解釋為mov eax, d88e0010h
,其中d88e
部分實際上是下一條指令mov ds,ax
的操作碼。
類似於mov esp, 0xffff
,它被解釋為mov sp, 0xffff
,另外兩個零字節顯示為偽add byte ptr...
指令。
處理器實際執行的操作取決於其當前狀態-是處於保護模式,實模式,平面模式等。查看狀態寄存器以找出答案。 可能您可以告訴調試器解釋不同的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.