在start.s中有这么一段程序
反汇编结果
在移植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为基地址的呀!
有图有真相:
那也就是说这几行代码,永远不会被执行到。这是中断程序的起始点,连起始点都不能被执行到,那么后续的中断工作岂不是都成了无用功!
我的疑问:
从这些代码来看,Uboot 根本就不可能有效的处理中断(至少是对s5pv210而言)。难道Uboot在其他地方又重新做了处理?如果真的是这样,为什么还要留着这些没用的代码?
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在其他地方又重新做了处理?如果真的是这样,为什么还要留着这些没用的代码?
以上是我的一点愚见,同时也是困扰我的一个问题。希望有经验的同学能够指点一二。