【中断异常】X86对中断的支持原理

来源:互联网 发布:送货单打印软件 编辑:程序博客网 时间:2024/06/05 09:20

X86对中断的支持本身非常复杂,而linux内核只是去了其中的一部分来完成了,因为很多部分是不必要的;

中断有两种,一种是由CPU外部产生的,另一种是由CPU本身执行程序的过程中产生的;


(1)外部中断即我们所说的中断(interrupt),外部中断是异步的,我们无法预测它什么时候发生;x86软件产生的中断是由“INT n”同步产生的,只要CPU执行了一条INT指令,就知道在开始执行下一条指令前就一定进入中断服务程序,我们又称此类中断为“陷阱”;异常,是被动的,如页面异常,除数为0异常;

(2)上述异常,陷阱,以及中断,都统称为中断,CPU的相应过程基本一致,在执行完当前指令后,根据中断源提供的中断向量,在内存中找到相应的服务程序入口并调用该服务程序;外部中断向量表是由软件或硬件设置好的,陷阱向量是在自陷指令INT n中发出的,各种异常的向量是由CPU的硬件结构中预先规定好的;不同的情况也就根据不同的中断向量而分开下来了;

(3)Intel CPU支持256个向量,在早起的实地址模式中,CPU从0开始到1K字节作为一个中断向量表,每一个表项占4个字节,由两个字节的段地址和两个字节的位移组成,这样的地址构成了中断服务程序的入口地址;但是这样的机制不能构成现代意义上的操作系统,即使把16位寻址改为32位也无济于事,因为缺少对PSW的处理,无法完成运行模式的切换;

(4)在保护模式中,中断向量表的表项由单纯的入口地址改成了类似于PSW加入口地址并且更为复杂的描述项,称为"门"gate,意思就是必须通过这些门,才能进入相应的中断服务程序;这样的门不仅为中断所用,还为切换CPU的运行状态而设置;操作系统专门设立一个中断服务进程,每次中断发生时就切换到该进程;

(5)根据不同的用途和目的,门分为任务门,中断门,陷阱门,调用门(不是与中断向量表相联系的);任务门结构:TSS段选择码,通过GDT或LDT指向特殊的系统段中的一种,实际上是用来保存任务运行“现场”的 数据结构(CPU中所有与具体进程有关的寄存器内容,包括页面目录指针CR3)和三个堆栈指针;中断发生时,CPU在中断向量表中找到相应的表项,如果此项是个任务门,并通过了优先级的检查,CPU会将当前任务的运行现场保存在相应的TSS中,并将任务门所指向的TSS作为当前任务,将其内容装入到CPU的各个寄存器,从而完成一次任务切换;为此,又增设了任务寄存器TR,用来指向当前任务的TSS。在linux内核中,一个任务就是一个进程,但Task_struct存放了更多的信息,因此linux内核并不完全是通过任务门作为切换进程的唯一手段,亦可通过CALL指令和JMP指令通过调用门来达到同样的目的;


(6)除任务门,其他三种门的结构基本相同,类型码标识不同的门,中断门的类型是110,陷阱门的类型是111,调用门的类型码是100;任务门不需要段内位移,因为它不需指向某一个子程序的入口,TSS作为一个段来对待的,而其他的三个门指向一个子程序,所以得结合段选择码和段内位移;


(7)中断门和陷阱门使用的区别并不是本身陷入的不同,而是通过中断门进入的中断服务程序时,CPU会自动关闭中断,即EFLAGS中的IF清零;而陷阱门的IF不变;

(8)不管是什么门,都需通过段选择段指向一个存储段;段选择寄存器在保护模式下,段寄存器的内容并不直接指向一个段的起始地址,而是指向由CPU指向的GDTR和LDTR决定的某个段描述表中的一个表项;TI决定是使用GDTR还是LDTR,但在Linux内核中,只是用GDT,LDT特殊情况下用;对于其他三种门,段描述符中的表项显然是个代码段描述符,而任务门所指向的描述符是专门为TSS段而设的TSS描述项;

(9)Intel在i386CPU中的实现一个非常复杂的优先级别检验机制,先是门的DPL和CPU的CPL相比,CPL小于等于DPL才能通过该门(通常是中断门),然后在将目标代码段描述项中的DPL与CPL再比较;通过门后,CPU的CPL优先级只能提高;两次比较中,任何一个失败,都将引起一次全面保护异常;

(10)进入中断服务程序中,CPU要将当前EFLAGS寄存器的内容以及返回地址(CS和EIP)压入堆栈中;若中断是由异常引起的,还要将出错原因压入堆栈中;根据目标代码中的运行级别的不同,分为0,1,2,分别对应三个额外的堆栈指针,若中断发生时的CPL和目标代码中的DPL不同,就要切换堆栈指针,具体如下图;


(11)在Linux内核中,当中断发生在用户空间时,运行级别为3,而内核中的中断服务程序为0,所以会引起堆栈的变换,而若中断发生在系统空间时,则不会更换堆栈;

(12)保护模式中,中断向量表在内存中的位置不再局限于从地址0开始,增设IDTR指向当前的中断向量表IDT,下图显示了中断机制在采用中断门或陷阱时的结构;


0 0
原创粉丝点击