[u-boot]关于star.s中“异常向量”的一个疑问

在start.s中有这么一段程序

start.s

<span style="font-family:Comic Sans MS;font-size:18px;">File: start.s
 
.globl _start
_start: b    reset
 
ldr    pc, _undefined_instruction
ldr    pc, _software_interrupt
ldr    pc, _prefetch_abort
ldr    pc, _data_abort
ldr    pc, _not_used
ldr    pc, _irq
ldr    pc, _fiq
 
#ifdef CONFIG_SPL_BUILD
_undefined_instruction: .word _undefined_instruction
_software_interrupt:    .word _software_interrupt
_prefetch_abort:        <span style="white-space:pre">	</span>.word _prefetch_abort
_data_abort:           <span style="white-space:pre">	</span>.word _data_abort
_not_used:              <span style="white-space:pre">	</span>.word _not_used
_irq:                   <span style="white-space:pre">		</span>.word _irq
_fiq:                   <span style="white-space:pre">		</span>.word _fiq
_pad:                   <span style="white-space:pre">		</span>.word 0x12345678 /* now 16*4=64 */
#else
_undefined_instruction: .word undefined_instruction
_software_interrupt:    .word software_interrupt
_prefetch_abort:        <span style="white-space:pre">	</span>.word prefetch_abort
_data_abort:            <span style="white-space:pre">	</span>.word data_abort
_not_used:              <span style="white-space:pre">	</span>.word not_used
_irq:                   <span style="white-space:pre">		</span>.word irq
_fiq:                   <span style="white-space:pre">		</span>.word fiq
_pad:                   <span style="white-space:pre">		</span>.word 0x12345678 /* now 16*4=64 */
#endif/* CONFIG_SPL_BUILD */</span>

反汇编结果

<span style="font-family:Comic Sans MS;font-size:18px;">23e00000 <_start>:
23e00000:       ea000014        b       23e00058 <reset>
23e00004:       e59ff014        ldr     pc, [pc, #20]   ; 23e00020 <_undefined_instruction>
23e00008:       e59ff014        ldr     pc, [pc, #20]   ; 23e00024 <_software_interrupt>
23e0000c:       e59ff014        ldr     pc, [pc, #20]   ; 23e00028 <_prefetch_abort>
23e00010:       e59ff014        ldr     pc, [pc, #20]   ; 23e0002c <_data_abort>
23e00014:       e59ff014        ldr     pc, [pc, #20]   ; 23e00030 <_not_used>
23e00018:       e59ff014        ldr     pc, [pc, #20]   ; 23e00034 <_irq>
23e0001c:       e59ff014        ldr     pc, [pc, #20]   ; 23e00038 <_fiq>
 
23e00020 <_undefined_instruction>:
23e00020:       23e00260        .word   0x23e00260
 
23e00024 <_software_interrupt>:
23e00024:       23e002c0        .word   0x23e002c0
 
23e00028 <_prefetch_abort>:
23e00028:       23e00320        .word   0x23e00320
 
23e0002c <_data_abort>:
23e0002c:       23e00380        .word   0x23e00380
 
23e00030 <_not_used>:
23e00030:       23e003e0        .word   0x23e003e0
 
23e00034 <_irq>:
23e00034:       23e00440        .word   0x23e00440
 
23e00038 <_fiq>:
23e00038:       23e004a0        .word   0x23e004a0
 
23e00040 <_TEXT_ba<x>se>:
23e00040:       23e00000        .word   0x23e00000
 
23e00044 <_bss_start_ofs>:
23e00044:       00035d78        .word   0x00035d78
 
23e00048 <_image_copy_end_ofs>:
23e00048:       00035d78        .word   0x00035d78
 
23e0004c <_bss_end_ofs>:
23e0004c:       0006b6cc        .word   0x0006b6cc
 
23e00050 <_end_ofs>:
23e00050:       0003b870        .word   0x0003b870
 
23e00054 <IRQ_STACK_START_IN>:
23e00054:       0badc0de        .word   0x0badc0de</x></span>

    在移植Uboot的时候,我们将CONFIG_SYS_TEXT_base设置为0x23E00000。所以这里是从0x23E00000地址开始的。


    我想这段程序的本意是为了设置异常向量表,这从反汇编结果中很容易看出。减去基地址0x23E00000之后,正好是ARM的异常向量表:
    0x00                        reset
    0x04                 undefined_instruction
    0x08                  software_interrupt
    0x0c                     prefetch_abort
    0x10                      data_abort
    0x14                       not_used
    0x18                         irq
    0x1c                         fiq
可是问题就在这了,s5pv210的异常向量表可不是以0x23E00000为基地址的呀!
有图有真相:


也就是说,当中断发生的时候,s5pv210并不会跳到下面的这些地址来执行。

<span style="font-family:Comic Sans MS;font-size:18px;">23e00004    ldr    pc, _undefined_instruction
23e00008    ldr    pc, _software_interrupt
23e0000c    ldr    pc, _prefetch_abort
23e00010    ldr    pc, _data_abort
23e00014    ldr    pc, _not_used
23e00018    ldr    pc, _irq
23e0001c    ldr    pc, _fiq</span>

那也就是说这几行代码,永远不会被执行到。这是中断程序的起始点,连起始点都不能被执行到,那么后续的中断工作岂不是都成了无用功!
我的疑问:
    从这些代码来看,Uboot
根本就不可能有效的处理中断(至少是对s5pv210而言)。难道Uboot在其他地方又重新做了处理?如果真的是这样,为什么还要留着这些没用的代码?


以上是我的一点愚见,同时也是困扰我的一个问题。希望有经验的同学能够指点一二。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值