计算机微刊

中断

2019-03-23  本文已影响0人  HAPPYers

外部中断

外部硬件的中断是通过两根信号线通知CPU的,这两根信号线就是INTR(INTeRrupt)和NMI(Non Maskable Interrupt)

中断程序会分为上半部和下半部,把中断程序需要立即执行的部分划分到上半部分,这部分是要限时执行的。上半部实在关中断不被打扰的情况下执行的。当上半部执行完成后就把中断打开了;下半部也属于中断程序,其在开中断的情况下执行,如果有新的中断发生,原来这个旧中断的下半部就会被换下CPU,先执行新的中断程序的上半部,等待线程调度机制为旧中断处理程序选择一个日期(依靠调度算法),再调度CPU完成下半部的执行。

内部中断

内部中断可以分为软中断和异常

中断处理过程及保护

完整的中断过程分为 CPU 外和 CPU 内两部分。

  1. 处理器根据中断向量号定位中断门描述符。
    中断向量号是中断描述符的索引,当处理器收到一个外部中断向量号后,它用此向量号在中断描述符 表中查询对应的中断描述符,然后再去执行该中断描述符中的中断处理程序。由于中断描述符是 8 个字节, 所以处理器用中断向量号乘以 8 后,再与 IDTR 中的中断描述符表地址相加,所求的地址之和便是该中断 向量号对应的中断描述符。
  2. 处理器进行特权级检查。
    由于中断是通过中断向量号通知到处理器的,中断向量号只是个整数,其中并没有 RPL,所以在对由中断引起的特权级转移做特权级检查中,并不涉及到 RPL。中断门的特权检查同调用门类似,对于软件主动发起的软中断,当前特权级 CPL 必须在门描述符 DPL 和门中目标代码段 DPL 之间。这是为了防止位于 3 特权级下的用户程序主动调用某些只为内核服务的例程。
    (a)如果是由软中断 int n, int3 和 into 引发的中断,这些是用户进程中主动发起的中断,由用户代码 控制,处理器要检查当前特权级 CPL 和门描述符 DPL,这是检查进门的特权下限,如果 CPL 权限大于等 于 DPL,即数值上 CPL~三门描述符 DPL,特权级“门槛”检查通过,进入下一步的“门框”检查。否则, 处理器抛出异常。
    (b)这一步检查特权级的上限(门框〉:处理器要检查当前特权级 CPL 和门描述符中所记录的选择子 对应的目标代码段 DPL,如果 CPL 权限小于目标代码段 DPL,即数值上 CPL>目标代码段 DPL,检查通 过。 否则 CPL 若大于等于目标代码段 DPL,处理器将引发异常,也就是说,除了用返回指令从高特权级 返回,特权转移只能发生在由低向高。 若中断是由外部设备和异常引起的,只直接检查 CPL 和目标代码段的 DPL,和上面的步骤 b)是一样的,要求 CPL 权限小于目标代码段 DPL,即数值上 CPL >目标代码段 DPL,否则处理器引发异常。
  3. 执行中断处理程序。 特权级检查通过后,将门描述符目标代码段选择子加载到代码段寄存器 cs 中,把门描述符中中断处 理程序的偏移地址加载到 EIP,开始执行中断处理程序。



    由于 IDT 中全都是门描述符,所以图 7-7 的 IDT 中的“某门描述符”表示中断门、陆阱门或任务门。 中断发生后,eflags 中的NT位和 TF位会被置0。如果中断对应的门描述符是中断门,标志寄存器eflags 中的 E 位被自动置 0,避免中断嵌套,即中断处理过程中又来了个新的中断,这是为防止在处理某个中断 的过程中又来了个相同的中断,即同一种中断未处理完时又来了一个,这会导致一般保护性(GP)异常。 这表示默认情况下,处理器会在无人打扰的方式下执行中断门描述符中的中断处理例程。 若中断发生时对应的描述符是任务门或陆阱门的话, CPU 是不会将 E 位清 0 的。 因为陆阱门主要用 于调试,它允许 CPU 响应更高级别的中断,所以允许中断嵌套。而对任务门来说,这是执行一个新任务, 任务都应该在开中断的情况下进行,否则就独占 CPU 资源,操作系统也会由多任务退化成单任务了。 从中断返回的指令是 iret,它从战中弹出数据到寄存器 cs、 eip、 eflags 等,根据特权级是否改变,判 断是否要恢复旧枝,也就是说是否将战中位于 SS_old 和 ESP_old 位直的值弹出到寄存 SS 和 esp。当中断 处理程序执行完成返回后,通过 iret 指令从棋中恢复 eflags 的内容。

中断发生时的压栈

中断错误码 ERROR_CODE

可编程中断控制器

上一篇下一篇

猜你喜欢

热点阅读