x86处理器清除IDTR并在'int $ 0x80'之后跳转到EIP 0xe05b

时间:2015-04-28 20:11:51

标签: x86 operating-system kernel interrupt-handling

我正在为x86处理器创建一个操作系统,并在用户空间中执行一个程序(启用了分页)。在程序进入系统调用('int $ 0x80')之前,IDTR指向我的IDT,0x80的条目正确指向我想要执行的函数。在gdb中,在'si'之后,处理器在地址0xe05b处结束,IDTR完全清零(设置为0)。

请注意,在输入用户空间之前,'int $ 0x80'调用工作正常,它会进入我的函数调用。执行一个人工iret到达用户空间后,下一个'int $ 0x80'会导致这种奇怪的行为。

如果有帮助,这一切都是在我对文件系统代码进行更改后才开始发生的,但是我没有看到与IDTR有什么关系。

它还可以清除所有其他寄存器,包括堆栈,数据和代码选择器。就像是某种恐慌

有谁知道可能导致处理器执行此操作的原因?

提前致谢!

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,我在执行流程时通过更改TSS中的ss0值来纠正它。您的esp0值也可能是错误的,但ss0应该是内核DS值0x18。停止进程时也将ss0设置为0x18。至于esp0,它应该是你要执行的esp(我现在都知道)。

答案 1 :(得分:1)

我将假设你在bochs下进行调试。看起来正在发生的事情是你是三重故障导致它重启的CPU。 f000:e05b是bochs启动时调试器在BIOS中断开的地址。

可能发生的事情是您的IDT在某种程度上无效,从而阻止中断从用户模式传递。这会导致引发一些其他异常(可能是一般保护错误或双故障异常)。如果该异常的IDT无效,那么CPU会放弃和三重故障,它会通过重置自己来处理。

您应该检查您的IDT对于从用户模式进行的呼叫是否有效。