【问题标题】:Why two vector table addresses on ARM?为什么ARM上有两个向量表地址?
【发布时间】:2023-03-12 20:05:01
【问题描述】:

在ARM架构中,有一个低向量地址0x0和一个高向量地址0xFFFF0000。 我想知道为什么可能需要两个向量地址? 在 Intel 微处理器和微控制器中,只有一个向量地址。

有 2 个向量地址有什么特别的原因吗?

【问题讨论】:

    标签: arm interrupt


    【解决方案1】:

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

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

    你也可以避免 rom/ram 向量地址的事情。比如说,你从闪存上的高向量启动并且 ram 为 0,然后你可以将程序加载到 ram 或至少一个运行时特定的向量表中,然后切换位(可能必须从蹦床上反弹才能到达那里,我不记得我们的芯片中没有使用高向量)。

    并不是说这就是 ARM 这样做的原因,但如果不出意外的话,它为供应商提供了一个简单的救援计划。一些供应商的救援方案或替代引导方法过于复杂。我实际上希望看到 arm 和其他人有几个,至少两个信号给出四个地址,可能是 0x00000000、0x40000000、0x80000000、0xC0000000、那种东西或 0x00000000、0x80000000、0xFFFF0000、0xFFFF8000。在多个内核上做类似的事情,尤其是 cortex-m,你可能会看到芯片供应商开始使用它而不是他们自己的方案,并且在供应商之间从一个芯片转移到另一个芯片时会不那么痛苦或在同一供应商的产品线中。

    【讨论】:

      【解决方案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 也有一些包袱;对于 或深度嵌入式系统,它仍然很有用。对于活动的 MMU,可能不需要此功能,除非正在使用部分(1MB 页面)来最小化 TLB 压力。

      TrustZone 版本

      在带有 TrustZone 控制器的较新 ARM 处理器上,实际上存在三个向量表。 secure world 向量表类似于传统的high / low 内存版本。 监控模式非安全世界向量表是通过一个协处理器寄存器设置的,可以放在内存中的任何位置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-18
        • 1970-01-01
        • 2014-06-12
        相关资源
        最近更新 更多