陷阱和中断有什么区别?

Dav*_*vid 143 x86 operating-system kernel interrupt cpu-architecture

陷阱和中断有什么区别?

如果不同系统的术语不同,那么它们在x86上意味着什么?

Aar*_*lla 185

陷阱是在用户进程异常.它是由零除或无效的内存访问引起的.它也是调用内核例程(系统调用)的常用方法,因为它们的优先级高于用户代码.处理是同步的(因此用户代码被暂停并在之后继续).从某种意义上说,它们是"活跃的" - 大多数时候,代码期望陷阱发生并依赖于这个事实.

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

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

  • 你是什​​么意思,"有点迷惑"?这非常令人困惑:-)这里的问题是除以零是硬件中断(IRQ /向量0),但内核开发人员有多种选择如何处理它.所以从用户进程来看,这是一个陷阱但是从CPU方面来说,这是一个中断.谁是对的?没有?都? (9认同)
  • 因为它确实是当ALU发现此问题时CPU发送的中断.就像分段错误一样.但是,并非所有数学错误都会导致中断(溢出不会). (7认同)
  • 有趣的是http://lxr.free-electrons.com/source/arch/x86/kernel/traps.c?v=2.6.29#L965除以零被初始化为硬件中断,为什么会这样呢? (4认同)
  • 那讲得通.但是,有些令人困惑的是,为什么在早期的Linux内核中它被初始化为软件陷阱:set_trap_gate(0,&divide_error); (3认同)
  • 当然,这仅适用于x86 CPU.其他CPU的工作方式不同. (2认同)
  • 好吧,我的问题是:如果 IDT 中的条目被初始化为具有 DPL=0 [set_trap_gate(0,÷_error)],那将意味着只有 CPL=0 代码可以使用该向量。那么用户空间除以 0 是如何处理的呢? (2认同)
  • 好问题。在那里帮不了你。为什么不在这里开一个新问题? (2认同)
  • 这正是我首先进入这个线程的方式:) http://stackoverflow.com/questions/8530794/why-linux-kernel-use-trap-gate-to-handle-divide-error-exception (2认同)
  • 仅当使用 int 指令调用软件中断时,才会查看 IDT 中的 DPL 位。除以零是由 CPU 触发的软件中断,因此在这种情况下 DPL 无效... (2认同)

rut*_*ord 90

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

英特尔x86定义了两个重叠类别:向量事件(中断异常)和异常类(故障陷阱中止).

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

矢量事件

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

异常和中断有一个ID,称为向量,用于确定处理器跳转到哪个中断处理程序.中断处理程序在中断描述符表中描述.

中断

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

例外

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

例外分类

异常分为故障,陷阱中止,具体取决于报告的方式以及是否可以重新启动导致异常的指令而不会丢失程序或任务连续性.

总结:陷阱增加指令指针,故障没有,并中止 '爆炸'.

陷阱

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

故障

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

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

退出

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

边缘案例

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

  • 这是一个很好的答案,我很肯定"新用户的迟到答复"审核队列正在给我一个测试,以确保我注意. (5认同)
  • 我认为这个答案最能描述它。它讨论了两者之间可能存在的模糊界限。并提到页面错误会导致 CPU 重新尝试一条指令,而陷阱会跳过该指令并继续前进。 (3认同)
  • 谢谢!这意味着对我很重要 :) (2认同)
  • 浏览了 [PPC](http://www.ibm.com/developerworks/systems/library/es-archguide-v2.html) 架构书,看起来它们的定义在很大程度上是重叠的。它们对边缘情况有了新的名称,并将异常视为中断的子类型,而不是不同类别的一部分。 (2认同)
  • 在[Alpha 架构参考手册](https://books.google.ru/books?id=aYioBQAAQBAJ) 中,他们写道:“异常有 3 种类型: 1. 故障是在指令期间发生的异常情况。 .. 从而消除故障条件并随后重新执行指令将给出正确的结果。...” 2. 算术陷阱[不重新执行陷阱指令]。3.同步陷阱(分为数据对齐陷阱和其他陷阱,例如Br​​eakPoint Trap、Illegal Instruction Trap、Generate Software Trap、Change Mode To Kernel Trap等) (2认同)

Che*_*har 8

一般来说,例外,故障,中止,陷阱中断等术语都是相同的,被称为"中断".

陷阱和中断之间的区别:

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

在哪里

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


Pau*_*l R 6

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

  • 一些作者(Tanenbaum)提到的"硬件陷阱"更让人感到困惑.如果我们可以有硬件陷阱和软件中断,显然这些定义相当混乱,可以采用任何一种方式,总是需要硬件或软件这两个词. (3认同)

Fra*_*ank 5

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