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

x86处理器在'之后清除IDTR并跳转到EIP 0xe05b;整数$0x80';,x86,operating-system,kernel,interrupt-handling,X86,Operating System,Kernel,Interrupt Handling,我正在为x86处理器创建一个操作系统,并在用户空间中执行一个程序(已启用分页)。就在程序进行系统调用('int$0x80')之前,IDTR指向我的IDT,0x80的条目正确指向我想要执行的函数。在gdb中,在“si”之后,处理器在地址0xe05b处结束,IDTR完全清除(设置为0) 请注意,在进入用户空间之前,“int$0x80”调用工作正常,它将进入我的函数调用。在执行人工iret以访问用户空间后,下一个“int$0x80”会导致这种奇怪的行为 如果有帮助的话,这一切都是在我对文件系统代码进行

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

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

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

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

有人知道是什么导致处理器这样做吗


提前谢谢

我假设您正在bochs下调试。看起来正在发生的事情是CPU出现了三重故障,导致它重新启动。f000:e05b是bochs启动时调试器在BIOS中中断的地址

可能发生的情况是,您的IDT在某种程度上是无效的,这会阻止从用户模式发送中断。这会导致引发其他一些异常(可能是一般保护故障或双重故障异常)。如果该异常的IDT无效,则CPU会放弃,并通过重置自身来处理三重故障


您应该检查您的IDT是否可以从用户模式进行呼叫。

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

欢迎使用StackOverflow,您可能需要在阅读之前阅读。考虑花时间格式化你的答案以便于读者理解。