我如何转储此寄存器 MSR - IA32_VMX_PROCBASED_CTLS2 的输出,以查看是否支持/启用不受限制的客户模式?
背景就是好奇心。
我知道在 mac osx 上 Docker 需要无限制模式/无限制访客模式,在 Windows 上可能也需要。
我读过
https://software.intel.com/en-us/forums/virtualization-software-development/topic/277958
“有一系列 MSR 可告诉您给定的 CPU 是否支持无限制客户机的‘1’设置和许多其他虚拟化功能。特定的 MSR 是 IA32_VMX_PROCBASED_CTLS2,我相信无限制客户机是辅助进程控制 VMCS 字段中的位 7。”
我不知道 powershell 或 wmic 是否会显示它。我知道 win7 32 位有调试(可能显示它?知道调试可以显示一些寄存器,我曾经使用调试将值移动到 AX 寄存器中),但我使用的是 win7 64 位,没有调试。
也许懂一点汇编的人可以展示需要安装什么汇编程序以及运行哪些行来显示该寄存器的位?
我对汇编还不够了解,无法在 stackoverflow 上提问,因为现阶段我只是从“超级用户”的角度来看待这个问题。
答案1
我假设 Windows 中有一些可用于读取和写入 MSR 的工具,因为 Linux 中也有一个这样的工具msr 工具。该工具为您提供两个命令rdmsr
和wrmsr
。可以使用命令读取 MSR 的值rdmsr
。以下是关联针对 Window 的这样一个工具。
有两种基于处理器的 VM 执行控制 - 基于主处理器的 VM 执行控制 ( IA32_VMX_PROCBASED_CTLS
) 和基于辅助处理器的 VM 执行控制 ( IA32_VMX_PROCBASED_CTLS2
)。无限制客户模式位是 的一部分IA32_VMX_PROCBASED_CTLS2
(如问题中所述)。仅当 的第 63 位为 1 时,基于辅助处理器的 VM 执行控制才可用。IA32_VMX_PROCBASED_CTLS
(请参阅第 24.6.2 节英特尔 SDM)
因此,我们需要先IA32_VMX_PROCBASED_CTLS
使用读取rdmsr
并检查第 63 位是否为 1。如果位值为1然后IA32_VMX_PROCBASED_CTLS2
使用相同的命令读取。
两个 MSR 的地址如下:
IA32_VMX_PROCBASED_CTLS - 482H
IA32_VMX_PROCBASED_CTLS2 - 48BH
Linux 中的命令:
sudo rdmsr 0x482 // To read IA32_VMX_PROCBASED_CTLS
sudo rdmsr 0x48B // To read IA32_VMX_PROCBASED_CTLS2
该命令的输出rdmsr
是十六进制的,我们可以手动将其转换为二进制,或者可以使用一些在线工具。
现在我们需要检查不受限制的访客的位,IA32_VMX_PROCBASED_CTLS2
为此,我们需要检查位置 7 的位(如下图所示)。
添加完整的IA32_VMX_PROCBASED_CTLS2
结构,以防您也想检查其他选项。