s390 (IBM Z) Ultravisor 和受保护的虚拟机¶
摘要¶
受保护虚拟机 (PVM) 是 KVM 虚拟机,它不允许 KVM 访问虚拟机状态,如客户机内存或客户机寄存器。相反,PVM 主要由一个名为 Ultravisor (UV) 的新实体管理。UV 提供了一个 API,PVM 和 KVM 可以使用它来请求管理操作。
每个客户机以非保护模式启动,然后可能请求转换为保护模式。在转换时,KVM 会将客户机及其 VCPU 注册到 Ultravisor,并为运行它做好一切准备。
Ultravisor 将保护和解密客户机的引导内存(即内核/initrd)。它将在客户机运行时保护状态更改,如 VCPU 启动/停止和注入中断。
由于通常需要访问客户机的状态(例如 SIE 状态描述)才能运行虚拟机,因此 SIE 指令的行为发生了一些变化。引入了一种新的格式 4 状态描述,其中一些字段对于 PVM 具有不同的含义。SIE 出口被尽可能地最小化,以提高速度并减少暴露的客户机状态。
中断注入¶
中断注入由 Ultravisor 保护。由于 KVM 无法访问 VCPU 的低核(lowcores),注入通过格式 4 状态描述处理。
机器检查、外部、I/O 和重新启动中断均可在 SIE 进入时通过中断注入控制字段(偏移量 0x54)中的位注入。如果在注入时客户机 CPU 未启用中断,则会识别出有效性拦截。格式 4 状态描述在拦截数据块中包含字段,其中可以传输与中断相关的数据。
程序和服务调用异常有另一层保护;它们只能针对已被拦截到 KVM 中的指令进行注入。这些异常需要是 KVM 指令仿真的有效结果,例如,我们绝不能注入寻址异常,因为它们由 SIE 报告,因为 KVM 无法访问客户机内存。
掩码通知拦截¶
KVM 无法再拦截 lctl(g) 和 lpsw(e),以便在 PVM 启用特定类中断时收到通知。作为替代,引入了两个新的拦截码:一个表示 CRs 0、6 或 14 的内容已更改,指示不同的中断子类;另一个表示 PSW 位 13 已更改,指示已请求机器检查干预且现已启用。
指令仿真¶
对于 PVM 的格式 4 状态描述,SIE 指令已经比格式 2 解释了更多的指令。它无法解释所有指令,但需要将一些任务交给 KVM;因此,SIE 和 ultravisor 保护仿真输入和输出。
与 SIE 相关的控制结构提供了安全指令数据区 (SIDA)、拦截参数 (IP) 和安全拦截通用寄存器保存区。客户机 GR 和大部分指令数据(例如 I/O 数据结构)都经过过滤。指令数据在需要时复制到 SIDA 和从 SIDA 复制。客户机 GR 被放入/从安全拦截通用寄存器保存区检索。
只有模拟指令所需的 GR 值才会被复制到此保存区,并且真实的寄存器编号将被隐藏。
拦截参数状态描述字段仍然包含指令文本的字节,但是是预设的寄存器值而不是实际值。也就是说,每条指令总是使用相同的指令文本,以避免泄露客户机指令文本。这还意味着从虚拟机监控程序的角度来看,客户机在 r<n> 中拥有的寄存器内容可能在 r<m> 中。
安全指令数据区包含指令存储数据。指令数据,即由指令引用(例如 sclp 的 SCCB)的数据,通过 SIDA 移动。当指令被拦截时,SIE 将只允许该指令的数据和程序中断通过前面讨论的两个数据区移动到客户机。其他数据要么被忽略,要么导致有效性拦截。
指令仿真拦截¶
SIE 安全指令拦截有两种类型:普通类型和通知类型。普通安全指令拦截将使客户机等待被拦截指令类型的指令完成,即在 SIE 进入时,尝试使用 KVM 提供的数据完成指令的仿真。这可能是程序异常或指令完成。
通知类型拦截将客户机指令解释导致的客户机环境变化通知给 KVM。例如,store prefix 指令会识别出此类拦截,以提供新的低核位置。在 SIE 重新进入时,数据区中的任何 KVM 数据都会被忽略,并且执行继续,如同客户机指令已完成一样。因此,KVM 不允许注入程序中断。