处理器如何处理除零的情况

Alf*_*red 7 cpu operating-system signals interrupt interrupt-handling

很奇怪处理器/ CPU在执行除零指令时对intel cpu和Linux执行的操作.如何将错误中继到应用程序,以便它可以记录错误或通知开发人员?

谢谢!

Rob*_*311 11

一般来说,而不是在x86_64上进入Linux的血腥细节,这可能会掩盖这些概念.

CPU倾向于抛出异常中断,例如除零或取消引用NULL指针.这些中断被捕获,就像硬件中断一样,停止当前程序的执行并将控制权返回给操作系统,操作系统随后处理事件.虽然操作非常依赖于环境,但通常可以终止程序,释放所有资源(内存,打开文件)以及可选的核心转储/堆栈跟踪,以便在开发人员系统上进行调试.

运行时可能能够配置事物以便调用异常处理程序,也许脚本语言想要捕获整数除以0或整数溢出然后抛出编程语言异常或生成诊断以帮助程序员理解何处和原因,它发生了.提升可能被应用程序捕获并处理或导致终止的信号是另一种传统的可能性.

在某些RISC CPU上,OS中的软件陷阱会运行以修复未对齐的数据访问,因此读取内存会起作用,但性能会受到影响.过去,陷阱有时会用于模拟已定义的指令,但这些指令并非由特定CPU模型在硬件中实现.我还看到记录了硬件内存错误,因为操作系统启动了ECC内存恢复操作,尽管在x86上处理方式不同.

系统调用实际上使用相同的机制从用户空间应用程序跳转到OS内核,然后处理事件,因此是常用术语trap.


use*_*003 5

让我尝试以不同的方式回答这个问题。我使用过的每个处理器都定义了一个中断向量结构。在 Intel 芯片上,这种结构称为中断调度表 (IDT)。中断向量是指向函数的指针数组。数组中的每个条目对应一个特定事件(中断或异常(故障或陷阱))。

操作系统为每个事件设置函数(中断处理程序、异常处理程序)。当发生被零除时,会触发异常。CPU 通过调用与除以零相对应的中断向量中的异常处理程序来响应。在 Pentium 上,这是表中的第一个条目。