文章目录
- [MPS2 AN521 BL2 RAM 布局](#MPS2 AN521 BL2 RAM 布局)
MPS2 AN521 BL2 RAM 布局
RAM 地址
BL2 使用 Secure RAM alias,基地址是 S_RAM_ALIAS_BASE = 0x38000000。region_defs.h 将 BL2 的 RAM 定义为:
text
BL2_DATA_START = 0x38000000
BL2_DATA_SIZE = 0x00200000
因此 BL2 可用 RAM 范围是 0x38000000 到 0x381FFFFF,总大小 2 MB。链接脚本 platform/ext/common/gcc/tfm_common_bl2.ld 中的 MEMORY 定义如下:
ld
RAM (rwx) : ORIGIN = BL2_DATA_START, LENGTH = BL2_DATA_SIZE
已分配区域
以下地址和大小来自当前 build_an521_ninja/bin/bl2.map。表中的地址是运行时 VMA;.data 的初始值仍然保存在 Flash 中,启动代码会把它复制到表中的 RAM 地址。
| 段 | RAM 起始地址 | 大小 | RAM 结束地址 | 作用 |
|---|---|---|---|---|
.tfm_bl2_shared_data |
0x38000000 |
0x400,1 KB |
0x380003FF |
BL2 与 TF-M 之间的共享数据 |
.data |
0x38000400 |
0x48 |
0x38000447 |
已初始化的可写全局变量 |
.bss |
0x38000448 |
0x36C0 |
0x38003B07 |
未初始化的全局变量和静态变量 |
| 对齐填充 | 0x38003B08 |
0x18 |
0x38003B1F |
段对齐空间 |
.msp_stack |
0x38003B20 |
0x1800,6 KB |
0x3800531F |
BL2 主栈 |
.heap |
0x38005320 |
0x1000,4 KB |
0x3800631F |
BL2 堆 |
.heap 之后直到 0x381FFFFF 的空间没有被当前 BL2 链接结果使用。
各段内容
共享数据
链接脚本预留 .tfm_bl2_shared_data,大小由 BOOT_TFM_SHARED_DATA_SIZE 定义为 0x400。该区域位于 RAM 起始位置,用于 BL2 和后续 TF-M 固件共享启动数据,不能作为普通 BL2 变量空间使用。
.data
.data 使用 > RAM AT > FLASH 放置。当前 map 中的地址如下:
text
VMA:0x38000400
LMA:0x1000C080
大小:0x48
LMA 是镜像中保存初始值的位置,VMA 是 BL2 运行时访问变量的位置。启动代码根据链接脚本生成的 copy table,将 .data 从 LMA 复制到 VMA。
.bss
.bss 不在 Flash 中保存初始数据,启动代码根据 zero table 将这段 RAM 清零。当前 .bss 中可以看到以下较大的对象:
| 对象 | 大小 |
|---|---|
mbedtls_mem_buf |
0x2000,8 KB |
sector_buffers |
0x1000,4 KB |
| MCUboot loader 状态和临时缓冲区 | 由多个对象组成 |
镜像验签使用的 mbedTLS 缓冲区、MCUboot 的镜像加载状态和 Flash sector 缓冲区都在 .bss 中分配。
栈和堆
region_defs.h 定义 BL2 的主栈大小为 BL2_MSP_STACK_SIZE = 0x1800,堆大小为 BL2_HEAP_SIZE = 0x1000。链接脚本分别创建 .msp_stack 和 .heap,两者都是 NOLOAD 段,不需要从 Flash 装载内容。
当前链接结果中,栈顶为 0x38005320,堆顶为 0x38006320。Cortex-M 启动时使用栈顶作为初始 MSP。
相关文件
text
platform/ext/target/arm/mps2/an521/partition/region_defs.h
platform/ext/common/gcc/tfm_common_bl2.ld
build_an521_ninja/bin/bl2.map