gpt4 book ai didi

ARM 引导加载程序 : Interrupt Vector Table Understanding

转载 作者:行者123 更新时间:2023-12-04 00:50:12 25 4
gpt4 key购买 nike

下面的代码是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

最佳答案

如果您了解重置,那么您就会了解所有这些。

当处理器复位时,硬件将 pc 设置为 0x0000,并通过在 0x0000 处获取指令开始执行。当执行或尝试执行未定义指令时,硬件通过将 pc 设置为 0x0004 来响应,并在 0x0004 处开始执行指令。 irq 中断,硬件完成它正在执行的指令,开始执行地址 0x0018 处的指令。等等。

00000000 <_start>:
0: ea00000d b 3c <reset>
4: e59ff014 ldr pc, [pc, #20] ; 20 <_undefined_instruction>
8: e59ff014 ldr pc, [pc, #20] ; 24 <_software_interrupt>
c: e59ff014 ldr pc, [pc, #20] ; 28 <_prefetch_abort>
10: e59ff014 ldr pc, [pc, #20] ; 2c <_data_abort>
14: e59ff014 ldr pc, [pc, #20] ; 30 <_not_used>
18: e59ff014 ldr pc, [pc, #20] ; 34 <_irq>
1c: e59ff014 ldr pc, [pc, #20] ; 38 <_fiq>

00000020 <_undefined_instruction>:
20: 00000000 andeq r0, r0, r0

00000024 <_software_interrupt>:
24: 00000000 andeq r0, r0, r0

00000028 <_prefetch_abort>:
28: 00000000 andeq r0, r0, r0

0000002c <_data_abort>:
2c: 00000000 andeq r0, r0, r0

00000030 <_not_used>:
30: 00000000 andeq r0, r0, r0

00000034 <_irq>:
34: 00000000 andeq r0, r0, r0

00000038 <_fiq>:
38: 00000000 andeq r0, r0, r0

现在当然除了更改 pc 并从这些地址开始执行之外。硬件将保存机器的状态,必要时切换处理器模式,然后从向量表中的新地址开始执行。

作为程序员,我们的工作是构建二进制文件,以便我们希望为这些指令中的每一个运行的指令位于正确的地址。硬件为每个位置提供一个字、一条指令。现在,如果您从不期望有任何这些异常,那么您不必在地址零处有一个分支,例如您可以让程序启动,这些地址处的内存没有任何神奇之处。如果你期望有这些异常,那么你有两种选择,指令是一个词,可以跳出后面的异常。一个是分支,另一个是负载电脑。各有利弊。

关于ARM 引导加载程序 : Interrupt Vector Table Understanding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21312963/

25 4 0