Linux内核中断/异常的注册(重要中断函数的查找方法,Linux 2.6.11)

来源:互联网 发布:注册送免费空间和域名 编辑:程序博客网 时间:2024/04/29 01:25
Linux内核中断/异常的注册(重要中断函数的查找方法,Linux 2.6.11)


按照下面列出的方式,在trap_init()函数中,可以查找到重点的中断的处理函数有哪些


1. 缺页中断
start_kernel
-> trap_init //注册各种中断和异常
-> set_intr_gate(14,&page_fault); //注册缺页中断入口
-> ENTRY(page_fault) entry.S
-> pushl $do_page_fault //压栈,处理函数为do_page_fault
-> jmp error_code
-> call *%edi
-> do_page_fault
另:vma有VM_GROWSDOWN标志,表示它是一个堆栈区




2. Machine Check(i386)
start_kernel
-> trap_init //注册各种中断和异常
-> set_trap_gate(18,&machine_check); //注册MCE中断入口
-> ENTRY(machine_check) //entry.S
-> pushl machine_check_vector //压栈,处理函数为machine_check_vector指向的函数
-> jmp error_code
-> call *%edi
-> intel_machine_check或pentium_machine_check或k7_machine_check
-> intel_machine_check//记录错误信息后panic




3. Machine Check(x86_64)
start_kernel
-> trap_init //注册各种中断和异常
-> set_intr_gate_ist(18,&machine_check, MCE_STACK); //注册MCE中断入口
-> ENTRY(machine_check) //entry.S
-> paranoidentry do_machine_check
-> do_machine_check //进入MCE的处理流程






另外,通过force_sig_info(SIGBUS, &info, tsk);可以像指定的任务发送指定的信号


 Exception table 异常表地址:
 /* Exception table */
从  __start___ex_table  到  __stop___ex_table ;search_extable(EIP)会使用查找一个EIP是否是一个系统调用












0 0
原创粉丝点击