
文章目录MPS2 AN521 tfm_s RAM 布局Secure RAM 总体布局TFM_BSS 内部对象分区私有数据启动时的 RAM 初始化RAM 地址和安全边界MPS2 AN521 tfm_s RAM 布局当前tfm_s使用 Secure RAM 的0x38000000到0x380FFFFF分配给 Non-Secure 的 RAM 从0x28100000开始。下面的地址和大小来自build_an521_ninja/bin/tfm_s.map表中的地址是运行时 VMA。Secure RAM 总体布局区域起始地址大小结束地址作用tfm_bl2_shared_data0x380000000x4000x380003FFBL2 和 TF-M 共享启动数据ER_TFM_SP_PS_BSS0x380004000xA000x38000DFFProtected Storage 运行时数据msp_stack0x38000E000x7F80x380015F7TF-M 启动 MSP 栈主体msp_stack_seal_res0x380015F80x80x380015FFSecure stack seal 保留区.heap0x380016000x2000x380017FFTF-M C heapER_TFM_SP_ITS_DATA0x380018000x400x3800183FITS 初始数据ER_TFM_SP_ITS_BSS0x380018400x2600x38001A9FITS 运行时数据ER_TFM_SP_CRYPTO_DATA0x38001AA00x200x38001ABFCrypto 初始数据ER_TFM_SP_CRYPTO_BSS0x38001AC00x7F000x380099BFCrypto 运行时数据和 mbedTLS 缓冲区TFM_DATA0x380099C00xA00x38009A5FTF-M 核心和平台全局数据TFM_BSS0x38009A600x17E00x3800B23F分区运行时对象和全局 BSS0x3800B240之后直到 Secure RAM 末尾0x380FFFFF没有被当前链接结果使用。实际占用会随分区、日志级别和加密配置变化。TFM_BSS 内部对象链接脚本在.TFM_BSS中先放分区和服务运行时池再放各类 BSS 对象对象起始地址大小结束地址ER_PART_RT_POOL0x38009A600xA00x38009AFFER_SERV_RT_POOL0x38009B000x300x38009B2FNon-Secure Agent TZ 栈0x38009B400x15A00x3800B0DFSPM 和平台全局 BSS0x3800B0E0其余空间0x3800B23FER_PART_RT_POOL和ER_SERV_RT_POOL的起止符号由链接脚本导出rom_loader.c用它们分配struct partition_t和struct service_t。Non-Secure Agent TZ 的栈由自动生成的load_info_ns_agent_tz.c提供。分区私有数据TF-M 每个分区有独立的 DATA 和 BSS 输出段。DATA 的初始值位于 FlashBSS 只分配 RAM.ER_TFM_SP_ITS_DATA : ALIGN(TFM_LINKER_PT_PROT_PART_PRIVATE_DATA_ALIGNMENT) { *tfm_*partition_its.*:(SORT_BY_ALIGNMENT(.data*)) } RAM AT FLASH .ER_TFM_SP_ITS_BSS (NOLOAD) : ALIGN(TFM_LINKER_PT_PROT_PART_PRIVATE_DATA_ALIGNMENT) { *tfm_*partition_its.*:(SORT_BY_ALIGNMENT(.bss*)) } RAM这些区域按分区私有数据对齐宏对齐便于 TF-M 的 MPU 或平台隔离代码使用Image$$PT_*_PRIVATE_DATA_START/END符号建立访问边界。启动时的 RAM 初始化startup_an521.c进入__cmsis_start后根据链接脚本生成的 copy table 和 zero table 初始化 RAMER_TFM_SP_ITS_DATA、ER_TFM_SP_CRYPTO_DATA和TFM_DATA从 Flash 复制到对应的 RAM 地址。ER_TFM_SP_PS_BSS、ER_TFM_SP_ITS_BSS、ER_TFM_SP_CRYPTO_BSS、TFM_BSS等区域清零。msp_stack、stack seal 保留区和 heap 使用NOLOAD不会从镜像复制内容。当前 copy table 和 zero table 位于 Flash 的.ER_TFM_CODE尾部具体表项可在tfm_s.map的LONG (LOADADDR(...))和LONG (ADDR(...))中看到。RAM 地址和安全边界Secure RAM 的起始0x38000000同时保存 BL2 与 TF-M 的共享数据。TF-M 初始化隔离边界时会把 Secure RAM、Non-Secure RAM、分区私有数据和共享数据分别配置到 SAU、MPC、PPC 或 MPU 的区域中。共享数据区由tfm_core_validate_boot_data()检查避免它与 Non-Secure 数据区重叠。