Dav*_*vid 143 x86 operating-system kernel interrupt cpu-architecture
陷阱和中断有什么区别?
如果不同系统的术语不同,那么它们在x86上意味着什么?
Aar*_*lla 185
甲陷阱是在用户进程异常.它是由零除或无效的内存访问引起的.它也是调用内核例程(系统调用)的常用方法,因为它们的优先级高于用户代码.处理是同步的(因此用户代码被暂停并在之后继续).从某种意义上说,它们是"活跃的" - 大多数时候,代码期望陷阱发生并依赖于这个事实.
一个中断是由硬件(如硬盘设备,显卡,I/O端口等)产生的东西.这些是异步的(即它们不会发生在用户代码中的可预测位置)或"被动",因为中断处理程序必须等待它们最终发生.
你也可以看到一个陷阱作为一种CPU内部中断,因为陷阱处理程序的处理程序看起来像一个中断处理程序(寄存器和堆栈指针被保存,有一个上下文切换,执行可以在某些情况下恢复它停止) .
rut*_*ord 90
陷阱和中断密切相关.陷阱是一种异常,异常类似于中断.
英特尔x86定义了两个重叠类别:向量事件(中断与异常)和异常类(故障与陷阱与中止).
本文中的所有引用均来自2016年4月版的" 英特尔软件开发人员手册".对于(确定的和复杂的)x86透视图,我建议阅读SDM关于中断和异常处理的章节.
向量事件(中断和异常)导致处理器在保存处理器的大部分状态后跳转到中断处理程序(足以使执行可以在以后继续执行).
异常和中断有一个ID,称为向量,用于确定处理器跳转到哪个中断处理程序.中断处理程序在中断描述符表中描述.
在执行程序期间,响应于来自硬件的信号,在随机时间发生中断.系统硬件使用中断来处理处理器外部的事件,例如服务外围设备的请求.软件也可以通过执行INT n指令生成中断.
当处理器在执行指令时检测到错误条件(例如除以零)时会发生异常.处理器检测各种错误情况,包括保护违规,页面错误和内部机器故障.
异常分为故障,陷阱或中止,具体取决于报告的方式以及是否可以重新启动导致异常的指令而不会丢失程序或任务连续性.
总结:陷阱增加指令指针,故障没有,并中止 '爆炸'.
甲陷阱是俘获指令的执行之后立即报告一个异常.陷阱允许继续执行程序或任务而不会丢失程序连续性.陷阱处理程序的返回地址指向捕获指令后要执行的指令.
甲故障是可以通常被校正,并且,一旦校正,允许以不连续性的损失被重新启动该程序的异常.当报告故障时,处理器将机器状态恢复到开始执行故障指令之前的状态.故障处理程序的返回地址(CS和EIP寄存器的保存内容)指向错误指令,而不是指向错误指令之后的指令.
示例:页面错误通常是可恢复的.一个应用程序的地址空间可能已从ram换出到磁盘.当应用程序尝试访问已换出的内存时,应用程序将触发页面错误.内核可以将内存从磁盘拉到RAM,然后将控制权交还给应用程序.应用程序将在它停止的地方继续(在访问被换出的内存的错误指令处),但这次内存访问应该成功而不会发生错误.
一个中止是一个例外,它并不总是报告指示的精确位置造成的例外,不允许引起异常的程序或任务的重新启动.中止用于报告严重错误,例如系统表中的硬件错误和不一致或非法值.
软件调用的中断(由INT指令触发)以类似陷阱的方式运行.指令在处理器保存其状态并跳转到中断处理程序之前完成.
一般来说,例外,故障,中止,陷阱和中断等术语都是相同的,被称为"中断".
陷阱和中断之间的区别:
陷阱:程序员是否已启动并希望将控制转移到特殊处理程序例程.(例如:80x86 INT指令就是一个很好的例子)
在哪里
中断(硬件):程序控制中断是基于CPU外部的外部硬件事件(例如:按键盘上的键或定时器芯片上的超时)
一个陷阱是一种特殊的中断也就是通常被称为软件中断.的中断是覆盖两个更一般的术语硬件中断(来自硬件设备中断)和软件中断(来自软件中断,如陷阱).
陷阱由类似程序的代码调用,并用于例如调用操作系统例程(即通常同步)。中断由事件(很多时候是硬件,例如接收到数据的网卡或 CPU 定时器)调用,并且 - 顾名思义 - 中断正常的控制流,因为 CPU 必须切换到驱动程序例程来处理事件。