gpt4 book ai didi

windows - Win32 EXCEPTION_INT_OVERFLOW 与 EXCEPTION_INT_DIVIDE_BY_ZERO

转载 作者:可可西里 更新时间:2023-11-01 12:41:36 29 4
gpt4 key购买 nike

我对 EXCEPTION_INT_OVERFLOW 和 EXCEPTION_INT_DIVIDE_BY_ZERO 异常有疑问。

Windows 将捕获由 IDIV 指令生成的 #DE 错误,并最终使用这两个代码之一生成 SEH 异常。

我的问题是它如何区分这两种情况? Intel手册中关于idiv的信息表明它会在“被零除”和“下溢情况”下生成#DE。

我快速浏览了 intel 手册第 3 卷中关于 #DE 错误的部分,我能收集到的最好的信息是操作系统必须解码 DIV 指令,加载除数参数,然后进行比较归零。

虽然我觉得这有点疯狂。为什么芯片设计者不使用某种标志来区分错误的 2 个原因?我觉得我一定错过了什么。

有谁确切知道操作系统如何区分这两种不同的故障原因?

最佳答案

您的假设似乎是正确的。 #DE 上唯一可用的信息是 CS 和 EIP,它们给出了说明。由于两个状态代码不同,操作系统必须解码指令以确定哪个。

我还建议芯片制造商在这种情况下实际上不需要两个单独的中断,因为任何东西除以零都是无穷大,这太大而无法放入目标寄存器。

至于“确切地知道”它是如何区分的,所有知道的人可能都不允许透露它,或者是为了防止人们利用它(不完全确定如何,但跳入内核模式是一个很好的地方开始寻求利用)或根据可能会更改的实现细节做出假设,恕不另行通知。


编辑: 在玩过 kd 之后,我至少可以说,在特定版本的 Windows XP(32 位)上,我可以访问(以及运行它的处理器)nt!Ki386CheckDivideByZeroTrap 中断处理程序似乎解码指令的 ModRM 值以确定是否返回 STATUS_INTEGER_DIVIDE_BY_ZEROSTATUS_INTEGER_OVERFLOW

(显然这是原创研究,并不能在任何地方得到任何人的保证,也恰好符合英特尔的手册可以推导出来的推论。)

关于windows - Win32 EXCEPTION_INT_OVERFLOW 与 EXCEPTION_INT_DIVIDE_BY_ZERO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4999222/

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