2012-01-12 145 views
3

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

我正在QEMU下运行我的内核(但它是),但我发现当页面错误发生时,它崩溃(我回到命令提示符)。我一直在阅读和挖掘搜索提示,可能会帮助我找出确切的原因。我认为我错过了某些东西和/或误解了某些东西。顺便说一下,当我将页面错误向上设置为使用中断门时,我可以像预期的那样使事情发挥作用。当我尝试为此使用任务门时会遇到问题(并且是的,我确实想坚持尝试使用任务门)。

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

但是,如果我已经正确填充了TSS并且至今无法确定如何设置其所有字段,我并不是100%确定的。其中一些例如esp,eip,cs,ds,es,fs,gs,ss和eflags一直比较直接。但是,其他如LDT段选择器则不太清楚。 LDT段选择器必须为非零AND指向GDT中的LDT描述符?必须为上述场景设置哪些字段?我正在琢磨这个问题。

任何帮助将不胜感激。

+0

万一你忘记了,即使中断和异常触发它的执行,任务仍然是一项任务,而不是一个子程序。这意味着它必须具有主循环,所以当它完成处理第一个中断/异常并执行IRET时,它的状态将会在下一次它继续在该IRET之后的指令处继续运行。如果IRET后面没有任何东西,它会崩溃。 – 2012-05-14 08:27:56

+0

另一件需要注意的事情。如果你想把一个任务切换到某个任务,它必须从任务中完成。任务切换总是从一个任务开始,并从一个任务开始。你不能只有一个TSS,一个用于页面错误处理程序。你必须至少有两个不同的。如果您尝试从无效任务(无效的“TR”或无效的“TSS”)切换到指向(例如错误地初始化TSS字段)或无效任务,您将遇到异常并可能崩溃。 – 2012-05-14 08:35:50

+0

@Alex - 谢谢! – Sparky 2012-05-14 12:04:25

回答

1

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

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

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

+0

在Windows上禁止,但在Linux上禁止。 'modify_ldt(2)'仍然适用于AMD64内核。 – Ruslan 2015-10-04 06:28:13