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 功能。 ID 暫存器在 VM 啟動之前是可變的,即使用者空間已經在 VM 中的至少一個 vCPU 上呼叫了 KVM_RUN。 使用者空間可以使用 KVM_ARM_GET_REG_WRITABLE_MASKS 發現 ID 暫存器中哪些欄位是可變的。 有關更多詳細資訊,請參閱ioctl 文件。
使用者空間可以根據架構在 DDI0487J.a D19.1.3 “ID 暫存器中欄位的 ID 方案原則”中概述的規則來限制或遮蔽 CPU 功能。 KVM 不允許 ID 暫存器值超過系統的功能。
警告
強烈建議使用者空間在訪問 vCPU 的其餘 CPU 暫存器狀態之前修改 ID 暫存器值。 KVM 可以使用 ID 暫存器值來控制功能模擬。 將 ID 暫存器修改與其他系統暫存器訪問交錯可能會導致不可預測的行為。