2011-07-30 62 views
6

我正在研究一個小操作系統,它將爲每個進程使用單獨的本地描述符表。我知道我需要使用lldt指令從我的GDT加載LDT段。我已經使用有效的GDT在保護模式下運行我的內核,但我無法弄清楚我的LDT的GDT條目應該是什麼樣子。我知道它的基地址應該指向我的LDT,但我不知道特權級別和其他屬性應該是什麼。下面是表示我的GDT內的LDT條目的NASM代碼:使用LLDT併爲其配置GDT

localTable equ $-gdt   ; GDT entry #5 (selector 20h) 
dw 0x1FF      ; limit to 64 descriptors 
dw 0x8000      ; base address 
db 0x0 
db 0x89       ; probably incorrect... 
db 0x1f       ; possibly incorrect... 
db 0x0 

如果你不熟悉NASM語法,此表項具有爲0x8000基址和限制爲511(512個字節總數,或64個條目)。我已閱讀i486程序員參考手冊中有關GDT和LDT的部分,但我無法完全理解我的GDT入門應該是什麼樣子。

無論如何,我加載LDT像這樣:

mov ax, 0x20 
lldt ax 

此代碼使所述處理器產生一個一般保護故障(I與中斷處理它)。我想知道兩件事:

1)我有沒有在GDT中正確描述我的LDT?如果不是,需要改變什麼? 2)LLDT指令可能失敗,因爲我的LDT本身有無效的選擇器?我讀了LLDT指令規範,在我看來它甚至沒有讀LDT的內存,但我只是想確定LLDT沒有失敗,因爲我的LDT數據中有一個輸入錯誤。

回答

3

好吧,我想通了。我使用的類型(1001b)不是我所需要的。我發現類型2(10b)用於LDT條目。爲了記錄,這些信息在i486微處理器程序員手冊的第4頁第6章中。我的功能GDT條目如下所示:

localTable equ $-gdt   ; GDT entry #5 (selector 20h) 
dw 0x1FF      ; limit to 64 descriptors 
dw 0x8000      ; base address 
db 0x0 
db 0x82       ; 10000010b (segment present set, WTM) 
db 0x1f 
db 0x0