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的作用:

 

 

 

 

 

 

格式中的“标题2”作为主目录

  格式中的“标题3”作为次级目录

  保留此段内容备忘

主目录测试

  次目录测试

posted on 2022-10-04 20:07  白鱼入舟  阅读(135)  评论(0)    收藏  举报