中断描述符(IDT)、任务门、中断门、陷阱门
阅读原文时间:2021年04月20日阅读:1

什么是中断描述符表

    中断描述符IDT表示一个系统表,它与中断或异常向量相联系。每一个中断或异常向量在这个系统表中有对应的中断或异常处理程序入口地址。中断描述符的每一项对应一个中断或异常向量,每个向量由8个字节组成。因此,最多需要256*8=2048字节来存放IDT。

    在运行中断之前,必须初始化IDT(中断描述符表)。

任务门、中断门、陷阱门

    IDT包含三种类型的中断描述符:任务门、中断门、陷阱门。描述符的第40~43位用于区分不同的描述符(每个描述符有8个字节/64bit)。

任务门(task gate)

    当中断信号发生时,必须取代当前进程的那个进程的TSS选择符存放在任务门中。

中断门(interruptgate)

    包含段选择符和中断或异常处理程序的段内偏移量.当控制权转移到一个适当的段时,处理器 清IF标志,从而关闭将来会发生的可屏蔽中断.

陷阱门(Trap gate)

    与中断门相似,只是控制权传递到一个适当的段时处理器不修改IF标志.

    以上为Intel对中断描述符的分类。Linux采用了更细的分类方法

中断门(interrupt gate)

    用户态的进程不能访问的一个lntel中断门(门的DPL字段为0)。所有的Linux中断处理程序都通过中断门激活,并全部限制在内核态。

系统门(syslem gate)

    用户态的进程可以访问的一个Intel陷阱门(门的DPL字段为到.通过系统门来激活三个Linux异常处理程序,它们的向量是4,5及128,因此,在用户态下.可以发布into、 bound及int $Ox80三条汇编语言指令。

系统中断门(system interrupt gate)

    能够被用户态进程访问的Intel中断门(门的DPL字段为3). 与向量3相关的异常处理程序是由系统中断门激活的,因此,在用户态可以使用汇编语言指令int3.

陷阱门(Irapgate)

    用户态的进程不能访问的一个Inte)陷阱门(f]的DPL字段为0). 大部分Linux异常处理程序都通过陷阱门来激活.

任务门(task gate)

    不能被用户态进程访问的Intel任务门(门的DPL字段为0).Linux对"Doublefault"异常的处理程序是由任务门激活的.

初始化中断描述符表

      内核启用中断以前;必须把IDT表的初始地址装入idtr寄存器,并初始化表中的每一项.这项工作是在初始化系统时完成的。

    int指令允许用户进程发出一个中断信号(值为0~255的任意一个向量),为了防止用户通过int指令模拟非益的中断和异常,IDT初始化时必须把特殊的中断或陷阱门描述符的DPL字段设置成0。这样,当进程试图发出其中的一个中断信号(特殊的中断或陷阱门).控制单元就会检查出CPL(当前特权级)的值与DPL字段有冲突.并且产生一个General protection" 异常。

    然而,在少数情况下,用户态进程必须能发出一个编辑异常.为此,只要把中断或陷阱门描述符的DPL字段设置成3,即特权级尽可能一样高就足够了。

IDT的初步初始化:

    当计算机还运行在实模式时.IDT被初始化并由BIOS例程使用.然而.一旦Linux接管.IDT就被移到RAM的另一个区域,并进行第二次初始化,因为Linux没有利用任何BIOS例程

    IDT存放在idt_table表中.有256个表项。6字节的idt_descr变量指定了IDT的大小和它的地址,只有当内核用lidt汇编指令初始化idtr寄存器时才用到这个变量

    在内核初始化过程中,setup_idt ( )汇编语言函数用同一个中断门(即指向ignore_int( )中断处理程序)来填充所有这256个idt_table表项。

用汇编语言写成的ignore_int( )中断处理程序,可以看作一个空的处理程序,它执行

下列动作:

1.  在栈中保存一些寄存器的内容。

2.  调用printk()函数打印"Unknowninterrupt" 系统消息.

3.  从栈恢复寄存器的内容。

4.  执行iret指令以恢复被中断的程序。

    ignore_int()处理程序应该从不被执行,在控制台或日志文件中出现的"Unknown interrupt"消息标志着要么是出现了一个硬件的问题(一个1/0设备正在产生没有预料到的中断),要么就是出现了一个内核的问题(一个中断或异常未被适当地处理)。

    紧接着这个预初始化,内核将在IDT中进行第二遍初始化,用有意义的陷阱和中断处理程序替换这个空处理程序。一且这个过程完成,对控制单元产生的每个不同的异常,IDT都有一个专门的陷阱或系统门.而对于可编程中断控制器确认的每一个IRQ, IDT都将包含一个专门的中断门.