这是一个非常经典的架构设计问题。简单来说,EL2 是专门为虚拟化“量身定做”的硬件层级

如果 Hypervisor(虚拟机监控器)运行在 EL1 或 EL3,都会遇到无法克服的逻辑矛盾或硬件限制。以下是详细原因:

1. 核心原因:权限层级必须“高人一等”

虚拟化的本质是**“管理”**。Hypervisor 需要管理多个 Guest OS(客户机操作系统)。

  • Guest OS 运行在 EL1:操作系统内核(如 Linux)天生需要运行在 EL1,因为它需要控制硬件资源(内存、中断、定时器等)。
  • Hypervisor 必须更高:如果你是管理者,你的权限必须大于被管理者。
    • 如果 Hypervisor 也运行在 EL1,它就和 Guest OS 平级了。同级的程序无法互相捕获指令、无法强制切换资源。
    • 结论:Hypervisor 必须运行在比 EL1 更高的层级,才能“抓得住”Guest OS 的敏感操作。

2. 硬件支持:EL2 自带“虚拟化魔法”

ARMv8/ARMv9 架构在 EL2 引入了专门的硬件机制,这些机制在 EL1 或 EL3 是不存在的,或者无法正确工作:

A. Stage-2 页表转换

这是虚拟化最核心的功能。

  • EL1 的视角:Guest OS 看到的物理地址其实是“假”的物理地址。
  • EL2 的魔法:EL2 拥有一套独立的页表,它负责把 Guest OS 的物理地址翻译成真实的机器物理地址。
  • 为什么不能在 EL1? 如果 Hypervisor 在 EL1,它和 Guest OS 共用一套页表系统,无法实现地址空间的隔离和重映射。
B. 陷阱与模拟
  • Guest OS 在 EL1 执行敏感指令(如关闭中断、刷新 TLB)时,硬件会自动触发异常,强行跳转到 EL2
  • Hypervisor 在 EL2 捕获这个异常,然后“假装”执行了指令,从而欺骗 Guest OS。
  • 为什么不能在 EL1? 硬件不会把 EL1 的指令陷阱到另一个 EL1 程序中,这在逻辑上是不可能的。

3. 为什么不运行在 EL3?

EL3 比 EL2 更高,为什么不用 EL3 做虚拟化?

  • 职责不同
    • EL3 (Secure Monitor):负责“安全”与“非安全”世界的切换。它的代码必须极其精简、可信,且常驻内存。
    • EL2 (Hypervisor):负责资源复用和隔离。
  • 性能问题:虚拟化需要频繁拦截 Guest OS 的操作(如 I/O 访问)。如果 Hypervisor 运行在 EL3,每次拦截都需要在 Non-secure 和 Secure 世界之间切换,这会带来巨大的性能开销和安全隐患。
  • 安全隔离:Hypervisor 通常属于“富执行环境”,代码量大,漏洞风险高。如果它运行在 EL3,一旦被攻破,整个系统的安全世界(包括指纹、密钥等)都会泄露。将虚拟化放在 EL2,可以将风险限制在非安全世界。

4. 为什么不运行在 EL0?

EL0 是用户模式,没有特权。

  • Hypervisor 需要配置 MMU、中断控制器(GIC)、定时器等硬件。
  • 这些系统控制寄存器只能在 EL1 或更高等级访问。EL0 根本没有权限操作这些资源。

形象的比喻

我们可以把异常等级比作公司的管理层级:

  • EL0 (User App)普通员工。干活,没有决策权。
  • EL1 (OS Kernel)部门经理。管理员工,分配部门内的资源(进程管理、内存管理)。
  • EL2 (Hypervisor)公司总经理/CEO。管理多个部门经理。
    • 如果总经理和部门经理平级(都在EL1),部门经理就不听指挥了。
    • 总经理有特殊的权力(Stage-2转换),可以把部门经理看到的资源(办公室)重新分配给其他人。
  • EL3 (Secure Monitor)审计署/安全局。他不参与公司的日常运营(不做虚拟化),只负责最核心的安全合规检查(安全世界切换)。

总结

Hypervisor 运行在 EL2 是因为:

  1. 必须高于 EL1:才能捕获和控制 Guest OS 的行为。
  2. 必须低于 EL3:为了性能和安全隔离,不能干扰安全监控程序。
  3. 硬件专属:ARM 架构专门在 EL2 设计了虚拟化扩展,这是 EL1 和 EL3 都无法替代的功能。
Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