陷阱和中断有什么区别?
如果不同系统的术语不同,那么它们在 x86 上的含义是什么?
陷阱是用户进程中的异常。这是由零除或无效的内存访问引起的。这也是调用内核例程(系统调用)的常用方法,因为它们以比用户代码更高的优先级运行。处理是同步的(因此用户代码被暂停并在之后继续)。从某种意义上说,它们是“活跃的”——大多数时候,代码期望陷阱发生并依赖于这一事实。
中断是由硬件(如硬盘、显卡、I/O 端口等设备)产生的。这些是异步的(即它们不会发生在用户代码中可预测的位置)或“被动”,因为中断处理程序必须等待它们最终发生。
您还可以将陷阱视为一种 CPU 内部中断,因为陷阱处理程序的处理程序看起来像一个中断处理程序(寄存器和堆栈指针被保存,有一个上下文切换,在某些情况下它停止执行可以恢复) .
陷阱和中断密切相关。陷阱是异常的一种,异常类似于中断。
Intel x86 定义了两个重叠的类别,向量事件(中断vs异常)和异常类别(故障vs陷阱vs中止)。
本文中的所有引用均来自 2016 年 4 月版的英特尔软件开发人员手册。对于(确定的和复杂的)x86 观点,我建议阅读 SDM 的中断和异常处理一章。
向量事件(中断和异常)导致处理器在保存大部分处理器状态后跳转到中断处理程序(足以让以后从该点继续执行)。
异常和中断有一个 ID,称为向量,它决定处理器跳转到哪个中断处理程序。中断处理程序在中断描述符表中进行了描述。
中断在程序执行期间随机发生,以响应来自硬件的信号。系统硬件使用中断来处理处理器外部的事件,例如服务外围设备的请求。软件也可以通过执行 INT n 指令来产生中断。
当处理器在执行指令时检测到错误条件(例如被零除)时,就会发生异常。处理器检测各种错误情况,包括违反保护、页面错误和内部机器错误。
异常根据报告的方式以及导致异常的指令是否可以在不丢失程序或任务连续性的情况下重新启动,分为故障、陷阱或中止。
陷阱是在执行陷阱指令后立即报告的异常。陷阱允许继续执行程序或任务,而不会失去程序连续性。陷阱处理程序的返回地址指向陷阱指令之后要执行的指令。
故障是一种通常可以纠正的异常,一旦纠正,就可以重新启动程序而不会失去连续性。当报告故障时,处理器将机器状态恢复到故障指令开始执行之前的状态。错误处理程序的返回地址(保存的 CS 和 EIP 寄存器的内容)指向错误指令,而不是指向错误指令之后的指令。
示例:页面错误通常是可以恢复的。应用程序的一部分地址空间可能已从 ram 换出到磁盘。应用程序在尝试访问已换出的内存时将触发页面错误。内核可以将该内存从磁盘拉到内存中,然后将控制权交还给应用程序。应用程序将继续它停止的地方(在访问换出内存的错误指令处),但这次内存访问应该成功而不会出现错误。
模拟浮点或其他缺失指令的非法指令故障处理程序在查看故障指令是否可以处理后,必须手动增加返回地址以获得所需的类似陷阱的行为。x86#UD
是“故障”,而不是“陷阱”。(处理程序需要一个指向错误指令的指针来确定它是哪条指令。)
中止是一种异常,它并不总是报告导致异常的指令的精确位置,并且不允许重新启动导致异常的程序或任务。中止用于报告严重错误,例如硬件错误和系统表中的不一致或非法值。
软件调用的中断(由 INT 指令触发)以类似陷阱的方式运行。该指令在处理器保存其状态并跳转到中断处理程序之前完成。
一般来说,异常、故障、中止、陷阱和中断等术语的含义相同,称为“中断”。
来看看陷阱和中断之间的区别:
陷阱:是程序员发起并期望将控制权转移到特殊的处理程序例程。(例如:80x86 INT指令就是一个很好的例子)
然而
中断(硬件):是基于CPU外部的外部硬件事件的程序控制中断(例如:按下键盘上的键或定时器芯片上的超时)
陷阱是一种特殊的中断,通常称为软件中断。中断是一个更通用的术语,涵盖硬件中断(来自硬件设备的中断)和软件中断(来自软件的中断,例如陷阱)。
陷阱由类似程序的代码调用,例如用于调用 OS 例程(即通常是同步的)。中断由事件调用(很多时候是硬件,如接收到数据的网卡或 CPU 定时器),并且 - 顾名思义 - 中断正常的控制流,因为 CPU 必须切换到驱动程序来处理事件。
我认为陷阱是由当前指令的执行引起的,因此它们被称为同步事件。其中中断是由处理器中运行的与外部事件相关的独立指令引起的,因此称为异步指令。
中断是硬件中断,而陷阱是软件调用的中断。硬件中断的发生通常会禁用其他硬件中断,但陷阱并非如此。如果您需要在提供陷阱之前禁止硬件中断,则需要明确清除中断标志。通常计算机上的中断标志会影响(硬件)中断,而不是陷阱。这意味着清除此标志不会阻止陷阱。与陷阱不同,中断应该保留 CPU 的先前状态。
中断是系统内由硬件产生的流量变化。调用中断处理程序来处理中断的原因;然后将控制返回到中断的上下文和指令。陷阱是软件生成的中断。中断可用于指示 I/O 的完成,以避免设备轮询的需要。陷阱可用于调用操作系统例程或捕获算术错误。
陷阱是一种软件中断。如果您编写的程序中声明了一个除以零值的变量,那么它将被视为陷阱。每当您运行该程序时,它都会同时抛出相同的错误。系统调用是特殊版本的陷阱,其中程序向操作系统请求其所需的服务。如果发生中断(硬件中断的通用词),如 i/o 错误,cpu 会在随机时间中断,当然这不是我们程序员的错。是硬件导致了它们。
陷阱可以识别为由程序员发起的控制转移。术语陷阱可与术语异常(自动发生的软件中断)互换使用。但有些人可能会争辩说,陷阱只是一个特殊的子程序调用。因此它们属于软件调用中断的类别。例如,在 80×86 机器中,程序员可以使用 int 指令来启动陷阱。因为陷阱总是无条件的,所以控制总是被转移到与陷阱相关的子程序。调用用于处理陷阱的例程的确切指令很容易识别,因为使用显式指令来指定陷阱。陷阱与中断