gpt4 book ai didi

assembly - 在除以零的中断处理程序中该怎么做?

转载 作者:行者123 更新时间:2023-12-02 22:16:06 27 4
gpt4 key购买 nike

操作系统中断处理程序应该如何处理与编码错误相关的中断?

例如,我尝试除以 0 来测试我的中断,但我的中断处理程序被调用。但是,由于 div 指令未成功执行,EIP 不会更新到其后的下一条指令,并且在使用 iret 从中断处理程序返回后,它会返回到错误的 div 再次指令。

  mov ax, 3
mov dl, 0
div dl ; go back here again and again

处理这个中断的正确方法是什么?我想到的几个办法:

  • dl 更改为 0 以外的其他值。但是,我不确定 dl 在发生情况时是否可以保留,并且中断例程应该退出后恢复寄存器,我不认为通过提供错误的计算来默默地纠正错误是好的。

  • 检索div之后的下一条指令。不过,我还没想到有什么简单可靠的方法来获取下一条指令。

  • 将当前包含返回地址的堆栈顶部修改为其他代码的地址。因此,我们不再返回 div 指令。

最佳答案

你是对的,在这种特殊中断的情况下,这些都不是特别好的事情。正如评论中提到的,由于您拥有指令的地址,因此您可以获取该地址处的任何内容,解码指令,然后将指针前进到下一个地址......但代码不会期望如此!

在 POSIX 操作系统中,SIGFPE 信号涵盖了这种异常行为。如果您正在编写操作系统并希望遵循 POSIX,那么您的中断处理程序应该将该信号发送到进程。如果进程有该信号的处理程序,则跳转到该处理程序并允许进程处理该信号(例如,这就是高级语言中的 try/catch block 的工作方式......现在您知道为什么异常很慢!)。如果没有信号处理程序,则应终止该进程(并重新输入调度程序以计算下一步要做什么......并希望它是 PID 1!)。

当然,这是您的操作系统,如果您不愿意,没有理由必须遵循 POSIX!如果您有其他一些奇特的方法来处理用户程序中的错误,那么您可以实现它。

关于assembly - 在除以零的中断处理程序中该怎么做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33029457/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com