Arm 为什么需要内存别名?

Arm 为什么需要内存别名?,arm,stm32,cpu-architecture,processor,stm32f4,Arm,Stm32,Cpu Architecture,Processor,Stm32f4,我对ST Microelectronics的架构设计感到困惑。 以STM32F407VG为例。程序在闪存中的地址0x08000000处加载。该地址映射到地址0x00000000,因为重置后处理器首先查看0x00000000。 为什么不把flash的第一个地址设为0x00000000呢。内存别名的优势是什么 处理器核心正在寻找地址0x00000000作为堆栈指针,0x00000004作为重置向量(并通过其他向量继续)。因此,从核心的角度来看,您希望应用程序能够回答这个问题。但是这些产品除了您稍后添

我对ST Microelectronics的架构设计感到困惑。 以STM32F407VG为例。程序在闪存中的地址0x08000000处加载。该地址映射到地址0x00000000,因为重置后处理器首先查看0x00000000。 为什么不把flash的第一个地址设为0x00000000呢。内存别名的优势是什么


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

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

STM32部分将只映射0x00000000的百分比,因此您确实希望为0x08000000构建应用程序(或者为其部分的一小部分构建类似0x020000000的其他地址,请阅读文档!)。例如,向量表如下所示:

0x20001000
0x08000031
...
处理器内核读取0x00000004获取值0x0800031,这意味着开始在地址0x0800030处为重置处理程序执行指令。从这里开始,程序将耗尽0x08000000地址空间,而不是0x00000000

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


并不是每个人都有一个在芯片上编程的引导加载程序,其中一些人没有理由复用地址空间,也不会这样做。

以及旧计时器的答案,其中涵盖了很多内容,对于其他部分,例如基于Cortex M0的STM32F0范围,没有
SCB->VTOR
向量表偏移寄存器,为了解决这个问题,您可以将不同的区域(RAM或闪存)映射到0x00000000,以便拥有运行时可修改的向量表