linux中断处理之初始化
void __init start_kernel(void)
{ …… //设定系统规定的异常/中断 trap_init(); //设置外部IRQ中断 init_IRQ(); …… } 在start_kernel中,调用trap_init()来设置系统规定的异常与中断,调用init_IRQ()来设置外部中断. void __init trap_init(void) { …… set_trap_gate(0,÷_error); set_intr_gate(1,&debug); set_intr_gate(2,&nmi); set_system_intr_gate(3, &int3); /* int3-5 can be called from all */ 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); #ifdef CONFIG_X86_MCE set_trap_gate(18,&machine_check); #endif set_trap_gate(19,&simd_coprocessor_error); set_system_gate(SYSCALL_VECTOR,&system_call); //系统调用 …… } 如上所示,设置了0~19的中断/异常处理程序,这些都是intel所规定的,除些之后设置了系统调用入口(用户空间的 int SYSCALL_VECTOR ) 那, set_trap_gate()/set_intr_gate()/set_system_gata()都有一些什么样的区别呢?继续看代码: void set_intr_gate(unsigned int n, void *addr) { _set_gate(idt_table n,14,0,addr,__KERNEL_CS); } static inline void set_system_intr_gate(unsigned int n, void *addr) { _set_gate(idt_table n, 14, 3, addr, __KERNEL_CS); } void __init set_trap_gate(unsigned int n, void *addr) { _set_gate(idt_table n,15,0,addr,__KERNEL_CS); } void __init set_system_gate(unsigned int n, void *addr) { _set_gate(idt_table n,15,3,addr,__KERNEL_CS); } 都是通过统一的接口_set_gate().在i386中,这段代码是用嵌入式汇编完成的,如下所示: #define _set_gate(gate_addr,type,dpl,addr,seg) do { int __d0, __d1; __asm__ __volatile__ ("movw %%dx,%%axnt" "movw %4,%%dxnt" "movl % |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |