为什么需要内存别名?

Why is memory aliasing needed?

我对意法半导体的这种架构设计感到困惑。 以STM32F407VG为例。程序加载到地址为 0x08000000 的闪存中。该地址映射到地址 0x00000000,因为复位后处理器首先查看 0x00000000。 为什么不直接让 flash 首地址为 0x00000000。内存别名有什么好处?

处理器核心正在寻找堆栈指针的地址 0x00000000,以及复位向量的地址 0x00000004(以及其他向量)。因此,从核心的角度来看,您希望应用程序能够回答。但是这些产品除了你以后添加的应用程序之外,还包含一个工厂编程的引导加载程序,那么你如何用一个地址引导两个程序呢?一种方法是将它们镜像到该地址。如果你还想添加让处理器从 sram 启动的功能,你也需要映射它。

因此,除了一些芯片之外,并非所有芯片都通过基于带引脚或非易失性寄存器位等的镜像来解决问题

STM32 部件只会在 0x00000000 处映射一个百分比,因此您确实希望为 0x08000000 构建应用程序(或其他一些地址,如 0x02000000,用于它们部件的一小部分,请阅读文档!)。因此,例如向量 table 看起来像:

0x20001000
0x08000031
...

处理器内核读取 0x00000004 得到值 0x08000031,这意味着开始在地址 0x08000030 为复位处理程序执行指令。从那里程序用完了 0x08000000 地址 space 而不是 0x00000000.

不是每个人都这样做,但有些人这样做,不限于 ST (STM32)。

不是每个人都有在芯片上编程的引导加载程序,其中一些没有理由多路复用该地址 space 也不会。

连同涵盖很多内容的old_timer答案,对于其他部分,例如基于 Cortex M0 的 STM32F0 系列,没有 SCB->VTOR 矢量 table 偏移寄存器,可以解决这你可以将不同的区域(RAM 或闪存)映射到 0x00000000 以允许你有一个 运行 时间可修改向量 table.