中断子系统1_中断子系统初始化
//中断系统初始化//调用路径:start_kernel->trap_init//函数主要任务://1.初始化apic控制器//2.注册中断、异常处理函数//2.1 所以中断描述符表组织成一张IDT表//2.2 IDT表起始地址保存在idt寄存器//3.cpu的初始化1.1 void __init trap_init(void){//cpu内部apic控制器init_apic_mappings();//初始化中断、异常、陷阱门描述符set_trap_gate(0,÷_error);set_intr_gate(1,&debug);//不可屏蔽中断set_intr_gate(2,&nmi);//系统中断门set_system_intr_gate(3, &int3); //系统门set_system_gate(4,&overflow);set_system_gate(5,&bounds);//陷阱门set_trap_gate(6,&invalid_op);set_trap_gate(7,&device_not_available);set_task_gate(8,GDT_ENTRY_DOUBLEFAULT_TSS);set_trap_gate(9,&coprocessor_segment_overrun);set_trap_gate(10,&invalid_TSS);set_trap_gate(11,&segment_not_present);set_trap_gate(12,&stack_segment);set_trap_gate(13,&general_protection);//缺页中断set_intr_gate(14,&page_fault);set_trap_gate(15,&spurious_interrupt_bug);set_trap_gate(16,&coprocessor_error);set_trap_gate(17,&alignment_check);set_trap_gate(19,&simd_coprocessor_error);//系统调用描述符set_system_gate(SYSCALL_VECTOR,&system_call);//cpu相关的初始化cpu_init();}//IDT表//1.保存系统中所有中断描述符//2.容量256//3.idt_table首地址保存在idt寄存器中1.3 struct desc_struct idt_table[256] __attribute__((__section__(".data.idt"))) = { {0, 0}, };//函数主要任务://在IDT表的第n个表项插入一个中断门//1.1 门中的段选择子设置为内核代码段的段选择子//1.2 偏移量设置为中断处理程序的地址addr//1.3 DPL字段设置为0//set_XXX_gate的区别在于 不同的门描述符设置不同的DPL1.4 void set_intr_gate(unsigned int n, void *addr){_set_gate(idt_table+n,14,0,addr,__KERNEL_CS);}//参数://type字段表示描述符的类型1.5 #define _set_gate(gate_addr,type,dpl,addr,seg)....