在ARM架构中,有一个低向量地址0x0
和高向量地址0xFFFF0000
。
我想知道为什么可能需要两个向量地址?
在英特尔微处理器和微控制器中,有一个向量地址。
有2个向量地址是否有任何特殊原因?
答案 0 :(得分:8)
某些微控制器系列具有多个不同的起始地址和/或它们使用相同的地址并根据带引脚切换输入和输出地址解码,以便您可以从供应商创建的一个引导加载程序启动,或用户引导加载程序或用户应用程序。 (允许你恢复通常是砖砌的系统)。
你可以设想同样的事情。想想这些微控制器如何通过必须在核心外工作来改变用于启动的闪存库。通过在内核上使用此引脚引脚,您可以在不同的地址处使用备用引导加载程序,此引导加载程序可用于重新编写/管理/开发/救援主应用程序。
你也可以避免使用rom / ram向量地址。例如,你从高向量上的flash启动并且ram为0,然后你可以将程序加载到ram或至少一个运行时特定的向量表,然后切换位(可能必须从蹦床反弹到达那里,我不记得我们在芯片中没有使用高矢量。)
不是说这就是ARM为什么这样做的原因,但如果没有别的东西可以为供应商提供简单的救援方案。一些供应商救援方案或备用引导方法过于复杂。我实际上想看到arm和其他人有几个,至少有两个信号给出四个地址可能是0x00000000,0x40000000,0x80000000,0xC0000000,那种东西还是0x00000000,0x80000000,0xFFFF0000,0xFFFF8000。在许多内核上执行类似的操作,尤其是cortex-m,您可能会看到芯片供应商开始使用它而不是他们自己的方案,并且当在供应商之间从一个芯片移动到另一个芯片时,这将不那么痛苦在相同的供应商产品线中。
答案 1 :(得分:2)
正如dwelch所说,这避免了硬件中的地址解码。特别重要的是从 Flash / ROM 启动并切换到从 RAM 运行。虽然这是最重要的没有 MMU。
在实时操作系统(例如vxWorks)中,至少在版本4之前,所有代码都在系统级别运行且没有MMU。这最大限度地减少了延但是,您的物理代码必须映射到低地址或高地址。通常,低地址是最方便的,典型的 SOC 硬件具有芯片选择用于外部存储器,允许灵活的存储器布局。但是,将0x0
的向量表放在一边有一些缺点。最明显的是使用NULL
指针。某些硬件将允许通过 SOC 功能对地址范围进行只读保护;当这些地址发生写入时,产生 BUS FAULT 。如果你很不幸没有这种类型的 SOC ,而没有保护内存系统架构(第B5.1章 ARM ARM ),然后将向量表重新映射到高内存可能是一件好事;否则,单个NULL
写入可能会导致系统崩溃。
另请注意, ARM ARM 表示没有依赖于高或低向量表的ARM指令。它是一个可选的协处理器寄存器,大多数(如果不是全部)ARM都有。在我们使用MMU的现代ARM系统中,它可能没那么有用。即便是ARM也有一些包袱;它在bootloader或深度嵌入式系统的情况下仍然有用。使用有源MMU时,可能不需要此功能,除非使用部分(1MB页)来最小化TLB压力。
在具有 TrustZone 控制器的较新ARM处理器上,实际上有三个向量表。 安全世界向量表类似于传统的高 / 低内存版本。 监控模式和非安全世界向量表通过协处理器寄存器设置,可以放在内存中的任何位置。