我正在研究一個小操作系統,它將爲每個進程使用單獨的本地描述符表。我知道我需要使用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數據中有一個輸入錯誤。