Operating system 处理器如何处理被零除的情况

Operating system 处理器如何处理被零除的情况,operating-system,signals,cpu,interrupt,interrupt-handling,Operating System,Signals,Cpu,Interrupt,Interrupt Handling,好奇处理器/CPU在英特尔CPU和Linux上执行零除指令时通常做什么。还有,如何将错误中继到应用程序,以便它可以记录错误或通知开发人员 谢谢大家! 以笼统的方式回答,而不是深入研究x86_64上Linux的血淋淋的细节,这些细节可能会模糊概念 CPU倾向于抛出异常中断,例如被零除或取消对空指针的引用。这些中断被捕获,就像硬件中断时,停止当前程序的执行,并将控制权返回操作系统,然后由操作系统处理事件。虽然这些操作非常依赖于环境,但通常程序可能会被终止,释放所有资源(内存、打开的文件)并生成内核转

好奇处理器/CPU在英特尔CPU和Linux上执行零除指令时通常做什么。还有,如何将错误中继到应用程序,以便它可以记录错误或通知开发人员


谢谢大家!

以笼统的方式回答,而不是深入研究x86_64上Linux的血淋淋的细节,这些细节可能会模糊概念

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

运行时可能能够配置一些东西,以便调用异常处理程序,可能脚本语言希望捕获整数除以0或整数溢出,然后抛出编程语言异常或生成诊断,以帮助程序员了解发生异常的位置和原因。另一种传统的可能性是发出一个信号,该信号可能被应用程序捕获并处理,或者导致终止

在某些RISC CPU上,操作系统中的软件陷阱会用来修复未对齐的数据访问,因此读取内存是可行的,但会带来性能损失。在过去,陷阱有时会被用来模拟已定义的指令,但这些指令不是由特定的CPU模型在硬件中实现的。我还看到记录了硬件内存错误,因为操作系统启动了ECC内存恢复操作,尽管在x86上处理方式有所不同


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

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

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

当“在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并继续运行,而不会停止进程。该进程已停止,将被删除-必须启动另一个进程,就像第一个一样;)

哪个处理器?哪个操作系统?@OliCharlesworth啊,刚刚编辑了这个问题。基本上,我只想大致了解整个过程的工作原理。我们可以假设它是英特尔cpu上的linux。是的,我们试图将它们与外设产生的中断区分开来,快速解释就可以了tricky@Rob11311“这些中断被捕获,比如硬件中断时,停止当前程序的执行,并将控制权返回操作系统”,因此所有这些都由cpu处理,也就是说,是通过硬件或固件实现的(因为此时操作系统没有控制权),对吗?是的,它是硬件。即使没有其他中断发生(外围设备或系统调用),OS调度器也可以通过调度计时器中断来重新获得控制权,因此实际上它只是将CPU借给用户程序。