Arm 机密计算架构

支持领域管理扩展 (RME) 的 Arm 系统包含相关硬件,允许以一种保护客户机代码和数据免受 Hypervisor 侵害的方式运行虚拟机 (VM) 客户机。它将旧的“两个世界”模型(普通世界和安全世界)扩展为四个世界:普通、安全、根和领域。Linux 随后也可以作为运行在领域世界中的监视器的客户机来运行。

运行在领域世界中的监视器被称为领域管理监视器 (RMM),并实现了领域管理监视器规范[1]。该监视器的作用类似于 Hypervisor(例如,它运行在 EL2 级别,并管理运行在领域世界中的客户机的第二阶段页表等),但是大部分控制权由运行在普通世界中的 Hypervisor 处理。普通世界 Hypervisor 使用 RMM 规范定义的领域管理接口 (RMI) 来请求 RMM 执行操作(例如映射内存或执行 vCPU)。

RMM 为客户机定义了一个环境,其中地址空间 (IPA) 被一分为二。下半部分受到保护——在此部分映射的任何内存都不能被普通世界看到,并且 RMM 限制了普通世界对此内存执行的操作(例如,如果没有客户机的配合,普通世界无法替换此区域中的页面)。上半部分是共享的,普通世界可以自由更改此区域中的页面,也能够在此区域中模拟 MMIO 设备。

运行在领域中的客户机还可以使用领域服务接口 (RSI) 与 RMM 通信,以请求其环境的更改或对其环境执行认证。特别是,它可以请求将受保护地址空间的区域在“RAM”和“EMPTY”之间(在任一方向上)进行转换。这允许领域客户机放弃内存以返回给普通世界,或从普通世界请求新内存。如果没有来自领域客户机的明确请求,RMM 将阻止普通世界进行这些更改。

Linux 作为领域客户机

要在领域内将 Linux 作为客户机运行,必须由 VMM 或在 Linux 之前运行在领域中的引导加载程序 (boot loader)提供以下内容

  • 在将控制权移交给 Linux 之前,描述给 Linux 的所有受保护 RAM(通过 DT 或 ACPI)都必须被标记为 RIPAS RAM。

  • MMIO 设备必须是不受保护的(例如由普通世界模拟)或标记为 RIPAS DEV。

  • 由普通世界模拟并在引导早期(特别是 earlycon)使用的 MMIO 设备必须在 IPA 的上半部分中指定。对于 earlycon,这可以通过在命令行上指定地址来实现,例如,IPA 大小为 33 位,模拟 UART 的基地址为 0x1000000:earlycon=uart,mmio,0x101000000

  • Linux 将使用跳板缓冲区与不受保护的设备进行通信。它会将一些受保护的内存转换为 RIPAS EMPTY,并期望能够在相同的 IPA 地址访问不受保护的页面,但设置了最高有效 IPA 位。其预期是 VMM 将从受保护的映射中移除物理页面,并提供这些页面作为不受保护的页面。

参考资料

[1] https://developer.arm.com/documentation/den0137/