操作系统中断处理程序应该如何处理与编码错误相关的中断?
例如,我尝试除以 0 来测试我的中断,但我的中断处理程序被调用。然而,由于 div 指令没有成功执行,EIP 不会更新到它之后的下一条指令以及从中断处理程序返回后iret
,它又回到了错误的地方div
再次指导。
mov ax, 3
mov dl, 0
div dl ; go back here again and again
处理这个中断的正确方法是什么?我想到的几个办法:
Change dl
到 0 以外的其他值。但是,我不确定是否dl
如果发生事情,可以保留,并且中断例程应该在退出后恢复寄存器,并且我不认为通过提供错误的计算来默默地纠正错误是好的。
之后检索下一条指令div
。不过,我还没有想到有什么简单可靠的方法来获取下一步的指令。
将当前包含返回地址的堆栈顶部修改为其他代码的地址。所以,我们不再回到过去div
不再指导。
你是对的,在这种特殊中断的情况下,这些都不是特别好的事情。正如评论中提到的,由于您拥有指令的地址,因此您可以获取该地址处的任何内容,解码指令,然后将指针前进到下一个地址......但代码不会期望如此!
在 POSIX 操作系统中,SIGFPE 信号涵盖了这种异常行为。如果您正在编写操作系统并希望遵循 POSIX,那么您的中断处理程序应该将该信号发送到进程。如果进程有该信号的处理程序,则跳转到该处理程序并允许进程处理该信号(例如,这就是高级语言中的 try/catch 块的工作方式......现在您知道为什么异常很慢!)。如果没有信号处理程序,则应终止该进程(并重新输入调度程序以计算下一步要做什么......并希望它是 PID 1!)。
当然,这是您的操作系统,如果您不愿意,没有理由必须遵循 POSIX!如果您有其他一些奇特的方法来处理用户程序中的错误,那么您可以实现它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)