欢迎来到天天文库
浏览记录
ID:42594685
大小:306.48 KB
页数:23页
时间:2019-09-18
《ARM Linux中断源码分析(2)——中断处理流程》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、ARMLinux中断源码分析(2)——中断处理流程ARM支持7类异常中断,所以中断向量表设8个条目,每个条目4字节,共32字节。 异常名称中断向量异常中断模式优先级复位0x0特权模式1未定义的指令0x4未定义指令中止模式6软件中断0x8特权模式6指令预取中止0x0c中止模式5数据访问中止0x10中止模式2保留0x14 外部中断请求IRQ0x18IRQ模式4快速中断请求FIQ0x1cFIQ模式3 回顾第一节所讲的内容,当一个异常或中断发生时,处理器会将PC设置为特定地址,从而跳转到已经初始化好的异常向量表。因此,要理清中断处理流程,先从异常向量表开始。对于ARMLinux而言,异常
2、向量表和异常处理程序都存在arch/arm/kernel/entry_armv.S汇编文件中。vector异常向量表点击(此处)折叠或打开1..globl __vectors_start2.__vectors_start:3. swi SYS_ERROR04. b vector_und + stubs_offset5. ldr pc, .LCvswi + stubs_offset6. b vector_pabt + stubs_offset7. b vector_dabt + stubs_offset8. b
3、 vector_addrexcptn + stubs_offset9. b vector_irq + stubs_offset@中断入口,vector_irq10. b vector_fiq + stubs_offset11.12. .globl __vectors_end1.__vectors_end:vector_irq+stubs_offset为中断的入口点,此处之所以要加上stubs_offset,是为了实现位置无关编程。首先分析一下stubs_offset(宏)是如何计算的:.equ stubs_offset,__vectors_s
4、tart+0x200-__stubs_start在第3节中已经提到,内核启动时会将异常向量表拷贝到0xFFFF_0000,将异常向量处理程序的stub拷贝到0xFFFF_0200。图5-1描述了异常向量表和异常处理程序搬移前后的内存布局。图5-1 异常向量表和异常处理程序搬移前后对比当汇编器看到B指令后会把要跳转的标签转化为相对于当前PC的偏移量(±32M)写入指令码。由于内核启动时中断向量表和stubs都发生了代码搬移,所以如果中断向量表中仍然写成bvector_irq,那么实际执行的时候就无法跳转到搬移后的vector_irq处,因为指令码里写的是原来的偏移量,所以需要把指令码
5、中的偏移量写成搬移后的。设搬移后的偏移量为offset,如图5-1所示,offset=L1+L2 =[0x200-(irq_PC_X-__vectors_start_X)]+(vector_irq_X-__stubs_start_X) =[0x200-(irq_PC-__vectors_start)]+(vector_irq-__stubs_start) =0x200-irq_PC+__vectors_start+vector_irq-__stubs_start =vector_irq+(__vectors_start+0x200-__stubs_s
6、tart)-irq_PC令stubs_offset=__vectors_start+0x200-__stubs_start则offset=vector_irq+stubs_offset-irq_PC,所以中断入口点为“b vector_irq+stubs_offset”,其中减去irq_PC是由汇编器在编译时完成的。vector_irq处理函数在分析vector_irq处理函数之前,先了解一下当一个异常或中断导致处理器模式改变时,ARM处理器内核的处理流程如下图所示: 中断刚发生时,处理器处于irq模式。在__stubs_start和__stubs_end之间找到
7、vector_irq处理函数的定义vector_stubirq,IRQ_MODE,4,其中vector_stub是一个宏(在arch/arm/kernel/entry_armv.S中定义),为了分析更直观,我们将vector_stub宏展开如下:1./*2. * Interruptdispatcher3. */4. vector_irq:5. .if 41. sub lr, lr, #4 @在中断发生时,lr指向最后执行的指令地址加上8。只有在
此文档下载收益归作者所有