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

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

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

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

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

提前致谢!

最佳答案

我有相同的确切问题,我在执行该过程时通过更改TSS中的ss0值来纠正它。您的esp0值也可能是错误的,但ss0应该是内核DS值0x18。当停止进程时,也将ss0设置为0x18。至于esp0,它应该是您要在执行中保留的esp(目前我所知道的)。

关于x86 - x86处理器清除IDTR并在'int $ 0x80'之后跳转到EIP 0xe05b,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29928991/

10-11 09:27