首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用LLDT并为其配置GDT

使用LLDT并为其配置GDT
EN

Stack Overflow用户
提问于 2011-07-31 05:37:16
回答 1查看 713关注 0票数 6

我正在开发一个小型操作系统,它将为每个进程使用单独的本地描述符表。我知道我将需要使用lldt指令从我的GDT中加载一个LDT段。我已经使用有效的GDT在保护模式下运行内核,但是我不知道LDT的GDT条目应该是什么样子。我知道它的基址应该指向我的LDT,但我不知道特权级别和其他属性应该是什么。下面是表示我的GDT中的LDT条目的NASM代码:

代码语言:javascript
复制
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:

代码语言:javascript
复制
mov ax, 0x20
lldt ax

这段代码会导致处理器生成一般的保护错误(我用中断来处理它)。我想知道两件事:

1)我是否在GDT中正确描述了我的LDT?2) LLDT指令会不会因为我的LDT本身中有无效的选择器而失败?我读了LLDT指令规范,在我看来它甚至不能读取LDT的内存,但我只是想确保LLDT不会因为我的LDT数据中有一个打字错误而失败。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-31 05:52:24

好了,我想通了。我使用的类型(1001b)不是我需要的类型。我发现类型2 (10b)用于LDT条目。此信息记录在i486微处理器程序员手册第4页的第6章中。我的函数式GDT条目如下所示:

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6886112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档