在系统初始化期间,trap_init()函数将对中断描述符表IDT进行第二次初始化(第一次只是建一张IDT表,让其指向ignore_intr函数),而在这次初始化期间,系统的0~19号中断(用于分NMI和异常的中断向量)均被设置好。与此同时,用于系统调用的0x80号向量也已被设置。
然而,对于外部中断的初始化 却没有在这个函数中进行。而是在函数init_IRQ中。
仔细想一想内核这样做,的确是使代码清晰又有条理。
1)trap_init -----> 内部中断异常和NMI(中断向量号:0~19)
2) init_IRQ -----> 外部可屏蔽中断 (中断向量号:32~127,129~238)
在init_IRQ函数中,对IDT中断描述符表进行了第三次完善(把相应的外部中断对应的中断向量进行填充)
410 for (i = 0; i < (NR_VECTORS - FIRST_EXTERNAL_VECTOR); i++) {
411 int vector = FIRST_EXTERNAL_VECTOR + i;
412 if (i >= NR_IRQS)
413 break;
414 if (vector != SYSCALL_VECTOR)
415 set_intr_gate(vector, interrupt[i]);
416 }
上述代码解释:
FIRST_EXTERNAL_VECTOR = 0x16;
设置中断向量号32---NR_IRQS相应的中断处理程序地址为数组interrupt[i]的内容。(除去128号中断向量,已经这个向量号已