内存映射
复位地址
Arm Cortex内核在复位时从地址0x00000000开始运行,因此该地址分别指向:
ROM code位于Cortex-A7侧。 ROM嵌入了在平台引导(并执行boot chain)或从低功耗STANDBY模式唤醒时执行的引导代码。
Cortex-M4侧的保留RAM。 在释放Cortex-M4重置(在RCC中)并使其运行之前,需要由Cortex-A7加载。 默认情况下,这是由Linux协处理器管理完成的。
注意:由于Cortex-A7的ROM代码映射到地址0x00000000,因此它使用硬件别名来访问地址0x38000000的保留RAM
Cortex-M4 多端口
Cortex-M4通过以下面的三个端口连接到互连模块(ML-AHB),如下图所示:
I-bus用于获取0x00000000--0x1FFFFFFF地址范围内的代码指令(Instructions)。
D-bus 用于在0x00000000--0x1FFFFFFF地址范围内读取/写入数据(Data)。
S-bus用于0x20000000--0xFFFFFFFF地址范围内的所有访问; 所有STM32MP15内部外设寄存器都映射在该范围内。
在这些端口之间平衡Cortex-M4固件访问可调整系统性能,这就是为什么MCU SRAM在第一个地址范围(从0x10000000开始)中定义,但在第二个范围(从0x30000000开始)在STM32MP15中可见的原因。
尽管如此,必须注意,嵌入在STM32MP15中的Cortex-M4仅允许在I-bus覆盖的地址范围上设置硬件断点。 因此,必须通过软件断点调试通过S-bus访问的任何代码。
完整内存映射
下面的内存映射图是在硬件级别公开的所有区域的子集:它显示了OpenSTLinux中使用的默认配置,但客户可以选择其他映射方式以利用STM32MP1芯片定义的其他地址范围。
Cortex-A7/Cortex-M4 共享内存
下图是Cortex-A7非安全和Cortex-M4之间共享的RAM区域的放大图。 此映射是意法半导体(STMicroelectronics)的默认实现,可以由客户自由调整以适应其他需求。
MCU SRAM内部内存
MCU SRAM内部存储器的宽度为384 KB,并且物理上靠近Cortex-M4。 它分为四个独立的banks:
MCU SRAM1 (128 Kbytes)
MCU SRAM2 (128 Kbytes)
MCU SRAM3 (64 Kbytes)
MCU SRAM4 (64 Kbytes)
这些banks具有单独的安全控制和自动时钟门控(用于电源管理优化),但是当系统进入待机低功耗模式时不提供它们,因此在这种情况下它们的内容将丢失。
每个MCU SRAM1 SRAM2 SRAM3 / SRAM4库都是secure aware(在ETZPC的控制下)。
ROM code使用MCU SRAM1在USB引导期间存储USB上下文以进行Flash编程(使用STM32CubeProgrammer)。
Linux remoteproc框架(在Cortex-A7上运行)将Cortex-M4固件代码加载到MCU SRAM中,但必须在RETRAM中加载的例外表除外,因为Cortex-M4在以下位置寻找其重置入口点 地址0x00000000。 总体内存映射在平台的内存映射部分中显示。
外设分配
Domain | Peripheral | Runtime allocation | Comment | |||
Instance | Cortex-A7 secure (OP-TEE) | Cortex-A7 non-secure (Linux) | Cortex-M4 (STM32Cube) | |||
Core/RAM | MCU SRAM | SRAM1 | ☐ | ☐ | ☐ | Assignment (between A7 S and A7 NS / M4) Shareable (between A7 NS and M4) |
SRAM2 | ☐ | ☐ | ☐ | Assignment (between A7 S and A7 NS / M4) Shareable (between A7 NS and M4) | ||
SRAM3 | ☐ | ☐ | ☐ | Assignment (between A7 S and A7 NS / M4) Shareable (between A7 NS and M4) | ||
SRAM4 | ☐ | ☐ | ☐ | Assignment (between A7 S and A7 NS / M4) Shareable (between A7 NS and M4) |
RETRAM内部内存
RETRAM内部存储器的宽度为64 KB,物理上靠近Arm Cortex-M4,可从内核获得最佳性能。 它位于VSW电源域中,允许在待机低功耗模式下提供它,并保留保留固件,该固件可以在从待机模式唤醒后由Cortex-M4快速执行。
RETRAM是一个安全的外围设备(在ETZPC的控制下)。
Linux remoteproc框架(在Cortex-A7上运行)将从地址0x00000000开始将Cortex-M4固件加载到RETRAM。 至少,由于Cortex-M4重置入口点为地址0x00000004,因此必须加载包含向量表的固件部分。 其余的固件代码将加载到MCU SRAM中。 总体内存映射在平台的内存映射部分中显示。
外设分配
Domain | Peripheral | Runtime allocation | Comment | |||
Instance | Cortex-A7 secure (OP-TEE) | Cortex-A7 non-secure (Linux) | Cortex-M4 (STM32Cube) | |||
Core/RAM | RETRAM | ☐ | ☐ | ☐ | Assignment (single choice) |
SYSRAM内部内存
STM32MP15 SYSRAM是一个256 kbyte的内部内存外设。它的物理位置靠近Arm Cortex-A,以优化核心性能。
SYSRAM是一个安全的外围设备(在ETZPC TrustZone内存适配器(TZMA)下):它可以分为一个安全的区域和一个不安全的区域,其粒度为4 kbyte。
The STM32MP15 ROM code mainly configures the SYSRAM as a secure peripheral during its execution. The ROM code uses 9 Kbytes located at the beginning of the SYSRAM to store its read and write data. The ROM code stores the boot context in the first 512 bytes of SYSRAM: this boot context contains several information (such as the selected boot device) and pointers to the ROM code services (used for secure boot authentication). The ROM code loads the FSBL just after the boot context, into the remaining 247 Kbytes of SYSRAM, and eventually branches the Cortex®-A7 core 0 execution to this FSBL.
STM32MP15 ROM代码主要在执行过程中将SYSRAM配置为安全外围设备。 ROM代码使用位于SYSRAM开头的9 KB存储其读取和写入数据。 ROM代码将引导上下文存储在SYSRAM的前512个字节中:此引导上下文包含一些信息(例如选定的引导设备)和指向ROM代码服务的指针(用于安全引导身份验证)。 ROM代码在引导上下文之后立即将FSBL加载到剩余的247 KB SYSRAM中,并最终将Cortex®-A7core 0执行分支到该FSBL。
最后编辑:SteveChen 更新时间:2024-09-18 14:37