为什么ARM上有两个向量表地址?

为什么ARM上有两个向量表地址?,arm,interrupt,bootloader,Arm,Interrupt,Bootloader,在ARM体系结构中,有一个低向量地址0x0和高向量地址0xFFFF0000。 我想知道为什么可能需要两个向量地址? 在英特尔微处理器和微控制器中,有一个矢量地址 有什么特别的原因需要2个矢量地址吗?一些微控制器系列有多个不同的起始地址和/或它们使用相同的地址,并根据带引脚进行地址解码,以便您可以从供应商创建的一个引导加载程序启动,或用户引导加载程序或用户应用程序。(允许您恢复通常为砖砌系统的功能) 你可以想象同样的事情。想一想这些微控制器是如何工作的,它们必须在内核之外进行工作,以改变用于引导的

在ARM体系结构中,有一个低向量地址
0x0
和高向量地址
0xFFFF0000
。 我想知道为什么可能需要两个向量地址? 在英特尔微处理器和微控制器中,有一个矢量地址


有什么特别的原因需要2个矢量地址吗?

一些微控制器系列有多个不同的起始地址和/或它们使用相同的地址,并根据带引脚进行地址解码,以便您可以从供应商创建的一个引导加载程序启动,或用户引导加载程序或用户应用程序。(允许您恢复通常为砖砌系统的功能)

你可以想象同样的事情。想一想这些微控制器是如何工作的,它们必须在内核之外进行工作,以改变用于引导的闪存库。通过在内核上使用这个带引脚,您可以在不同的地址有一个备用引导加载程序,这个引导加载程序可以用来重新写入/管理/开发/拯救主应用程序

您还可以避免使用rom/ram向量地址。比如说,你从闪存引导到高向量上,ram为0,然后你可以将程序加载到ram或至少一个运行时特定的向量表中,然后切换位(可能需要从蹦床上弹起才能到达,我不记得我们在芯片中没有使用高向量)

没有说这就是为什么ARM会这么做,但如果没有其他原因的话,它为供应商提供了一个简单的救援方案。一些供应商的救援方案或备用启动方法过于复杂。我真的希望看到arm和其他人有几个,至少两个信号,给出四个地址,可能是0x00000000,0x40000000,0x80000000,0xC0000000,诸如此类,或者0x00000000,0x80000000,0xFFFF0000,0xFFFF8000。在多个核心上(尤其是cortex-m)执行类似的操作,您可能会看到芯片供应商开始使用它,而不是他们自己的方案,并且在供应商之间或在同一供应商产品线内从一个芯片移动到另一个芯片时,这将减少痛苦。

如前所述,这避免了硬件中的地址解码。特别重要的是从闪存/ROM引导并切换到从RAM运行的情况。尽管这在没有MMU的情况下非常重要

廉价内存保护 在实时操作系统中,例如,至少在版本4之前,所有代码都在系统级别运行,并且没有MMU。这可以最大限度地减少延迟。但是,物理代码必须映射到低地址或高地址。通常,低地址是最方便的,典型的SOC硬件具有用于外部存储器的芯片选择,允许灵活的存储器布局。但是,将向量表设置为
0x0
有一些不利的方面。最明显的是使用
NULL
指针。一些硬件将允许通过SOC功能对地址范围进行只读保护;当这些地址发生写操作时生成总线故障。如果您不幸没有这种类型的SOC,并且没有保护内存系统架构(第B5.1章ARM),那么将向量表重新映射到高内存可能是一件好事;否则,一次
NULL
写入可能会导致系统停机

指令集不可知 还请注意,ARM ARM表示没有依赖于高或低向量表的ARM指令。它是一个可选的协处理器寄存器,大多数(如果不是全部的话)ARM都有。在使用MMU的现代ARM系统中,它可能没有那么有用。甚至手臂也有一些包袱;对于嵌入式系统或深度嵌入式系统,它仍然很有用。对于活动MMU,可能不需要此功能,除非使用部分(1MB页面)来最小化TLB压力

信任区版本 在具有TrustZone控制器的较新ARM处理器上,实际上有三个向量表。安全世界向量表类似于传统的高/低内存版本。监控模式和非安全世界向量表通过协处理器寄存器设置,可放置在内存中的任何位置