arm64 上的 vCPU 特性选择¶
KVM/arm64 提供了两种机制,允许用户空间配置呈现给 guest 系统的 CPU 特性。
KVM_ARM_VCPU_INIT¶
KVM_ARM_VCPU_INIT
ioctl 接受一个特性标志的位图(struct kvm_vcpu_init::features
)。此接口启用的特性是选择加入的,可能会更改/扩展 UAPI。 有关 ioctl 控制的特性的完整文档,请参阅4.82 KVM_ARM_VCPU_INIT。
否则,KVM 支持的所有 CPU 特性都由架构 ID 寄存器描述。
ID 寄存器¶
Arm 架构指定了一系列ID 寄存器,用于描述 CPU 实现支持的一组架构特性。 KVM 将 guest 系统的 ID 寄存器初始化为系统支持的最大 CPU 特性集。ID 寄存器值在 KVM 中可以是 VM 范围的,这意味着这些值可以被 VM 中的所有 vCPU 共享。
KVM 允许用户空间通过 KVM_SET_ONE_REG
ioctl 将值写入 ID 寄存器,从而选择退出 ID 寄存器描述的某些 CPU 特性。在 VM 启动之前,即用户空间在 VM 中至少一个 vCPU 上调用 KVM_RUN
之前,ID 寄存器是可变的。 用户空间可以使用 KVM_ARM_GET_REG_WRITABLE_MASKS
发现 ID 寄存器中哪些字段是可变的。 有关更多详细信息,请参阅ioctl 文档。
允许用户空间按照 DDI0487J.a D19.1.3 'ID 寄存器中字段的 ID 方案原理' 中概述的架构规则限制或屏蔽 CPU 特性。 KVM 不允许 ID 寄存器值超过系统的能力。
警告
强烈建议用户空间在访问 vCPU 的其余 CPU 寄存器状态之前修改 ID 寄存器值。 KVM 可以使用 ID 寄存器值来控制特性模拟。 将 ID 寄存器修改与其他系统寄存器访问交错可能会导致不可预测的行为。