4

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

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

IDT 部分被正确设置为页面错误向量注册一个任务门。它的选择器指的是 GDT 中 TSS 的描述符。至于 GDT 中 TSS 的描述符,我确信它也设置正确。

但是,我不能 100% 确定我是否正确填充了 TSS,并且到目前为止还无法准确确定如何设置其所有字段。其中一些,如 esp、eip、cs、ds、es、fs、gs、ss 和 eflags 相对直接。但是,诸如 LDT 段选择器之类的其他内容则不太清楚。LDT 段选择器必须非零并且指向 GDT 中的 LDT 描述符吗?必须为上述场景设置哪些字段?我有很多时间来解决这个问题。

任何帮助将不胜感激。

4

1 回答 1

0

LDT 在正常运行的 x86 操作系统中不是必需的(实际上,在 x86-64 操作系统中是禁止的)。

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

需要特别注意的一件事 - osdev.org 上关于 TSS 的结构是从后到前的 (http://wiki.osdev.org/TSS)。您需要小心,因为弄错 TSS 会触发 TSS 故障异常。

于 2012-05-14T08:14:40.760 回答