作为针对32位x86处理器的某些OS开发的一部分,我正在考虑将中断描述符表中的任务门用于页面错误向量。目的是强制执行任务切换,以确保可以映射处理程序的堆栈(并避免中断的任务的堆栈的一部分未映射的情况)。
我在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操作系统中,禁止使用LDT)。
为避免使用它,请将其设置为零。
特别要注意的一件事-osdev.org上有关TSS的结构是从头到尾(http://wiki.osdev.org/TSS)。您需要小心,因为弄错TSS会触发TSS故障异常。