ARM Linux 中断向量表建立流程

本文详细解析了Linux 2.6.29版本中ARM架构的中断向量表建立流程,包括从start_kernel到setup_arch再到early_trap_init的步骤。介绍了__vectors_start和__vectors_end在entry-armv.S中的定义,以及中断向量表被拷贝到0xffff0000的过程。同时,文章阐述了vector_stub宏的作用,以及不同异常模式下的处理入口。通过分析汇编代码,解释了异常入口如何使用‘b’指令跳转,并通过objdump反汇编验证了计算的正确性。
摘要由CSDN通过智能技术生成

Linux Version : 2.6.29

1. start_kernel-->setup_arch-->early_trap_init

   1:  
    memcpy((void
 *)vectors, __vectors_start, __vectors_end - __vectors_start);
   2:  
    memcpy((void
 *)vectors + 0x200, __stubs_start, __stubs_end - __stubs_start);
   3:  
    memcpy((void
 *)vectors + 0x1000 - kuser_sz, __kuser_helper_start, kuser_sz);

对于第一行:

         __vectors_start 和 __vectors_end 定义在 arch/arm/kernel/entry-armv.S  , 它们之间保存了中断向量表。      

   1:  
    .globl    __vectors_start
   2:  
__vectors_start:
   3:  
    swi    SYS_ERROR0   
   4:  
    b    vector_und + stubs_offset
   5:  
    ldr    pc, .LCvswi + stubs_offset
   6:  
    b    vector_pabt + stubs_offset
   7:  
    b    vector_dabt + stubs_offset
   8:  
    b    vector_addrexcptn + stubs_offset
   9:  
    b    vector_irq + stubs_offset
  10:  
    b    vector_fiq + stubs_offset
  11:  
 
  12:  
    .globl    __vectors_end
  13:  
__vectors_end:

         vectors 的地址为CONFIG_VECTORS_BASE , 在.config中定义为0xffff0000

         所以 第1行就是把中断向量表拷贝到0xffff0000

  对于第二行: 

             vector_stub是一个带参数的宏,第一个是name,第二个是arm excepiton mode,第三个是为了得到返回地址,lr需要减去的偏移

   1:  
    .macro    vector_stub, name, mode, correction=0
   2:  
    .align    5
   3:  
 
   4:  
vector_/name:
<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值