Linux内核在系统初始化要进行大量的初始化工作,其与中断相关的工作有,初始化可编程控制器8259A;将中断描述符表的起始地址装入IDTR寄存器,并初始化表中的每一项,
用户进程可以通过INT指令发出 一个中断请求向量在0~255之间。为了防止用户使用INT指令模拟非法的中断和异常,必须对中断描述符表进行谨慎的初始化。其措施之一就是将中断门或陷阱门中的请求特权级DPL域置为0,如果用户进程确实发出了这样一个中断请求,CPU会检查出其当前特权级CPL(3)与所请求的特权级DPL(0)有冲突,因此产生一个“通用保护”异常。
但是,有时候必须让用户进程能够使用内核所提供的功能(比如系统调用),也就是说从用户态进入内核态,这可以通过把中断门和陷阱门的DPL置为3来达到。
当计算机运行在实模式时,中断描述表被初始化,并由BIOS使用。然而,一旦真正进入Linux内核,中断描述符表 就被移动到内存的另一个区域,并为进入保护模式进行预初始化,把中断描述符表IDT的起始地址装入IDTR。
用setup_idt()函数填充中断描述符表中的256个表项。在对这个表进行填充时,使用了一个空的中断处理程序。因为现在处于初始化阶段,还没有任何中断处理程序,因此,用空的中断处理程序填充每个表项。
在对中断描述符表进行初始化后,内核将在其用分页功能后对IDT进行第二遍初始化,也就是说,用实际的陷阱和中断处理程序替换这个空的处理程序。一旦这个过程完成,对于每个异常,IDT都有一个专门的陷阱门或系统门,而对每个外部中断,IDT都包含专门的中断门。