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

4

我无法理解重新映射中断向量或引导块的概念。重新映射向量表有什么用?它如何在重新映射和不重新映射时工作?有没有好的文章链接可以阅读?我搜索了谷歌,但无法获得很好的答案。将RAM映射到0x0000并将现有的0x0000映射到其他地方的优点是什么?如果从0x0000执行,执行会更快吗?


可能是为什么ARM有两个向量表地址?的重复问题。 - artless noise
1个回答

8
这只是实用性的问题。重置向量在0x0*处,当系统首次上电时,核心将开始从那里获取指令。因此,你必须立即有一些可用的代码从上电开始 - 它必须是某种ROM,因为此时RAM未初始化。现在,一旦你通过了初始引导过程并启动了你的应用程序,你就会遇到一个问题 - 你的异常向量和处理它们的代码都在ROM中!如果你想安装不同的中断处理程序怎么办?如果你想为热重启处理程序切换重置向量怎么办?通过使向量区域可映射,应用程序可以自由地替换ROM引导固件以及安装其自己的向量和处理程序代码的RAM区域。
当然,这可能并不总是必要的 - 例如,对于运行单个专用应用程序并处理自己上电的微控制器 - 但一旦涉及到分离的引导加载程序和应用程序代码,它就变得更加重要。性能也是一个理论上的关注点 - 如果你的闪存很慢但RAM很快,你可能会受益于将你的向量和中断处理程序复制到那个RAM中 - 但我认为在现代微控制器上这并不是一个很大的问题。
此外,如果一个应用程序想要在运行时更新引导闪存,则绝对需要一种将向量和处理程序放置在其他位置的方法。否则,如果在闪存块处于编程模式时发生中断,则由于无法从向量读取而陷入递归硬故障,永远无法完成编程操作并变砖。

虽然大多数类型的ARM核心都有某种方式更改自己的向量基地址,但一些(如Cortex-M0)以及许多非ARM核心却没有,这就需要这种非架构特定的系统级重映射功能来实现相同的结果。对于围绕旧核心(如ARM7TDMI)构建的微控制器而言,在固定的备用“高向量”地址后面可能没有RAM(更适合使用MMU),使该选项无用。

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


有了解更多的链接吗?我无法完全理解引导过程。我认为首先需要了解引导过程,并查看在嵌入式系统中从RAM执行什么,从ROM执行什么。 - Mahesha Padyana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接