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 将从受保护的映射中删除物理页面,并将这些页面作为不受保护的页面提供。