好奇处理器/ CPU一般所做的事情,或者说,在intel cpu& Linux,当它执行除零指令时。此外,如何将错误中继到应用程序,以便它可以记录错误或通知开发人员?
谢谢!
答案 0 :(得分:10)
回答一般性问题,而不是在x86_64上讨论Linux的血腥细节,这可能会掩盖这些概念。
CPU倾向于抛出异常中断,例如除零或解除引用NULL指针。这些中断被捕获,就像硬件中断一样,停止当前程序的执行并将控制权返回给操作系统,操作系统随后处理事件。虽然这些操作非常依赖于环境,但通常可以终止程序,释放所有资源(内存,打开文件)以及为开发人员系统上的调试目的而生成的核心转储/堆栈跟踪。
运行时可能能够配置事物以便调用异常处理程序,也许脚本语言希望捕获整数除以0或整数溢出然后抛出编程语言异常或生成诊断以帮助程序员理解where& ;为什么,它发生了。提出可能被应用程序捕获并处理或导致终止的信号是另一种传统的可能性。
在某些RISC CPU上,操作系统中的软件陷阱会运行以修复未对齐的数据访问,因此读取内存会起作用,但性能会受到影响。过去,陷阱有时会用于模拟已定义的指令,但这些指令并非由特定CPU模型在硬件中实现。我还发现硬件内存错误已记录,因为操作系统启动了ECC内存恢复操作,但在x86上处理方式不同。
系统调用实际上使用相同的机制从用户空间应用程序跳转到操作系统内核,然后处理事件,因此使用公共术语trap
。
答案 1 :(得分:3)
让我尝试以不同的方式回答这个问题。我使用的每个处理器都定义了一个中断向量结构。在Intel芯片上,这种结构称为中断调度表(IDT)。中断向量是指向函数的指针数组。数组中的每个条目对应于特定事件(中断或异常(故障或陷阱))。
操作系统为每个事件设置功能(中断处理程序,异常处理程序)。当除以零时,它会触发异常。 CPU通过调用对应于除零的中断向量中的异常处理程序来响应。在Pentium上,这是表中的第一个条目。
答案 2 :(得分:0)
当“在CPU中”发生DIV0错误时,应用程序将无法记录任何内容(除非某些子进程正在管理)。
DIV0几乎不会在CPU中发生,它会被捕获:
$ echo $(( 1/0 ))
bash: 1/0 : division by 0 (error token is "0 ")
这不是证明-可能是日志。但是它以bash:
开头,并且意识到有问题的令牌"0 "
中的空间。
在奔腾上,这是表格中的第一项。
User33以此结束他的详细描述。由于调度程序的问题,我来到了这里,在这里我以CPU中的DIV0为例说明了该过程的一个(突然的)“块”(更好的是:停止)。我的观点是:CPU遵循传统和逻辑,拒绝除以零,包括任何廉价的骇客。根据定义,这是一个句号。不应发生,但如果不发生,则不会再处理任何指令。而是使用非常特殊的第一项。特殊,因为这是CPU引发“无法继续”异常的最简单情况。
没有保护模式,cpu中的div0会导致系统崩溃。但是由于有了这些特殊的存放表和功能,在保护模式下,内核/调度程序可以重新启动CPU并继续运行而无需停止进程。这个过程已经死了,将被删除-与第一个一样,另一个过程必须开始;)