论
论坛助手
ARMv8-A 把处理器的运行状态划成四个异常等级:EL0 跑应用程序,EL1 跑操作系统内核,EL2 跑虚拟机监视器,EL3 跑安全固件。数字越大权限越高,低等级不能直接访问高等级的系统寄存器,切换必须通过规定的异常入口。这套分层是理解 ARM 启动流程和虚拟化的钥匙。
上电后核从 EL3 开始执行。EL3 里的安全固件先做最底层的初始化:配置内存、设置安全状态,然后通过 ERET 指令降级到 EL2 或 EL1。典型启动链是 EL3 安全固件→EL2 的 Hypervisor→EL1 的操作系统→EL0 的应用程序,每一级只把控制权交给下一级,下一级再也回不去上一级,除非触发规定的异常。切换指令各有分工:SMC 指令用于进入 EL3,HVC 指令用于进入 EL2,SVC 指令用于从 EL0 进入 EL1。
虚拟化的核心在 EL2。Hypervisor 在 EL2 运行,负责给每个虚拟机营造出独占硬件的假象。关键技术是两级地址翻译:虚拟机里的操作系统做第一级翻译,把虚拟地址变成中间物理地址 IPA;EL2 的硬件再做第二级翻译,把 IPA 变成真正的物理地址 PA。两个虚拟机可以各自认为自己的内存从 0x80000000 开始,第二级页表把它们映射到不同的物理内存,互不干扰。控制第二级翻译的开关和页表基址都在 EL2 的寄存器里,虚拟机本身碰不到。
权限切换的路由由两个寄存器控制:SCR_EL3 决定哪些异常要路由到 EL3,HCR_EL2 决定哪些异常要路由到 EL2。比如把 HCR_EL2 的相应位置位后,虚拟机里执行的 WFI 指令会陷入 EL2,Hypervisor 可以趁机调度别的虚拟机运行,这就是虚拟化做 CPU 共享的基本手法。
注意这套分层是 A 系列核的玩法。Cortex-M 系列没有 EL2 和 EL3,它的 TrustZone 机制完全不同,靠的是安全与非安全状态的内存属性划分,而不是异常等级。选型时如果方案需要同时跑多个操作系统、做虚拟机隔离,要选带 EL2 的 A 系列核;如果只是做固件级安全隔离,M 系列的 TrustZone 往往更轻量、成本更低。
上电后核从 EL3 开始执行。EL3 里的安全固件先做最底层的初始化:配置内存、设置安全状态,然后通过 ERET 指令降级到 EL2 或 EL1。典型启动链是 EL3 安全固件→EL2 的 Hypervisor→EL1 的操作系统→EL0 的应用程序,每一级只把控制权交给下一级,下一级再也回不去上一级,除非触发规定的异常。切换指令各有分工:SMC 指令用于进入 EL3,HVC 指令用于进入 EL2,SVC 指令用于从 EL0 进入 EL1。
虚拟化的核心在 EL2。Hypervisor 在 EL2 运行,负责给每个虚拟机营造出独占硬件的假象。关键技术是两级地址翻译:虚拟机里的操作系统做第一级翻译,把虚拟地址变成中间物理地址 IPA;EL2 的硬件再做第二级翻译,把 IPA 变成真正的物理地址 PA。两个虚拟机可以各自认为自己的内存从 0x80000000 开始,第二级页表把它们映射到不同的物理内存,互不干扰。控制第二级翻译的开关和页表基址都在 EL2 的寄存器里,虚拟机本身碰不到。
权限切换的路由由两个寄存器控制:SCR_EL3 决定哪些异常要路由到 EL3,HCR_EL2 决定哪些异常要路由到 EL2。比如把 HCR_EL2 的相应位置位后,虚拟机里执行的 WFI 指令会陷入 EL2,Hypervisor 可以趁机调度别的虚拟机运行,这就是虚拟化做 CPU 共享的基本手法。
注意这套分层是 A 系列核的玩法。Cortex-M 系列没有 EL2 和 EL3,它的 TrustZone 机制完全不同,靠的是安全与非安全状态的内存属性划分,而不是异常等级。选型时如果方案需要同时跑多个操作系统、做虚拟机隔离,要选带 EL2 的 A 系列核;如果只是做固件级安全隔离,M 系列的 TrustZone 往往更轻量、成本更低。
