簡體   English   中英

X86:保護模式,GDT,IDT

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM