ARM Linux中断源码分析(2)——中断处理流程

ARM Linux中断源码分析(2)——中断处理流程

ID:42594685

大小:306.48 KB

页数:23页

时间:2019-09-18

ARM Linux中断源码分析(2)——中断处理流程_第1页
ARM Linux中断源码分析(2)——中断处理流程_第2页
ARM Linux中断源码分析(2)——中断处理流程_第3页
ARM Linux中断源码分析(2)——中断处理流程_第4页
ARM Linux中断源码分析(2)——中断处理流程_第5页
资源描述:

《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。只有在

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。