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