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