陷阱和中断有什么区别?


Answers:


203

陷阱是在用户进程异常。这是由零除或无效的内存访问引起的。这也是调用内核例程(系统调用)的常用方法,因为它们的运行优先级高于用户代码。处理是同步的(因此用户代码将被挂起并随后继续)。从某种意义上说,它们是“活动的”-在大多数情况下,代码期望陷阱发生并依赖于此事实。

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

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


5
有趣的是,将lxr.free-electrons.com/source/arch/x86/kernel/…除以零初始化为硬件中断,为什么会这样呢?
亚历克斯·克雷默

8
因为这确实是当ALU发现此问题时CPU发送的中断。就像分割错误一样。并非所有的数学错误都会引起中断(不会造成溢出)。
亚伦·迪古拉

4
这就说得通了。但是,令人困惑的是,为什么在早期的Linux内核中将其初始化为软件陷阱:set_trap_gate(0,&divide_error);
Alex Kreimer

11
您是什么意思,“ 有点令人困惑”?这非常令人困惑:-)这里的问题是,被零除是硬件中断(IRQ /向量0),但是内核开发人员有几种选择方式来处理它。因此,从用户进程来看,这是一个陷阱,但从CPU方面来说,这是一个中断。谁是对的?没有?都?
亚伦·迪古拉

3
当然,这仅适用于x86 CPU。其他CPU的工作方式不同。
亚伦·迪古拉

110

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

英特尔x86定义了两个重叠的类别,即矢量事件(中断异常)和异常类(故障陷阱中止)。

这篇文章中所有引用均来自2016年4月版的《英特尔软件开发人员手册》。对于(确定的和复杂的)x86透视图,我建议阅读SDM关于中断和异常处理的章节。

向量化事件

向量化事件(中断异常)导致处理器在保存了处理器的大部分状态后跳入了中断处理程序(足够长的时间以便以后可以从该点继续执行)。

异常和中断具有一个称为矢量的ID,该ID确定处理器跳转到哪个中断处理程序。中断描述符表中描述了中断处理程序。

中断

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

例外情况

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

异常分类

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

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

陷阱

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

故障

故障是通常可被纠正的异常,并认为,一旦校正,允许程序与没有连续性的损失被重新启动。当报告故障时,处理器将机器状态恢复为开始执行故障指令之前的状态。故障处理程序的返回地址(CS和EIP寄存器的保存内容)指向故障指令,而不是故障指令之后的指令。

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

中止

一个中止是一个例外,它并不总是报告指示的精确位置造成的例外,不允许引起异常的程序或任务的重新启动。中止用于报告严重错误,例如硬件错误以及系统表中的不一致或非法值。

边缘案例

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


6
这是一个很好的答案,我很肯定“来自新用户的最新答案”审查队列正在对我进行测试,以确保我得到关注。
Noumenon

1
谢谢!这对我来说意味着很多:)
ruthafjord

对于x86,这是一个很好的答案。这个问题最初很笼统,没有提到x86。我进行了编辑以尝试保持平衡。也许您可以在此答案的顶部添加另一段内容,以解决x86世界之外的术语问题?和/或对问题进行其他编辑,如果您认为我做得更糟:PI只知道x86自己,但希望其他系统确实使用非常相似的术语,您可以这样说:)
Peter Cordes

1
浏览了PPC体系结构书,看起来它们的定义在很大程度上是重叠的。它们为边缘情况指定了新名称,并且将异常视为中断的子类型,而不是不同类别的一部分。
ruthafjord '16

1
我认为这个答案最能说明问题。它讨论了两者之间可能存在的模糊线。并提到页面错误会导致CPU重新尝试执行一条指令,陷阱将跳过该指令并继续前进。
in70x

9

一般而言,异常,故障,中止,陷阱中断之类的术语都具有相同的含义,并称为“中断”。

陷阱与中断之间的区别:

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

在哪里

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


好的定义。资源?
alexlomba87

6

一个陷阱是一种特殊的中断也就是通常被称为软件中断。的中断是覆盖两个更一般的术语硬件中断(来自硬件设备中断)和软件中断(来自软件中断,如陷阱)。


4
甚至有些作者(Tanenbaum)提到“硬件陷阱”,这使事情更加混乱。如果我们可以有硬件陷阱和软件中断,那么显然定义是相当混乱的,可以任意选择,总是需要硬件或软件一词。
2012年

3

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


2

中断是系统内硬件产生的流量变化。召唤一个中断处理程序来处理中断原因。然后控制返回到中断的上下文和指令。陷阱是软件生成的中断。可以使用中断来发出I / O完成的信号,从而消除对设备轮询的需要。陷阱可用于调用操作系统例程或捕获算术错误。


2

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


2

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


1

陷阱是软件中断,如果您编写一个程序,在其中声明一个被零除的变量,则该陷阱将被视为陷阱。每当您运行该程序时,它将同时引发相同的错误。系统调用是陷阱的特殊版本,程序在其中向os要求其提供所需的服务。如果发生诸如I / O错误之类的中断(通常是硬件中断的意思),则CPU会在随机时间中断,这当然不是程序员的错,而是由硬件引起的。


1
您能解释一下系统调用是一个陷阱吗?
Radha Gogia
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.