文档目录架构 · 18 篇

平台控制设备

规定平台控制设备的端口映射 I/O 功能:宿主/客户机字节通道、关机端口和快照请求端口。

译自microsoft/nvx · doc/design/3.1-platform-control-device.md。技术细节以英文原文为准。

架构文档 > 3. 虚拟设备

表 3.1 列出了平台所使用的三个端口映射 I/O(PMIO)设备功能。

表 3.1. 平台控制设备功能。

端口 功能 架构用途
0xe9..0xeb 宿主/客户机字节通道 早期控制台数据、有界的宿主输入、恢复元数据、世代身份标识和宿主时间采样
0x604 关机 由客户机请求的进程终止,并附带状态字节
0x605 快照请求 由客户机发起的捕获以及恢复后的确认

PMIO 回调只执行有界的状态更新和通知。它们绝不会暂停虚拟处理器、排空设备、对内存做哈希或写文件;生命周期工作被推迟到虚拟机控制器和状态单元图上处理。

3.1.1 宿主/客户机字节通道

字节通道是客户机与宿主之间最简单的通路,每个微虚拟机都有一个字节通道。它取代了机器所省略的串口,并承载:

  • 客户机的控制台。内核从初始化的早期阶段(在探测任何驱动之前)就把启动消息写入该通道;除非配置了启动控制台,该通道同时也是带宿主输入的内核控制台。
  • 来自客户机代理的失败报告,包括控制控制台的失败。
  • 一次性的恢复数据包,它为被恢复的客户机提供修复时钟、处理器和内存所需的一切,以及用于刷新熵的新随机字节。
  • 宿主时间采样,客户机把它与自己的时钟配对,用于设置并校正自己的挂钟时间。
  • 世代 ID,即每个虚拟机进程独有的随机标识符。每个被恢复的进程都会获得一个新的,即使多个克隆从同一快照运行,客户机也能借此检测到自己已被恢复,并把自己与其他克隆区分开。

该通道有意不依赖 virtio 发现。客户机只有在内核解析了发现标记并探测了驱动之后才能找到它的 virtio 设备,而且其中的控制台是可选的。通过字节通道,一个在发现之前或期间失败、或者其 virtio 设备失败的客户机仍然可以报告该失败。VMM 在报告由客户机请求的退出之前也会排空该通道,因此客户机的最终输出不会被静默丢失;参见最终输出与退出状态。

该通道的协议同样极简:它不需要特性协商、客户机内存中的队列,也不需要中断线。每个输出字节就是一次端口写,客户机轮询状态端口获取输入。对通道端口的每次访问都是一次同步退出,VMM 会在客户机继续之前完成它,因此 VMM 在访问期间记录的宿主时间落在客户机前后两次时钟读取之间。这就限定了时间采样以及恢复数据包中 UTC 字段的误差。

如表 3.2 所示,字节通道的三个端口构成一个设备:一个数据端口、一个状态与记录选择器端口,以及一个时间采样窗口。

表 3.2. 字节通道端口。

端口 访问方式 行为
0xe9 读和写 原始字节输入和输出。控制台读操作消耗一个待处理字节,并把该次访问的其余部分零填充。选中某条记录后,1 字节、2 字节或 4 字节的读操作返回该记录的相应字节数,小端序,超出记录末尾的部分零填充。
0xea 读 状态位,见表 3.3
0xea 写 记录选择器:0xa5 选择一次性的恢复数据包,0xa6 选择 16 字节的世代 ID,0xa7 锁存一份新的时间采样,且不改变 0xe9 上的选择
0xeb 读 已锁存时间采样的后续字节,超出其末尾或没有锁存采样时零填充

表 3.3 列出了状态位。

表 3.3. 字节通道状态位。

状态位 含义
0 有待处理的宿主输入
1 有新的恢复数据包可用
2 恢复携带处理器目标
3 恢复携带内存目标
4 内存目标包含一个或多个扩展范围
5 世代 ID 选择器可用
6 时间采样窗口存在;始终置位
7 零

世代 ID 可以被反复选择,并在一个虚拟机进程的生命周期内保持稳定。恢复之后,客户机代理要求它与捕获前记录的 ID 不同,否则修复会失败。克隆的客户机代理还会把它作为恢复熵的一部分计入内核的随机数生成器,并把它暴露给工作负载运行时的恢复后钩子,从而使克隆原本会共享的随机数状态得到刷新。世代描述了被恢复的客户机如何检查该 ID,熵刷新则描述了它如何获得新的随机数。

时间采样窗口与数据端口分离,是因为客户机控制台驱动在定时器上下文中轮询状态并读取数据,因此控制台流上的采样可能与输入字节交错。客户机使用者会串行化其事务。客户机读取的每个字节都是一次端口退出,因此记录很小,每次退出读取四字节。

接收和发送缓冲区各自以 1 MiB 为界。输出溢出时丢弃最新的字节并发出限速的警告;输入在缓冲区满时通过不读取宿主端点来施加背压。待处理字节会被保存,因此捕获不会静默丢失 VMM 所拥有的 I/O。时间采样窗口不是已保存状态。

在快照边界或恢复后修复期间宿主输入被门控时,通道停止读取其宿主端点,对控制台读操作返回零,并清除输入待处理位。客户机输出、世代 ID、任何恢复数据包以及时间采样窗口仍然可用。

3.1.2 关机

写入关机端口的第一个字节成为随虚拟机断电请求一起携带的进程状态;读取返回全一。关机发起的是有序的虚拟机拆除,而不是模拟 PC 电源管理。关机与失败语义描述最终的排空与状态传播。

3.1.3 快照请求

向快照端口写入即请求捕获。写入零字节请求全新的暂存盘,写入非零首字节请求配对的暂存盘;暂存盘策略随延迟的边界请求一同传递。读取返回全一,该端口不报告捕获状态。

在没有配置快照目的地的情况下,写入会正常完成,客户机继续运行。在存在目的地的情况下,该设备最多允许一个待处理事务,合并重复的写入,并推迟完成足够长的时间,以便控制器在输出操作之后紧邻的那条指令边界上精确停止虚拟处理器。

在受门控的恢复之后,向同一端口写入即确认处理器、内存、时间、熵和工作负载状态均已修复。只有在 VMM 于该确认边界上停止之后,宿主输入才会被放行。