gpt4 book ai didi

assembly - 使用 LLDT 并为其配置 GDT

转载 作者:行者123 更新时间:2023-12-04 15:36:42 24 4
gpt4 key购买 nike

我正在开发一个小型操作系统,它将为每个进程使用单独的本地描述符表。我知道我需要使用 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

关于assembly - 使用 LLDT 并为其配置 GDT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6886112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com