中断(转载)
定义
在计算机科学中,中断指计算机CPU获知某些事,暂停正在执行的程序,转而去执行处理该事件的程序,当这段程序执行完毕后再继续执行之前的程序。整个过程称为中断处理,简称中断,而引起这一过程的事件称为中断事件。中断是计算机实现并发执行的关键,也是操作系统工作的根本。
分类
中断按事件来源分类,可以分为外部中断和内部中断。中断事件来自于CPU外部的被称为外部中断,来自于CPU内部的则为内部中断。
进一步细分,外部中断还可分为可屏蔽中断(maskable interrupt)和不可屏蔽中断(non-maskable interrupt)两种,而内部中断按事件是否正常来划分可分为软中断和异常两种。
外部中断的中断事件来源于CPU外部,必然是某个硬件产生的,所以外部中断又被称为硬件中断(hardware interrupt)。计算机的外部设备,如网卡、声卡、显卡等都能产生中断。外部设备的中断信号是通过两根信号线通知CPU的,一根是INTR,另一根是NMI。CPU从INTR收到的中断信号都是不影响系统运行的,CPU可以选择屏蔽(通过设置中断屏蔽寄存器中的IF位),而从NMI中收到的中断信号则是影响系统运行的严重错误,不可屏蔽,因为屏蔽的意义不大,系统已经无法运行。
内部中断来自于处理器内部,其中软中断是由软件主动发起的中断,常被用于系统调用(system call);而异常则是指令执行期间CPU内部产生的错误引起的。异常也和不可屏蔽中断一样不受eflags寄存器的IF位影响,区别在于不可屏蔽中断发生的事件会导致处理器无法运行(如断电、电源故障等),而异常则是影响系统正常运行的中断(如除0、越界访问等)。
中断描述符表
中断描述符表(Interrupt Descriptor Table,IDT)是保护模式下用于存储中断处理程序入口的数据结构,实模式中采用中断向量表(Interrupt Vector Table,IVT)。当CPU接收一个中断时,需要用中断向量在此表中检索对应的中断描述符,在该描述符中找到中断处理程序的起始地址,然后才能执行中断处理程序。
中断描述符表中不仅仅有中断描述符,还可以有任务门描述符和陷阱门描述符,它们实质上都是记录着某段程序的起始地址,因此可以统称为门。
中断处理过程及保护
中断过程因中断来源而异,外部中断由外设发出,经中断代理芯片接收并处理后将该中断的中断向量号发送到CPU,最后由CPU执行该中断向量号对应的中断处理程序。内部中断则不经过中断代理芯片。
中断在处理器内部的处理程序如下:
(1)处理器根据中断向量号定位中断门描述符。
中断向量号是中断描述符的索引,当处理器收到一个外部中断向量号后,它用此向量号在中断描述符表中查询对应的中断描述符,然后再去执行该中断描述符指向的中断处理程序。中断描述符占8字节,因此处理器用中断向量号乘8后再与IDTR中的中断描述符表地址相加得到中断描述符的位置。
(2)特权级检查
中断向量号只是一个整数,其中没有RPL,所以在对由中断引起的特权级转移做特权级检查时并不涉及RPL。
如果是由软中断int n、int3、和into这些由用户进程引发的中断,由用户代码控制,处理器要检查当前特权级CPL和门描述符DPL,数值上CPL≤门描述符DPL才能通过检查。通过上一步检查后还需要检查CPL和门描述符中所记录的选择子对应的目标代码段DPL,数值上CPL>目标代码段DPL才能通过检查,因为除返回指令外,特权转移只能由低到高。
若中断是由外部设备或异常引起的,只检查CPL和目标代码段的DPL即可。
(3)执行中断处理程序
特权级检查通过后,将门描述符中目标代码段选择子加载到段寄存器CS中,把门描述符中的中断处理程序的偏移地址加载到EIP,然后开始执行中断处理程序。
中断发生后,eflags中的NT位和TF位都会被置0。如果中断对应的门描述符是中断门,标志寄存器eflags中的IF位也会被置0以避免中断嵌套(中断处理过程中又处理新的中断),即默认情况下处理器对中断门描述符的中断例程处理是不可中断的。若中断发生时对应的门描述符是任务门或陷阱门的话,CPU不会将状态寄存器中的IF位清0,即允许中断嵌套。
原文链接
https://blog.csdn.net/qq_37653144/article/details/82929246