我正在开发一个小型操作系统,它将为每个进程使用单独的本地描述符表。我知道我将需要使用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数据中有一个打字错误而失败。
发布于 2011-07-31 05:52:24
好了,我想通了。我使用的类型(1001b)不是我需要的类型。我发现类型2 (10b)用于LDT条目。此信息记录在i486微处理器程序员手册第4页的第6章中。我的函数式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 0x0https://stackoverflow.com/questions/6886112
复制相似问题