Answers:
甲陷阱是在用户进程异常。这是由零除或无效的内存访问引起的。这也是调用内核例程(系统调用)的常用方法,因为它们的运行优先级高于用户代码。处理是同步的(因此用户代码将被挂起并随后继续)。从某种意义上说,它们是“活动的”-在大多数情况下,代码期望陷阱发生并依赖于此事实。
一个中断是由硬件(如硬盘设备,显卡,I / O端口等)产生的东西。这些是异步的(即它们不会在用户代码中的可预测位置发生)或“被动”的,因为中断处理程序必须等待它们最终发生。
您还可以将陷阱视为一种CPU内部中断,因为陷阱处理程序的处理程序看起来像是中断处理程序(保存了寄存器和堆栈指针,存在上下文切换,在某些情况下它可以停止执行可以恢复执行) 。
陷阱和中断密切相关。陷阱是一种异常,异常类似于中断。
英特尔x86定义了两个重叠的类别,即矢量事件(中断与异常)和异常类(故障与陷阱与中止)。
这篇文章中所有引用均来自2016年4月版的《英特尔软件开发人员手册》。对于(确定的和复杂的)x86透视图,我建议阅读SDM关于中断和异常处理的章节。
向量化事件(中断和异常)导致处理器在保存了处理器的大部分状态后跳入了中断处理程序(足够长的时间以便以后可以从该点继续执行)。
异常和中断具有一个称为矢量的ID,该ID确定处理器跳转到哪个中断处理程序。中断描述符表中描述了中断处理程序。
响应于来自硬件的信号,在程序执行期间的随机时间发生中断。系统硬件使用中断来处理处理器外部的事件,例如对服务外围设备的请求。软件还可以通过执行INT n指令来产生中断。
当处理器在执行一条指令时检测到错误情况时,就会发生异常,例如被零除。处理器检测各种错误情况,包括保护冲突,页面错误和机器内部错误。
根据异常的报告方式以及引起异常的指令是否可以重新启动而不会丢失程序或任务的连续性,将异常分为错误,陷阱或中止。
摘要:陷阱会增加指令指针,错误不会增加,并中止 “爆炸”。
甲陷阱是俘获指令的执行之后立即报告一个异常。陷阱允许继续执行程序或任务,而不会丢失程序的连续性。陷阱处理程序的返回地址指向陷阱指令之后要执行的指令。
甲故障是通常可被纠正的异常,并认为,一旦校正,允许程序与没有连续性的损失被重新启动。当报告故障时,处理器将机器状态恢复为开始执行故障指令之前的状态。故障处理程序的返回地址(CS和EIP寄存器的保存内容)指向故障指令,而不是故障指令之后的指令。
示例:页面错误通常是可恢复的。一个应用程序的地址空间可能已从ram换出到磁盘。当应用程序尝试访问换出的内存时,将触发页面错误。内核可以将该内存从磁盘拉到ram,然后将控制权交还给应用程序。该应用程序将从中断处继续(在正在访问换出内存的故障指令处),但是这次内存访问应该成功而不会出现故障。
一个中止是一个例外,它并不总是报告指示的精确位置造成的例外,不允许引起异常的程序或任务的重新启动。中止用于报告严重错误,例如硬件错误以及系统表中的不一致或非法值。
软件调用的中断(由INT指令触发)的行为类似于陷阱。该指令在处理器保存其状态并跳转到中断处理程序之前完成。
一般而言,异常,故障,中止,陷阱和中断之类的术语都具有相同的含义,并称为“中断”。
陷阱与中断之间的区别:
陷阱:是程序员发起并希望将控制权转移到特殊的处理程序例程。(例如:80x86 INT指令就是一个很好的例子)
在哪里
中断(硬件):是基于CPU外部硬件事件的程序控制中断(例如:按键盘上的某个键或定时器芯片上的超时)
中断是系统内硬件产生的流量变化。召唤一个中断处理程序来处理中断原因。然后控制返回到中断的上下文和指令。陷阱是软件生成的中断。可以使用中断来发出I / O完成的信号,从而消除对设备轮询的需要。陷阱可用于调用操作系统例程或捕获算术错误。
中断是硬件中断,而陷阱是软件调用的中断。硬件中断的发生通常会禁用其他硬件中断,但是对于陷阱而言并非如此。如果需要在提供陷阱之前禁止硬件中断,则需要显式清除中断标志。通常,计算机上的中断标志会影响(硬件)中断,而不是陷阱。这意味着清除该标志将不会阻止陷阱。与陷阱不同,中断应保留CPU的先前状态。
陷阱是软件中断,如果您编写一个程序,在其中声明一个被零除的变量,则该陷阱将被视为陷阱。每当您运行该程序时,它将同时引发相同的错误。系统调用是陷阱的特殊版本,程序在其中向os要求其提供所需的服务。如果发生诸如I / O错误之类的中断(通常是硬件中断的意思),则CPU会在随机时间中断,这当然不是程序员的错,而是由硬件引起的。