Arm 机密计算架构

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

在 Realm 世界中运行的监控程序称为 Realm 管理监控程序 (RMM),并实现 Realm 管理监控程序规范[1]。 监控程序的行为有点像虚拟机监控程序(例如,它在 EL2 中运行并管理在 Realm 世界中运行的访客的第 2 阶段页表等),但是大部分控制由在普通世界中运行的虚拟机监控程序处理。 普通世界虚拟机监控程序使用 RMM 规范定义的 Realm 管理接口 (RMI) 来请求 RMM 执行操作(例如,映射内存或执行 vCPU)。

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

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

Linux 作为 Realm 访客

要使 Linux 作为 Realm 中的访客运行,必须由 VMM 或在 Linux 之前在 Realm 中运行的引导加载程序提供以下内容

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

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

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

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

参考

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