X86 是否需要LDT?

X86 是否需要LDT?,x86,osdev,X86,Osdev,作为32位x86处理器操作系统开发的一部分,我正在考虑在中断描述符表中为页面错误向量使用任务门。其目的是强制执行任务切换,以确保处理程序的堆栈被映射(并避免中断任务的堆栈部分未被映射的情况) 我正在QEMU下运行我的内核(比如它),但是我发现当页面错误发生时,它崩溃了(我回到命令提示符)。我一直在阅读和挖掘,寻找可能帮助我找出确切原因的线索。我觉得我遗漏了什么和/或误解了什么。顺便说一句,当我将页面错误向量设置为使用中断门时,我可以让事情按我所期望的那样工作。正是当我尝试为此使用任务门时,我遇到

作为32位x86处理器操作系统开发的一部分,我正在考虑在中断描述符表中为页面错误向量使用任务门。其目的是强制执行任务切换,以确保处理程序的堆栈被映射(并避免中断任务的堆栈部分未被映射的情况)

我正在QEMU下运行我的内核(比如它),但是我发现当页面错误发生时,它崩溃了(我回到命令提示符)。我一直在阅读和挖掘,寻找可能帮助我找出确切原因的线索。我觉得我遗漏了什么和/或误解了什么。顺便说一句,当我将页面错误向量设置为使用中断门时,我可以让事情按我所期望的那样工作。正是当我尝试为此使用任务门时,我遇到了问题(是的,我确实希望坚持尝试使用任务门)

正确设置IDT部分以注册页面错误向量的任务门。它的选择器引用GDT中TSS的描述符。至于GDT中TSS的描述符,我确信也已正确设置

但是,我不能100%确定TSS是否已正确填充,并且至今无法确定如何准确设置其所有字段。其中一些,如esp、eip、cs、ds、es、fs、gs、ss和EFLAG,都是相对直接的。然而,诸如LDT段选择器之类的其他部分则不太清楚。LDT段选择器必须为非零且指向GDT中的LDT描述符吗?必须为上述场景设置以下哪些字段?我花了很长时间才弄明白这一点


任何帮助都将不胜感激。

在功能正常的x86操作系统中不需要LDT(实际上,在x86-64操作系统中是禁止的)

要避免使用它,请将其设置为零


有一件事需要特别注意——osdev.org上关于TSS的结构是背对背的(http://wiki.osdev.org/TSS). 您需要小心,因为错误的TSS会触发TSS故障异常。

如果您忘记了,即使在中断和异常触发其执行时,任务仍然是任务而不是子例程。这意味着,它必须有主循环,这样当它完成处理第一个中断/异常并执行
IRET
时,它的状态将是,下次它将在紧接着该
IRET
的指令下继续运行。如果
IRET
之后没有“任何内容”,它将崩溃。另一件需要注意的事情。如果要将
切换到任务,则必须从任务中执行
。任务切换总是从
任务切换到
任务。您不能只有一个TSS,一个用于页面错误处理程序的TSS。你必须至少有两个不同的。如果您尝试从无效任务(无效的
TR
或它指向的无效
TSS
(例如,错误初始化的
TSS
字段))或无效任务切换到无效任务,您将得到异常并可能崩溃。在Windows上是禁止的,但在Linux上不是禁止的<代码>修改ldt(2)仍然可以在AMD64内核上工作。