jumparch64切换进入 ATFBL31完整原理前置架构基础Preloader 运行环境AArch32ARM32、EL1 非安全世界Normal WorldATF BL31 运行环境AArch64ARM64、EL3 最高安全特权级Monitor 世界硬件限制ARMv8 芯片无法直接在 AArch32 EL1 跳转到 AArch64 EL3必须通过「软热复位 复位向量重定向」机制切换架构与异常级别核心寄存器c12,c0,2 是 MTK 定制系统控制寄存器专门控制复位后 CPU 架构、复位请求、复位向量基址。全局变量前置说明bl31_base_addr全局变量内存中存储 ATF BL31 镜像入口物理地址由 bldr_load_tee_part 加载完成后赋值rst_vector_base_addr复位向量寄存器映射地址写入该地址的值 CPU 热复位后第一条执行指令的地址。执行流程分析步骤1读取 ATF BL31 入口地址准备写入复位向量#define ATF_BOOT_ARG_ADDR (0x00100000) //MEMBASE 70MB, Size: 64KB #define ATF_HEADER_SIG_SIZE (0x240) #define BL31_VECTOR_SIZE (0x800) #define BL31_BASE (CFG_ATF_ROM_MEMADDR BL31_VECTOR_SIZE ATF_HEADER_SIG_SIZE) struct mem_info item[] { [PL_SRAM] { .start 0x100000, .size 0x12000, .name sram }, [PL_CACHE_SHARE] { .start 0x200000, .size 0x40000, .name cache share }, [PL_DRAMBUF] { .start PL_BOOTARG_BASE, .size PL_BOOTARG_MAX_SIZE, /* include 1MB boottags */ .name boottags }, [LK] { .start CFG_UBOOT_MEMADDR, .size 0x400000, .name LK }, [ATF] { .start PL_ATF_BASE, .size PL_ATF_MAX_SIZE, .name ATF }, [SSPM] { .start 0, .size 0, .name SSPM-reserved } }; //for init.s u32 bl31_base_addr BL31_BASE; u32 rst_vector_base_addr RVBADDRESS_CPU0; //直接从汇编就跳转到ATF了 LDR r5, bl31_base_addr ; r5 bl31_base_addr 变量自身地址 LDR r5,[r5] ; 从变量中取出 ATF 真实运行物理地址存入 r5前面 bldr_load_tee_part 加载 tee 分区时已经把 ATF 镜像拷贝到 DRAM 固定地址并将入口写入 bl31_base_addr现在 r5 保存的值 ATF BL31 程序入口。步骤2把 ATF 入口写入热复位向量基址LDR r6, rst_vector_base_addr ; r6 复位向量寄存器地址 LDR r6,[r6] ; 读取寄存器基址 str r5,[r6] ; 将 ATF 入口写入复位向量核心作用CPU 发生热复位warm reset时不会回到上电原始 BootROM而是从 rst_vector_base_addr 存放的地址取指执行此时我们提前把 ATF 入口塞进去复位后 CPU 直接跑 ATF。步骤3配置复位后 CPU 运行架构为 AArch64MRC p15,0,r6,c12,c0,2 ; 读取定制复位控制寄存器到 r6 orr r6, r6, #1 ; bit0置1复位后启用AArch64模式 MCR p15,0,r6,c12,c0,2 ; 写回寄存器 DSB ; 数据同步屏障确保寄存器配置落地 ISB ; 指令同步屏障刷新流水线寄存器bit定义bit01 AArch64、0 AArch32Preloader 当前是32位必须在复位前标记下次启动用64位否则复位后依旧是32位无法执行64位ATF。步骤4发起硬件热复位请求MRC p15,0,r6,c12,c0,2 ; 再次读取复位控制寄存器 orr r6, r6, #2 ; bit1置1触发warm热复位标记 MCR p15,0,r6,c12,c0,2 ; 写回寄存器 DSB ISBbit11 代表向芯片电源/复位控制器发送热复位请求热复位只重置CPU内核、流水线、寄存器不会清空DRAM内存已经加载在DRAM中的ATF镜像完整保留不会被擦除区别于冷复位上电复位冷复位会清空内存丢失加载的ATF。步骤5WFI 循环等待复位触发WFI_LOOP: WFI ; Wait For InterruptCPU进入低功耗暂停状态 B WFI_LOOP执行WFI后CPU停止执行当前32位Preloader代码等待硬件复位中断芯片复位控制器收到复位标记后立刻触发CPU热复位CPU流水线、通用寄存器全部清零但DRAM中ATF镜像完好保留复位后完整跳转过程CPU 完成热复位读取 rst_vector_base_addr 中预先存入的 ATF 入口地址读取架构配置bit01CPU自动切换到AArch64 64位执行状态硬件自动提升异常级别到EL3Monitor模式ATF专属最高权限从ATF BL31入口地址开始执行64位ATF代码。核心切换关键点不能直接跳转AArch32 EL1 无法分支/跳转到 AArch64 EL3架构与异常级别双重隔离只能靠复位切换热复位的优势DRAM数据不丢失Preloader提前加载好的ATF镜像不会被清空无需重新加载固件三层切换同步完成指令集AArch32 → AArch64异常级别EL1(Preloader) → EL3(ATF)安全世界普通世界 → Monitor安全监控世界安全设计意义EL3 是ARMv8硬件最高特权只有ATF能运行PreloaderBL2无权操作TEE、安全寄存器通过复位机制强制切换特权级形成硬件隔离边界Preloader漏洞无法直接篡改EL3安全逻辑复位向量由Preloader可控但ATF镜像本身经过之前 bldr_load_tee_part RSA验签即便向量被篡改非法ATF镜像也无法加载执行。