linux中断跳转分析
linux中断服务函数跳转过程(部分)
S3C2440中的中断种类
复位 特权模式 优先级1
未定义指令 未定义指令终止模式 6
软件中断 特权模式 6
指令预取终止 终止模式 5
数据访问终止 终止模式 2
保留 未使用 未使用
外部中断请求 外部中断模式 4
快速中断请求 快速中断模式 3
中断处理流程
  1. 发生中断时,CPU执行异常向量vector_irq的代码。
  2. 在vertor_irq里面,最终会调用中断处理的总入口函数asm_do_IRQ。
  3. asm_do_IRQ根据中断号调用irq_desc数组项中的handle_irq。
  4. handle_irq会使用chip成员中的函数来设置硬件,比如清除中断、禁止中断、重新使能中断等。
  5. handle_irq逐个调用用户在action链表中注册的处理函数(针对共享中断)。
现在的内核中断的入口函数asm_do_IRQ也可以换成自己定义的了。
linux中的中断向量表如下图所示
在arch/arm/kernel/entry-armv.S中:
  
这个向量表被 arch/arm/kenerl/traps.c 中的 trap_init 函数拷贝到内存0xffff0000处,这个表中的跳转指令(例如 b vector_und + stubs_offset)会跳转到同文件中__stubs_start 到 __stubs_end 标签指定的代码段中的对应指令(很长就不截图了,总而言之是一段代码)。__stubs_start 到 __stubs_end所指示的这段代码被复制到 内存 0xffff0000 + 0x200 处(见trap_init函数),例如执行 b vector_und + stubs_offset 就能跳到 __stubs_start 到 __stubs_end 中 vector_und:处。
而vector_und: 不是直接定义的,是由宏 :
.macro vector_stub, name, mode, correction=0
.align 5
vector_\name:
...
处理生成。在代码中可以找到
vector_stub und, UND_MODE
经过上面的宏就会生成 vector_und 标签

然后是跳转指令中 stubs_offset的作用:

 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号