【问题标题】:Is an LDT needed?需要LDT吗?
【发布时间】: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 字段))或无效任务切换,您将收到异常并可能崩溃。跨度>

标签: x86 osdev


【解决方案1】:

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

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

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

【讨论】:

  • 在 Windows 上是禁止的,但在 Linux 上是禁止的。 modify_ldt(2) 仍然适用于 AMD64 内核。
猜你喜欢
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 2013-02-13
  • 2011-02-25
  • 2010-12-17
  • 1970-01-01
  • 2023-03-17
相关资源
最近更新 更多