arm - 为什么需要内存别名?
问题描述
我对 ST Microelectronics 的这种架构设计感到困惑。以 STM32F407VG 为例。程序在地址 0x08000000 处加载到闪存中。该地址映射到地址 0x00000000,因为复位后处理器首先查看 0x00000000。为什么不将闪存的首地址设为 0x00000000。内存混叠有什么好处?
解决方案
处理器内核正在查看地址 0x00000000 的堆栈指针,以及 0x00000004 的复位向量(以及通过其他向量)。因此,从核心的角度来看,您希望应用程序能够回答。但是这些产品除了你以后添加的应用程序之外,还包含一个工厂编程的引导加载程序,那么如何用一个地址引导两个程序呢?一种方法是将它们镜像到该地址中。如果您还想添加让处理器从 sram 启动的功能,您也需要将其映射进去。
因此,并非所有芯片都以这种方式通过基于带引脚或非易失性寄存器位等的镜像来解决问题。
STM32 部件只会在 0x00000000 处映射一个百分比,因此您真的想为 0x08000000 构建应用程序(或其他地址,例如 0x02000000 的一小部分,请阅读文档!)。例如,向量表如下所示:
0x20001000
0x08000031
...
处理器内核读取 0x00000004 得到值 0x08000031,这意味着开始在地址 0x08000030 处为复位处理程序执行指令。从那里程序用完 0x08000000 地址空间而不是 0x00000000。
不是每个人都这样做,但有些人这样做,不仅限于 ST(STM32)。
不是每个人都有在芯片上编程的引导加载程序,其中一些没有理由复用该地址空间,也不会。
推荐阅读
- angular - “不能绑定到 'ngFor' 或 ngIf,因为它不是 ' 的已知属性
' 导入 CommonModule 时出错。带有延迟加载的 Angular 11/12 - javascript - useRouter().push() 在下一个js中刷新页面
- c - glRotatef 如何围绕本地索引旋转?
- android - 按钮背景渐变未显示
- swift - NSPersistenceContainer 返回零?
- web-scraping - 如何在没有用户的公共 LinkedIn url 的情况下抓取 LinkedIn 个人资料数据?
- jquery - 具有范围选择的日期选择器上的月份年份格式
- if-statement - 在 Snowflake 存储过程的 If-Else 块中使用 LIKE 运算符所需的指导
- amazon-web-services - AWS S3 - 使用 powershell 删除所有文件但保留文件夹
- sonarqube - 如何通过 API 获取 SonarQube 问题报告