Trap和中断的区别是什么?
如果术语对于不同的系统是不同的,那么它们在x86上意味着什么?
Trap和中断的区别是什么?
如果术语对于不同的系统是不同的,那么它们在x86上意味着什么?
trap是用户进程中的异常。这是由除零或无效内存访问引起的。这也是调用内核例程(系统调用)的常用方法,因为内核例程的优先级高于用户代码。处理是同步的(因此用户代码被挂起,然后继续)。在某种意义上,它们是“活跃的”——大多数时候,代码期望陷阱发生并依赖于这一事实。
中断是由硬件(硬盘、显卡、I/O端口等设备)产生的。它们是异步的(即它们不会发生在用户代码中可预测的位置)或“被动的”,因为中断处理程序必须等待它们最终发生。
你也可以把一个陷阱看作是一种cpu内部中断,因为陷阱处理程序的处理程序看起来像一个中断处理程序(寄存器和堆栈指针被保存,有一个上下文切换,在某些情况下可以继续执行)。
一个trap被像程序一样的代码调用,并用于例如调用操作系统例程(通常是同步的)。 中断是由事件调用的(很多时候是硬件,比如网卡接收到数据,或者CPU定时器),并且-顾名思义-中断正常的控制流,因为CPU必须切换到驱动程序来处理事件。
一般来说,像异常、错误、中止、陷阱和中断这样的术语都是指同样的事情,都被称为“中断”。
来看看Trap和Interrupt的区别:
陷阱:程序员发起并期望将控制转移到一个特殊的处理程序例程。(例如:80x86 INT指令是一个很好的例子)
而
中断(硬件):是基于CPU外部硬件事件的程序控制中断(例如:按键盘上的一个键或计时器上的超时 芯片)
中断是系统内硬件生成的流变化。一个中断 处理器被调用来处理中断的原因;控件然后返回到 中断的上下文和指令。trap是软件生成的中断。中断可以 用于标志一个I/O的完成,以避免设备轮询的需要。陷阱可以是 用于调用操作系统例程或捕捉算术错误。
A trap is a software interrupt.If you write a program in which you declare a variable having divide by zero value then it is treated as a trap.Whenever you run this program it will throw same error at the same time.System call is a special version of trap in which a program asks os for its required service. In case of interrupt(a general word for hardware interrupts)like an i/o error,the cpu is interrupted at random time and off course it is not the fault of our programmers.It is the hardware that brings them up.
Interrupts are hardware interrupts, while traps are software-invoked interrupts. Occurrences of hardware interrupts usually disable other hardware interrupts, but this is not true for traps. If you need to disallow hardware interrupts until a trap is served, you need to explicitly clear the interrupt flag. And usually the interrupt flag on the computer affects (hardware) interrupts as opposed to traps. This means that clearing this flag will not prevent traps. Unlike traps, interrupts should preserve the previous state of the CPU.
陷阱和中断密切相关。trap是一种异常,异常类似于中断。
Intel x86定义了两个重叠的类别,矢量事件(中断vs异常)和异常类(错误vs陷阱vs中止)。
本文中的所有引用都来自2016年4月版的英特尔软件开发人员手册。对于(明确和复杂的)x86视角,我建议阅读SDM关于中断和异常处理的章节。
定向事件
矢量事件(中断和异常)导致处理器在保存了大量处理器状态(足够多的状态可以在以后继续执行)后跳转到中断处理程序。
异常和中断有一个ID,称为向量,它决定处理器跳转到哪个中断处理程序。中断处理程序在中断描述符表中描述。
中断
中断在程序执行期间随机发生,以响应来自硬件的信号。系统硬件使用 中断来处理处理器外部的事件,例如 请求服务外围设备。软件也可以生成 通过执行INT n指令中断。
异常
当处理器检测到错误条件时,将发生异常 执行指令,如除零。处理器 检测各种错误条件,包括违反保护, 页面故障和内部机器故障。
异常的分类
异常被分类为错误、陷阱或中止,这取决于它们被报告的方式以及指令是否 导致的异常可以重新启动,而不会丢失程序或 任务的连续性。
总结:陷阱增加指令指针,错误不增加,并且中止“爆炸”。
Trap
告警后立即报告的异常 捕获指令的执行。陷阱允许执行 在不丧失程序连续性的情况下继续执行的程序或任务。 陷阱处理程序的返回地址指向的指令 在捕获指令之后执行。
的错
错误是一种例外,通常可以被纠正, 一旦纠正,允许程序重新启动没有损失 连续性。当报告错误时,处理器恢复 方法开始执行之前的状态 错误指令。返回地址(保存的CS和 EIP寄存器)用于错误处理程序指向故障 指令,而不是到指令后面出错 指令。
示例:页面错误通常是可恢复的。应用程序的地址空间的一部分可能已经从ram交换到磁盘。当应用程序试图访问被换出的内存时,它将触发一个页面错误。内核可以将内存从磁盘拉到ram,并将控制权交还给应用程序。应用程序将继续它离开的地方(在正在访问交换内存的错误指令处),但这一次内存访问应该成功,而不会发生故障。
模拟浮点或其他缺失指令的非法指令错误处理程序必须手动增加返回地址,以获得它所需要的类似陷阱的行为,在查看错误指令是否可以处理之后。x86 #UD是一个“错误”,而不是“陷阱”。(处理程序需要一个指向出错指令的指针,以确定出错指令是哪条指令。)
流产
中止是一种异常,它不总是报告精确的 导致异常的指令的位置,并且不允许 重新启动导致异常的程序或任务。中止是 用于上报严重错误,如硬件错误、不一致等 或者系统表中的非法值。
边界情况
软件调用的中断(由INT指令触发)以类似陷阱的方式运行。指令在处理器保存状态并跳转到中断处理程序之前完成。
A Trap can be identified as a transfer of control, which is initiated by the programmer. The term Trap is used interchangeably with the term Exception (which is an automatically occurring software interrupt). But some may argue that a trap is simply a special subroutine call. So they fall in to the category of software-invoked interrupts. For example, in 80×86 machines, a programmer can use the int instruction to initiate a trap. Because a trap is always unconditional the control will always be transferred to the subroutine associated with the trap. The exact instruction, which invokes the routine for handling the trap is easily identified because an explicit instruction is used to specify a trap. Trap Vs Interrupt