s390 (IBM Z) 超级监管器和受保护虚拟机

概要

受保护虚拟机 (PVM) 是 KVM 虚拟机,不允许 KVM 访问虚拟机状态,如客户机内存或客户机寄存器。相反,PVM 主要由一个名为超级监管器 (UV) 的新实体管理。UV 提供一个 API,可供 PVM 和 KVM 使用以请求管理操作。

每个客户机都在非保护模式下启动,然后可以请求转换为保护模式。在转换时,KVM 向超级监管器注册客户机及其 VCPU,并准备好运行它所需的一切。

超级监管器将保护和解密客户机的启动内存(即内核/initrd)。它将保护状态更改,如 VCPU 的启动/停止和注入的中断,同时客户机正在运行。

由于通常需要访问客户机的状态(如 SIE 状态描述)才能运行虚拟机,因此 SIE 指令的行为发生了一些变化。引入了一种新的格式 4 状态描述,其中某些字段对于 PVM 具有不同的含义。SIE 退出被尽可能地最小化,以提高速度并减少暴露的客户机状态。

中断注入

中断注入由超级监管器保护。由于 KVM 无权访问 VCPU 的 lowcores,因此注入是通过格式 4 状态描述处理的。

机器检查、外部、IO 和重启中断都可以在 SIE 进入时通过中断注入控制字段(偏移量 0x54)中的一个位来注入。如果客户机 CPU 在注入时未启用中断,则会识别出有效性拦截。格式 4 状态描述在拦截数据块中包含一些字段,其中可以传输与中断相关的数据。

程序和服务调用异常具有另一层保护;它们只能为已被拦截到 KVM 中的指令注入。异常需要是 KVM 指令仿真的有效结果,例如,我们永远不能注入地址异常,因为它们由 SIE 报告,因为 KVM 无权访问客户机内存。

掩码通知拦截

KVM 不能再拦截 lctl(g) 和 lpsw(e) 以便在 PVM 启用某种中断类时收到通知。作为替代,引入了两个新的拦截代码:一个指示 CR 0、6 或 14 的内容已更改,指示不同的中断子类;另一个指示 PSW 位 13 已更改,指示已请求机器检查干预并且现在已启用。

指令仿真

对于 PVM 的格式 4 状态描述,SIE 指令已经解释了比格式 2 更多的指令。它不能解释每个指令,但需要将某些任务交给 KVM;因此,SIE 和超级监管器保护仿真输入和输出。

与 SIE 关联的控制结构提供了安全指令数据区 (SIDA)、拦截参数 (IP) 和安全拦截通用寄存器保存区。客户机 GR 和大多数指令数据(如 I/O 数据结构)都会被过滤。指令数据在需要时会复制到 SIDA 和从 SIDA 复制。客户机 GR 被放入/检索自安全拦截通用寄存器保存区。

只有仿真指令所需的 GR 值才会复制到此保存区,并且实际的寄存器号将被隐藏。

拦截参数状态描述字段仍然包含指令文本的字节,但带有预设的寄存器值而不是实际值。也就是说,每个指令始终使用相同的指令文本,以便不泄漏客户机指令文本。这也意味着客户机在 r<n> 中拥有的寄存器内容可能在虚拟机管理程序看来位于 r<m> 中。

安全指令数据区包含指令存储数据。指令数据,即指令引用的数据(如 sclp 的 SCCB),通过 SIDA 移动。当指令被拦截时,SIE 将只允许将此指令的数据和程序中断通过之前讨论的两个数据区移动到客户机。其他数据要么被忽略,要么导致有效性拦截。

指令仿真拦截

有两种类型的 SIE 安全指令拦截:普通类型和通知类型。普通的安全性指令拦截将使客户机等待拦截指令类型的指令完成,即在 SIE 进入时,它尝试使用 KVM 提供的数据完成指令的仿真。这可能是程序异常或指令完成。

通知类型拦截会通知 KVM 由于客户机指令解释导致的客户机环境更改。例如,对于存储前缀指令会识别出这样的拦截,以提供新的 lowcore 位置。在 SIE 重新进入时,数据区中的任何 KVM 数据都会被忽略,并且执行会继续,就像客户机指令已完成一样。出于这个原因,不允许 KVM 注入程序中断。