我有一个关于EXCEPTION_INT_OVERFLOW和EXCEPTION_INT_DIVIDE_BY_ZERO异常的问题.
Windows将陷阱IDIV指令生成的#DE错误,并将使用这两个代码之一终止生成和SEH异常.
我的问题是如何区分这两个条件? Intel手册中关于idiv的信息表明它会在“除以零”和“下溢情况”中生成#DE.
我快速浏览了intel手册第3卷中#DE错误的部分,最好的办法是操作系统必须解码DIV指令,加载除数参数,然后将其与零比较.
对我来说似乎有点疯狂.为什么芯片设计师不能使用某种标志来区分错误的2个原因?我觉得我一定是错过了一些东西.
有没有人知道操作系统如何区分2种不同的故障原因?
你的假设似乎是正确的. #DE上唯一可用的信息是CS和EIP,它给出了指令.由于两个状态码不同,OS必须解码该指令才能确定哪一个.
我还建议,芯片制造商在这种情况下不需要两个独立的中断,因为任何除以零的是无穷大的,这太大了,无法适应您的目的地寄存器.
至于“如何辨别”,所有知道这些知识的人都可能不被允许透露它,以防止人们利用它(不完全确定如何,但跳入内核模式是开始寻找的好地方利用)或基于可能更改而不通知的实施细节做出假设.
编辑:使用kd播放后,至少可以说在特定版本的Windows XP(32位)上,我可以访问(并且它正在运行的处理器),nt!Ki386CheckDivideByZeroTrap中断处理程序似乎解码了ModRM的值确定是否返回STATUS_INTEGER_DIVIDE_BY_ZERO或STATUS_INTEGER_OVERFLOW的指令.
(显然这是原始的研究,任何人都不保证,也可以匹配基于英特尔手册的扣除额.)