重新映射中断向量和引导块

remapping Interrupt vectors and boot block

我无法理解重新映射中断向量或引导块的概念。重映射向量table有什么用?它如何使用重新映射和不重新映射?关于这方面的好文章的任何链接?我用谷歌搜索了这个,但无法得到好的答案。将 RAM 映射到 0x0000 并将 0x0000 中存在的任何内容映射到其他地方有什么好处?是不是从0x0000开始执行会比较快?

这是一个简单的实用问题。复位向量位于 0x0*,当系统首次上电时,内核将开始从那里获取指令。因此,您必须在上电后立即获得一些代码——它必须是某种 ROM,因为此时 RAM 将未初始化。现在,一旦您完成了初始引导过程并正确启动了您的应用程序,您就会遇到问题 - 您的异常向量和处理它们的代码都在 ROM 中!如果你想安装一个不同的中断处理程序怎么办?如果您想为热复位处理程序切换复位向量怎么办?通过使矢量区域可重映射,应用程序可以自由切换 RAM 区域的 ROM 引导固件,在该区域中安装了自己的矢量和处理程序代码。

当然,这可能并不总是必要的——例如对于微控制器 运行 一个单独的专用应用程序,它自己处理加电 - 但是一旦您进入更复杂的独立引导加载程序和应用程序代码领域,它就变得更加重要。性能也是一个理论上的问题,至少 - 如果你的闪存速度慢但内存速度快,你可能会从将你的向量和中断处理程序复制到内存中受益 - 但我认为这在现代微处理器上远不是问题。

此外,如果应用程序希望能够在运行时更新引导闪存,那么它绝对需要一种将向量和处理程序放在其他地方的方法。否则,如果在闪存块处于编程模式时触发中断,设备将由于无法从向量中读取而锁定在递归硬故障中,永远不会完成编程操作并自行变砖。

虽然大多数类型的 ARM 内核都有一些方法 change their own vector base address,但有些(如 Cortex-M0),更不用说大量的非 ARM 内核,没有,这需要这种非架构- 特定的系统级重映射功能以实现相同的结果。对于围绕 ARM7TDMI 等较旧内核构建的微控制器,固定替代 "high vectors" 地址(更适合与 MMU 一起使用)后面也很可能没有 RAM,从而使该选项无用。

* 是的,好的,如果我们谈论的是 Cortex-M,则为 0x4,但你知道我的意思......;)