Arm 机密计算架构

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

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

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

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

Linux 作为 Realm 访客

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

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

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

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

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

参考

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