#define DESCTYPE_TASK 0x85 /* present, system, DPL-0, task gate */
#define DESCTYPE_INT 0x8e /* present, system, DPL-0, interrupt gate */
#define DESCTYPE_TRAP 0x8f /* present, system, DPL-0, trap gate */
#define DESCTYPE_DPL3 0x60 /* DPL-3 */
这些最终对应每一个IDT表项的32到47位。_set_gate()最后一个参数seg给出了处理程序所在段的段选择符,该4个函数seg实参都为__KERNEL_CS。pack_gate()是将_set_gate()的参数组合为两个无符号的32位数a,b,分贝对应idt_struct结构的两个数据项a,b,这样在write_dt_entry()中就可以使用这两个数对idt_table[gate]初始化了。和以上4个set_xxx_gate()稍有区别的是set_task_gate():
static void __init set_task_gate(unsigned int n, unsigned int gdt_entry)
{
_set_gate(n, DESCTYPE_TASK, (void *)0, (gdt_entry<<3));
}
在trap_init()函数中,set_task_gate()被调用:
set_task_gate(8,GDT_ENTRY_DOUBLEFAULT_TSS);
表示内核有严重的非法操作时才会触发该中断,然后执行doublefault_fn()异常处理函数。
