ChatGPT解决这个技术问题 Extra ChatGPT

陷阱和中断有什么区别?

陷阱和中断有什么区别?

如果不同系统的术语不同,那么它们在 x86 上的含义是什么?


A
Aaron Digulla

trap 是用户进程中的异常。这是由零除或无效的内存访问引起的。这也是调用内核例程(system call)的常用方法,因为它们以比用户代码更高的优先级运行。处理是同步的(因此用户代码被暂停并在之后继续)。从某种意义上说,它们是“活跃的”——大多数时候,代码期望陷阱发生并依赖于这一事实。

interrupt 是由硬件(如硬盘、显卡、I/O 端口等设备)生成的。这些是异步的(即它们不会发生在用户代码中可预测的位置)或“被动”,因为中断处理程序必须等待它们最终发生。

您还可以将陷阱视为一种 CPU 内部中断,因为陷阱处理程序的处理程序看起来像一个中断处理程序(寄存器和堆栈指针被保存,有一个上下文切换,在某些情况下它停止执行可以恢复) .


有趣的是lxr.free-electrons.com/source/arch/x86/kernel/…除以零被初始化为硬件中断,为什么会这样?
因为它实际上是当 ALU 发现这个问题时 CPU 发送的中断。就像分段错误一样。不过,并非所有数学错误都会导致中断(溢出不会)。
那讲得通。但是,有点令人困惑的是,为什么在早期的 Linux 内核中它被初始化为一个软件陷阱: set_trap_gate(0,÷_error);
你是什么意思,“有点混乱”?这很令人困惑 :-) 这里的问题是除以零是硬件中断(IRQ/vector 0),但内核开发人员有多种选择如何处理它。因此,从用户进程来看,这是一个陷阱,但从 CPU 方面来看,这是一个中断。谁是对的?没有任何?两个都?
当然,这只适用于 x86 CPU。其他 CPU 的工作方式不同。
P
Peter Cordes

陷阱和中断密切相关。陷阱是异常的一种,异常类似于中断。

Intel x86 定义了两个重叠的类别,向量事件(中断 vs 异常)和异常类别(故障 vs 陷阱 vs 中止)。

这篇博文中的所有引述均来自 2016 年 4 月版的 Intel Software Developer Manual。对于(确定的和复杂的)x86 观点,我建议阅读 SDM 的中断和异常处理一章。

向量事件

向量事件(中断和异常)导致处理器在保存大部分处理器状态后跳转到中断处理程序(足以让以后可以从该点继续执行)。

异常和中断有一个 ID,称为向量,它决定处理器跳转到哪个中断处理程序。中断处理程序在中断描述符表中进行了描述。

中断

中断在程序执行期间随机发生,以响应来自硬件的信号。系统硬件使用中断来处理处理器外部的事件,例如服务外围设备的请求。软件也可以通过执行 INT n 指令来产生中断。

例外

当处理器在执行指令时检测到错误条件(例如被零除)时,就会发生异常。处理器检测各种错误情况,包括违反保护、页面错误和内部机器错误。

异常分类

异常根据报告的方式以及是否可以重新启动导致异常的指令而不会丢失程序或任务连续性,将异常分为故障、陷阱或中止。

摘要:陷阱增加指令指针,故障不增加,并中止“爆炸”。

陷阱

陷阱是在执行陷阱指令后立即报告的异常。陷阱允许继续执行程序或任务,而不会失去程序连续性。陷阱处理程序的返回地址指向陷阱指令之后要执行的指令。

过错

故障是一种通常可以纠正的异常,一旦纠正,就可以重新启动程序而不会失去连续性。当报告故障时,处理器将机器状态恢复到故障指令开始执行之前的状态。错误处理程序的返回地址(保存的 CS 和 EIP 寄存器的内容)指向错误指令,而不是指向错误指令之后的指令。

示例:页面错误通常是可以恢复的。应用程序的一部分地址空间可能已从 ram 换出到磁盘。应用程序在尝试访问已换出的内存时将触发页面错误。内核可以将该内存从磁盘拉到内存中,然后将控制权交还给应用程序。应用程序将继续它停止的地方(在访问换出内存的错误指令处),但这次内存访问应该成功而不会出现错误。

模拟浮点或其他缺失指令的非法指令故障处理程序在查看故障指令是否可以处理后,必须手动增加返回地址以获得所需的类似陷阱的行为。 x86 #UD 是“故障”,而不是“陷阱”。 (处理程序需要一个指向错误指令的指针来确定它是哪条指令。)

中止

中止是一种异常,它并不总是报告导致异常的指令的精确位置,并且不允许重新启动导致异常的程序或任务。中止用于报告严重错误,例如硬件错误和系统表中的不一致或非法值。

边缘案例

软件调用的中断(由 INT 指令触发)以类似陷阱的方式运行。该指令在处理器保存其状态并跳转到中断处理程序之前完成。


