IUn*_*own 17 cpu virtualbox virtualization windows-xp
我在 Windows 8 主机 VirtualBox 中有一个 XP 来宾。客机透明地显示与主机相同的处理器(i5 2500k)。但是,大多数安装程序无法识别此处理器,并且无法继续说明不受支持的处理器。
有没有办法让客人认为这是旧处理器?如果我没记错,VMWare 有 CPU 屏蔽功能,那么在 virtualbox 中是否有类似的东西?
Cri*_*itu 21
您需要设置VBoxInternal/CPUM/HostCPUID虚拟机的额外数据。这将使 VirtualBox向来宾报告CPUID指令的自定义结果。根据 EAX 寄存器的值,此指令返回有关处理器的信息 - 例如供应商、类型、系列、步进、品牌、缓存大小、功能(MMX、SSE、SSE2、PAE、HTT)等。 更多结果你弄错了,欺骗客人的机会就越大。
您可以使用该vboxmanage setextradata命令来配置虚拟机。例如,
vboxmanage setextradata WinXP VBoxInternal/CPUM/HostCPUID/80000003/ebx 0x50202952
Run Code Online (Sandbox Code Playgroud)
将使 CPUID 返回 50202952 ???? 在 EBX 寄存器中,当 EAX 设置为 80000003 时调用????。(从现在开始,十六进制数将被写成 0xNN 或 NNh。)
如果 EAX 为 0(或 AMD 上的 80000000h),CPUID 将在寄存器 EBX、EDX、ECX 中以 ASCII 字符串形式返回供应商(注意顺序)。对于 AMD CPU,它们如下所示:
| Register | Value | Description |
|----------|------------|--------------------------------|
| EBX | 6874_7541h | The ASCII characters "h t u A" |
| ECX | 444D_4163h | The ASCII characters "D M A c" |
| EDX | 6974_6E65h | The ASCII characters "i t n e" |
Run Code Online (Sandbox Code Playgroud)
(取自AMD CPUID 规范,“CPUID Fn0000_0000_E”小节)
如果您连接 EBX、EDX 和 ECX,您将获得AuthenticAMD.
如果您有 Bash 和传统的 Unix 实用程序,则可以使用以下命令轻松设置供应商:
vm='WinXP' # UUID works as well
# The vendor string needs to have 12 characters!
vendor='AuthenticAMD'
if [ ${#vendor} -ne 12 ]; then
exit 1
fi
ascii2hex() { echo -n 0x; od -A n --endian little -t x4 | sed 's/ //g'; }
registers=(ebx edx ecx)
for (( i=0; i<${#vendor}; i+=4 )); do
register=${registers[$(($i/4))]}
value=`echo -n "${vendor:$i:4}" | ascii2hex`
# set value to an empty string to reset the CPUID, i.e.
# value=""
for eax in 00000000 80000000; do
key=VBoxInternal/CPUM/HostCPUID/${eax}/${register}
vboxmanage setextradata "$vm" $key $value
done
done
Run Code Online (Sandbox Code Playgroud)
如果EAX为80000002h、80000003h、80000004h,CPUID返回EAX、EBX、ECX、EDX寄存器中品牌字符串的16个ASCII字符,共3*16=48个字符;字符串以空字符结尾。请注意,此功能是在 Pentium 4 处理器中引入的。这是品牌字符串在奔腾 4 处理器上的外观:
| EAX Input Value | Return Values | ASCII Equivalent |
|-----------------|-----------------|------------------|
| 80000002h | EAX = 20202020h | " " |
| | EBX = 20202020h | " " |
| | ECX = 20202020h | " " |
| | EDX = 6E492020h | "nI " |
|-----------------|-----------------|------------------|
| 80000003h | EAX = 286C6574h | "(let" |
| | EBX = 50202952h | "P )R" |
| | ECX = 69746E65h | "itne" |
| | EDX = 52286D75h | "R(mu" |
|-----------------|-----------------|------------------|
| 80000004h | EAX = 20342029h | " 4 )" |
| | EBX = 20555043h | " UPC" |
| | ECX = 30303531h | "0051" |
| | EDX = 007A484Dh | "?zHM" |
|-----------------|-----------------|------------------|
Run Code Online (Sandbox Code Playgroud)
(取自英特尔架构指令集扩展编程参考,第 2.9 小节,“CPUID 指令”,表 2-30。? 是空字符(数值 0)。)
如果你把结果放在一起,你会得到 Intel(R) Pentium(R) 4 CPU 1500MHz?.
如果您有 Bash 和传统的 Unix 实用程序,则可以使用以下命令轻松设置品牌:
vm='WinXP' # UUID works as well
# The brand string needs to have 47 characters!
# The null terminator is added automatically
brand=' Intel(R) Pentium(R) 4 CPU 1500MHz'
if [ ${#brand} -ne 47 ]; then
exit 1
fi
ascii2hex() { echo -n 0x; od -A n --endian little -t x4 | sed 's/ //g'; }
eax_values=(80000002 80000003 80000004)
registers=(edx ecx ebx eax)
for (( i=0; i<${#brand}; i+=4 )); do
eax=${eax_values[$((${i} / 4 / 4))]}
register=${registers[$((${i} / 4 % 4 ))]}
key=VBoxInternal/CPUM/HostCPUID/${eax}/${register}
value=`echo -n "${brand:$i:4}" | ascii2hex`
# set value to an empty string to reset the CPUID, i.e.
# value=""
vboxmanage setextradata "$vm" $key $value
done
Run Code Online (Sandbox Code Playgroud)
如果您有 Windows 命令提示符,则可以通过运行以下命令将品牌设置为Intel(R) Core(TM)2 CPU 6600 @ 2.40 GHz1:
set vm=your-vm-name-or-uuid
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000002/eax 0x65746e49
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000002/ebx 0x2952286c
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000002/ecx 0x726f4320
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000002/edx 0x4d542865
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000003/eax 0x43203229
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000003/ebx 0x20205550
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000003/ecx 0x20202020
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000003/edx 0x20202020
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000004/eax 0x30303636
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000004/ebx 0x20402020
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000004/ecx 0x30342e32
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000004/edx 0x007a4847
Run Code Online (Sandbox Code Playgroud)

1这些HostCPUID值取自 VirtualBox 错误报告#7865。
这是一种允许将主机 CPU 精确伪装为特定 CPU 而不是尝试猜测必要设置的方法。您需要访问在该主机 CPU 上运行 VirtualBox 的机器,以便您可以转储其cpuid寄存器(最好选择与您的实际 CPU 作为模型的架构相当相似的架构)。如果你手头没有,你可以四处打听(例如,我在 Reddit 上取得了成功)。
从要模拟的 CPU 创建一个“模型”文件:
vboxmanage list hostcpuids > i7_6600U
Run Code Online (Sandbox Code Playgroud)运行以下脚本将模型文件(i7_6600U此处)加载到 VBox VM 的定义中(my_vm_name此处):
vboxmanage list hostcpuids > i7_6600U
Run Code Online (Sandbox Code Playgroud)就是这样,您现在可以运行您的 VM 并享受伪装的 CPU(注意:您只需要运行一次上述脚本)。
如果您需要回滚 CPU 伪装,您可以使用vboxmanage modifyvm $vm --cpuidremove $leaf上述循环中的每个叶子(man vboxmanage是您的朋友)。
这对我来说已经完美运行了几个月,在运行 VBox 5.1.22 的 Ubuntu 17.04 主机上将 Kaby Lake CPU (i7_7500U) 伪装成 Skylake CPU (i7_6600U)。该方法应该适用于任何主机操作系统,前提是您可以为该操作系统创建与上面的小 bash 脚本等效的脚本。
| 归档时间: |
|
| 查看次数: |
29082 次 |
| 最近记录: |