簡體   English   中英

使用LLDT並為其配置GDT

[英]Using LLDT and configuring the GDT for it

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

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

此代碼使處理器生成一般保護錯誤(我通過中斷處理它)。 我想知道兩件事:

1)我是否在GDT中正確描述了我的LDT? 如果沒有,需要改變什么? 2) LLDT指令是否會失敗,因為我的LDT本身存在無效的選擇器? 我讀了LLDT指令規范,在我看來它甚至沒有讀取LDT的內存,但我只是想確定LLDT沒有失敗,因為我的LDT數據中有一個拼寫錯誤。

好的,我明白了。 我使用的類型( 1001b )不是我需要的。 我發現類型2( 10b )用於LDT條目。 有關記錄,此信息位於i486微處理器程序員手冊的第6章第4頁。 我的功能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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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