这是一个很好的答案,我很肯定“新用户的迟到的答案”审查队列正在给我一个测试,以确保我在关注。
谢谢!这意味着对我很重要 :)
浏览了 PPC 架构书,看起来它们的定义在很大程度上是重叠的。它们为边缘情况使用了新名称,并将异常视为中断的子类型,而不是不同类别的一部分。
我认为这个答案最好地描述了它。它讨论了两者之间可能存在的模糊界限。并提到页面错误会导致 CPU 重新尝试指令,陷阱会跳过指令并继续前进。
Alpha Architecture Reference Manual 中,他们写道:“有 3 种异常类型:1. 故障是在指令期间发生的异常情况……这样消除故障情况并随后重新执行指令将给出正确的结果......” 2. 算术陷阱[不重新执行陷阱指令]。 3. 同步陷阱(分为数据对齐陷阱和其他,例如断点陷阱、非法指令陷阱、生成软件陷阱、更改模式到内核陷阱等)
C
Cheshar

一般来说,异常、故障、中止、陷阱和中断等术语的含义相同,称为“中断”。

来看看陷阱和中断之间的区别:

陷阱:是程序员发起并期望将控制权转移到特殊的处理程序例程。 (例如:80x86 INT 指令就是一个很好的例子)

然而

中断(硬件):是基于CPU外部的外部硬件事件的程序控制中断(例如:按下键盘上的键或定时器芯片上的超时)


很好的定义。资源?
P
Paul R

陷阱是一种特殊的中断,通常称为软件中断。中断是一个更通用的术语,涵盖硬件中断(来自硬件设备的中断)和软件中断(来自软件的中断,例如陷阱)。


一些作者(Tanenbaum)提到“硬件陷阱”,这让事情更加混乱。如果我们可以有硬件陷阱和软件中断,那么显然这些定义是相当混乱的,并且可以采用任何一种方式,总是需要硬件或软件这个词。
F
Frank

陷阱由类似程序的代码调用,例如用于调用 OS 例程(即通常是同步的)。中断由事件调用(很多时候是硬件,如接收到数据的网卡或 CPU 定时器),并且 - 顾名思义 - 中断正常的控制流,因为 CPU 必须切换到驱动程序来处理事件。


c
chetan pawar

我认为陷阱是由当前指令的执行引起的,因此它们被称为同步事件。其中中断是由处理器中运行的与外部事件相关的独立指令引起的,因此称为异步指令。


A
Anamik Sarvaiya

中断是硬件中断,而陷阱是软件调用的中断。硬件中断的发生通常会禁用其他硬件中断,但陷阱并非如此。如果您需要在提供陷阱之前禁止硬件中断,则需要明确清除中断标志。通常计算机上的中断标志会影响(硬件)中断,而不是陷阱。这意味着清除此标志不会阻止陷阱。与陷阱不同,中断应该保留 CPU 的先前状态。


D
Dinesh Reddy

中断是系统内由硬件产生的流量变化。调用中断处理程序来处理中断的原因;然后将控制返回到中断的上下文和指令。陷阱是软件生成的中断。中断可用于指示 I/O 的完成,以避免设备轮询的需要。陷阱可用于调用操作系统例程或捕获算术错误。


S
Sanketssj5

陷阱是一种软件中断。如果您编写的程序中声明了一个除以零值的变量,那么它将被视为陷阱。每当您运行该程序时,它都会同时抛出相同的错误。系统调用是特殊版本的陷阱,其中程序向操作系统请求其所需的服务。如果发生中断(硬件中断的通用词),如 i/o 错误,cpu 会随机中断,当然这不是我们程序员的错。是硬件导致了它们。


你能解释一下系统调用是一个陷阱吗?
系统调用需要从用户模式切换到内核模式。包装系统调用陷阱的库调用会向内核发出此开关的信号,因此它可能会在寄存器中查找用户空间将为系统调用传递数据的位置。
E
Exploring Bits

陷阱可以识别为由程序员发起的控制转移。术语陷阱可与术语异常(自动发生的软件中断)互换使用。但有些人可能会争辩说,陷阱只是一个特殊的子程序调用。因此它们属于软件调用中断的类别。例如,在 80×86 机器中,程序员可以使用 int 指令来启动陷阱。因为陷阱总是无条件的,所以控制总是被转移到与陷阱相关的子程序。调用用于处理陷阱的例程的确切指令很容易识别,因为使用显式指令来指定陷阱。 Trap Vs Interrupt


术语可能会有所不同。例如 gcc -ftrapping-math 告诉它(尝试不成功地)优化以使结果与 C 抽象机匹配,即使诸如除以 0 之类的事情运行信号处理程序也是如此。 (即捕获 FP 异常)。但术语取决于供应商的文档。尽管如此,在 Intel 上,int 0x?? 并不是唯一的陷阱方法。 Difference between TRAP , software interrupts and hardware interrupts? 表示 div by zero(#DE 异常)之类的东西也是一个陷阱。关于这个问题的公认答案也这么说。
您在英特尔手册中是否有声称陷阱始终是“故意的”的来源,即来自始终陷阱而不是依赖于数据的指令?或者我猜你并没有在那里提出强烈的主张,只是说“有些人可能会争论”。顺便说一句,我不确定 Andy Glew(英特尔 P6 的架构师之一)是否在他对 When an interrupt occurs, what happens to instructions in the pipeline? 的回答中使用英特尔特定术语或更通用的术语,他同时使用术语“陷阱”和“异常”来拥有具体含义。