【发布时间】:2012-02-09 01:01:15
【问题描述】:
作为 32 位 x86 处理器的某些操作系统开发的一部分,我正在考虑在中断描述符表中使用任务门来处理页面错误向量。目的是强制任务切换,以保证处理程序的堆栈被映射(并避免中断任务的部分堆栈未映射的情况)。
我在 QEMU 下运行我的内核(例如它),但我发现当页面错误发生时,它崩溃了(我回到命令提示符)。我一直在阅读和挖掘寻找可以帮助我找出确切原因的提示。我认为我遗漏了一些东西和/或误解了一些东西。顺便说一句,当我将页面错误向量设置为使用中断门时,我可以让事情按我的预期工作。当我尝试为此使用任务门时,我遇到了问题(是的,我确实想坚持尝试使用任务门)。
IDT 部分已正确设置,以便为缺页向量注册任务门。它的选择器指的是 GDT 中 TSS 的描述符。至于 GDT 中 TSS 的描述符,我确信它也设置正确。
但是,我不能 100% 确定我是否正确填充了 TSS,并且到目前为止还无法准确确定如何设置其所有字段。其中一些,如 esp、eip、cs、ds、es、fs、gs、ss 和 eflags 相对简单。但是,诸如 LDT 段选择器之类的其他内容则不太清楚。 LDT 段选择器必须非零并且指向 GDT 中的 LDT 描述符吗?必须为上述场景设置哪些字段?我有很多时间来解决这个问题。
任何帮助将不胜感激。
【问题讨论】:
-
以防万一您忘记了,即使中断和异常触发了任务的执行,任务仍然是任务而不是子例程。这意味着,它必须具有主循环,因此当它完成处理第一个中断/异常并执行
IRET时,它的状态将是这样的,即下一次它将继续在此IRET之后的指令处继续运行。如果IRET后面没有“空”,就会崩溃。 -
还有一点需要注意。如果要切换
to一个任务,就必须完成from一个任务。任务切换始终是from一个任务和to一个任务。您不能只有一个 TSS,即页面错误处理程序的一个。你必须至少有两个不同的。如果您尝试从无效任务(无效TR或无效TSS它指向(例如错误初始化TSS字段))或无效任务切换,您将收到异常并可能崩溃。跨度>