繁体   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