以下代码是u-boot中定义中断向量表的第一部分,我的问题是每行代码的用途。我理解前两行代码是开始点和实现第一条指令:reset,并且我们在下面定义了reset。但是这些指令何时会被使用呢?根据System.map,每个指令都有一个固定的地址,因此_fiq位于0x0000001C,当我们想要执行fiq时,我们会将该地址复制到pc中然后执行,对吗?但是我们如何跳转到这条指令:ldr pc,_fiq?这是通过硬件还是软件实现的呢?希望我表达得清楚。
>.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
>_undefined_instruction: .word undefined_instruction
>_software_interrupt: .word software_interrupt
>_prefetch_abort: .word prefetch_abort
>_data_abort: .word data_abort
>_not_used: .word not_used
>_irq: .word irq
>_fiq: .word fiq
ldr pc, _fiq
被翻译为ldr pc, [pc, #_fiq-offset]
。这样,*_fiq* 地址处的值被加载到 PC 寄存器中。也就是说,在地址_fiq
处放置一个函数指针。一开始它将是 NULL;稍后可以由其他人填充。在 u-boot 中,默认情况下不启用中断。请参见:在 ARM 上启用 u-boot 中断。 - artless noise