操作系统是个死循环,有了中断,CPU才能执行指令工作。
外部中断
外部中断是来自CPU外部的中断,而外部的中断源必须是某个硬件,故而又称为硬件中断。比如网卡接收到数据包,就会通知CPU,CPU再将数据拷贝到内核缓冲区。
由于CPU不能为每一个外部设备设置一个引脚,就提供了两条信号线作为中断信号的公共线路,分别是INTR和NMI。
可屏蔽中断是通过INTR引脚进入CPU的,可屏蔽的意思是此外部设备发出的中断不会让系统宕机,所以CPU可以不予理会,通过eflags的UF位来将这些中断屏蔽。
不可屏蔽中断是通过NMI进入CPU的,表示系统发生了致命性错误,即将宕机。
CPU收到中断后,得知道发生了什么事情才能执行相应的处理办法。这是通过中断向量表或中断描述符表(中断向量表是实模式下的中断处理程序数组,在保护模式下已经被中断描述符表代替)来实现的,首先为每一种中断分配一个中断向量号,中断向量号就是一个整数,它就是中断向量表或中断描述符表中的素引下标,用来索引中断项。中断发起时,相应的中断向量号通过NMI或INTR引脚被传入CPU,中断向量号是中断向量表或中断描述符表里中断项的下标,CPU根据此中断向量号在中断向量表或中断描述符表中检索对应的中断处理程序并去执行。
内部中断
内部中断分为软中断和异常。
软中断就是由软件主动发起的中断,它是主观上的,不是客观上的某种内部错误。
异常是指令执行期间CPU内部产生的错误引起的。
中断描述符表
中断的本质是来了一个中断信号后,调用相应的中断处理程序。为了统一中断管理,把来自外部设备、内存指令的各种中断类型归结为一种管理方式,为每个中断信号分配一个整数,用此整数作为中断的ID,就是所谓的中断向量,用此ID作为中断描述符表中的索引,这样就能找到相应的表项,进而找到对应的中断处理程序。中断向量的作用和选择子类似,都用在描述符表索引一个描述符。在CPU内部有一个中断描述符表寄存器,里面存着中断描述符表的地址。
中断处理过程及保护
CPU外:外部设备的中断由中断代理芯片接收,将处理后的中断向量号发到CPU。
CPU内:CPU执行该中断向量号对应的中断处理程序。
(1)处理器根据中断向量号定位中断门描述符。
中断向量号是中断描述符的索引,当处理器收到一个外部中断向量号后,它用此向量号在中断描述符表中查询对应的中断描述符,然后再去执行该中断描述符中的中断处理程序。由于中断描述符是8个字节所以处理器用中断向量号乘以8后,再与IDTR中的中断描述符表地址相加,所求的地址之和便是该中断向量号对应的中断描述符。
(2)处理器进行特权级检查。
由于中断是通过中断向量号通知到处理器的,中断向量号只是个整数,其中并没有RPL,所以在对中断引起的特权级转移做特权级检查中,并不涉及到RPL。中断门的特权检查同调用门类似,对于软件主动发起的软中断,当前特权级CPL必须在门描述符DPL和门中目标代码段DPL之间。这是为了防止位于3特权级下的用户程序主动调用某些只为内核服务的例程。
(a)如果是由软中断intn、int3和into引发的中断,这些是用户进程中主动发起的中断,由用户代码控制,处理器要检查当前特权级CPL和门描述符DPL,这是检查进门的特权下限,如果CPL权限大于等于DPL,即数值上CPL≤门描述符DPL,特权级“门槛”检查通过,进入下一步的“门框”检查。否则处理器抛出异常。
(b)这一步检査特权级的上限(门框):处理器要检查当前特权级CPL和门描述符中所记录的选择子对应的目标代码段DPL,如果CPL权限小于目标代码段DP.即数值上CPL>且标代码段DPL,检查通过。否则CPL若大于等于且标代码段DPL,处理器将引发异常,也就是说,除了用返回指令从高特权级返回,特权转移只能发生在由低向高。
若中断是由外部设备和异常引起的,只直接检查CPL和目标代码段的DPL,和上面的步骤b)是样的,要求CPL权限小于目标代码段DPL,即数值上CPL>目标代码段DPL,否则处理器引发异常。
(3)执行中断处理程序
特权级检查通过后,将门描述符目标代码段选择子加载到代码段寄存器CS中,把门描述符中中断处理程序的偏移地址加载到EIP,开始执行中断处理程序。
标签:CPL,中断向量,中断,描述符,DPL,CPU From: https://www.cnblogs.com/LCAB/p/17052028.html