Arm Trusted Firmware能否直接访问物理内存?
Arm Trusted Firmware能否直接访问物理内存?
答案是肯定的,Arm Trusted Firmware(ATF)完全可以直接访问物理内存,尤其是像MMIO这类外设地址区域,我结合你提到的代码细节给你说明:
首先,我在arm-tf/include/lib/mmio.h里找到了MMIO访问的核心API,它的实现和Linux、OP-TEE OS等特权软件的思路类似,都是通过指针操作来完成IO读写:
static inline void mmio_write_32(uintptr_t addr, uint32_t value) { *(volatile uint32_t*)addr = value; } static inline uint32_t mmio_read_32(uintptr_t addr) { return *(volatile uint32_t*)addr; }
按照常规的内存访问逻辑,这里的addr应该是虚拟地址,由MMU转成物理地址后再执行读写操作。但ATF的特殊之处在于,它在执行的某些阶段(比如早期的BL1、BL2阶段)MMU可能还没有开启,或者对部分物理地址做了恒等映射(虚拟地址和物理地址完全相同),这时候就可以直接传入物理地址来访问MMIO。
你举的SMMUv3初始化的例子就是典型场景:
#define PLAT_FVP_SMMUV3_BASE UL(0x2b400000) smmuv3_init(PLAT_FVP_SMMUV3_BASE); int __init smmuv3_init(uintptr_t smmu_base) { /* Abort all incoming transactions */ if (smmuv3_security_init(smmu_base) != 0) return -1; // 后续初始化逻辑... }
这里直接把SMMUv3的物理基地址0x2b400000传给了初始化函数,内部通过上面的MMIO读写API直接访问这个物理地址,完全没问题——因为此时ATF运行的环境允许直接访问物理内存,不需要经过MMU的地址转换。
备注:内容来源于stack exchange,提问作者b3a1e
相关产品推荐
相关产品推荐

