Tengo un invitado XP en VirtualBox, host de Windows 8. El invitado muestra el procesador de forma transparente igual que el host (i5 2500k). Sin embargo, la mayoría de los instaladores no reconocen estos procesadores y no continúan declarando procesadores no compatibles.
¿Hay alguna manera de engañar al invitado para que piense que este es un procesador antiguo? Si recuerdo correctamente VMWare tenía una función de enmascaramiento de CPU, ¿hay algo similar en virtualbox?
windows-xp
virtualbox
cpu
virtualization
I Desconocido
fuente
fuente
Respuestas:
Conceptos básicos de VirtualBox y CPUID
VBoxInternal/CPUM/HostCPUID
Debe configurar los extradatos de la máquina virtual. Esto hará que VirtualBox informe los resultados personalizados para la instrucción CPUID al invitado. Dependiendo del valor del registro EAX, esta instrucción devuelve información sobre el procesador: cosas como proveedor, tipo, familia, pasos, marca, tamaño de caché, características (MMX, SSE, SSE2, PAE, HTT), etc. Cuantos más resultados usted destroza, mayor es la posibilidad de engañar al invitado.Puede usar el
vboxmanage setextradata
comando para configurar la máquina virtual. Por ejemplo,hará que CPUID devuelva 50202952₍₁₆₎ en el registro EBX, cuando se llame con EAX configurado en 80000003₍₁₆₎. (De ahora en adelante, los números hexadecimales se escribirán como 0xNN o NNh).
Establecer la cadena del proveedor de la CPU
Si EAX es 0 (o 80000000h en AMD), CPUID devuelve al proveedor como una cadena ASCII en los registros EBX, EDX, ECX (observe el pedido). Para una CPU AMD, se ven así:
(Tomado de la especificación AMD CPUID , subsección "CPUID Fn0000_0000_E")
Si concatena EBX, EDX y ECX, obtendrá
AuthenticAMD
.Si tiene Bash y las utilidades tradicionales de Unix, puede configurar fácilmente el proveedor con los siguientes comandos:
Establecer la cadena de marca de la CPU
Si EAX es 80000002h, 80000003h, 80000004h, CPUID devuelve 16 caracteres ASCII de la cadena de la marca en los registros EAX, EBX, ECX, EDX, totalizando 3 * 16 = 48 caracteres; la cadena termina con un carácter nulo . Tenga en cuenta que esta característica se introdujo con los procesadores Pentium 4. Así es como se puede ver la cadena de la marca en un procesador Pentium 4:
(Tomado de Intel Architecture Instruction Set Extensions Programming Reference , subsection 2.9, "CPUID Instruction", table 2-30. ☠ es el carácter nulo (valor numérico 0)).
Si pones los resultados juntos, obtendrás
Intel(R) Pentium(R) 4 CPU 1500MHz☠
.Si tiene Bash y las utilidades tradicionales de Unix, puede configurar fácilmente la marca con los siguientes comandos:
Si tiene un símbolo del sistema de Windows, puede establecer la marca en
Intel(R) Core(TM)2 CPU 6600 @ 2.40 GHz
1 ejecutando:1 Los
HostCPUID
valores se tomaron del informe de error de VirtualBox # 7865 .fuente
's/ //g'
--cpuid
subcomando requiere un valor para el registro EAX.Aquí hay un enfoque que permite enmascarar la CPU del host precisamente como una CPU específica en lugar de intentar adivinar las configuraciones necesarias. Necesitará acceso a una máquina que ejecute VirtualBox en esa CPU host para poder volcar sus
cpuid
registros (probablemente sea mejor elegir una arquitectura que sea razonablemente similar a la de su CPU real como modelo). Si no tiene uno a mano, puede preguntar (he tenido éxito en Reddit, por ejemplo).Cree un archivo "modelo" desde la CPU que desea emular:
Ejecute el siguiente script para cargar el archivo del modelo (
i7_6600U
aquí) en la definición de su VM VBox (my_vm_name
aquí):Eso es todo, ahora puede ejecutar su VM y disfrutar de la CPU enmascarada (nota: solo necesita ejecutar el script anterior una vez).
Si alguna vez necesita deshacer la mascarada de la CPU, puede usarla
vboxmanage modifyvm $vm --cpuidremove $leaf
para cada una de las hojas en el bucle anterior (man vboxmanage
es su amigo).Esto ha funcionado sin problemas durante un par de meses para mí, disfrazando una CPU Kaby Lake (i7_7500U) como una Skylake (i7_6600U) en un host Ubuntu 17.04 con VBox 5.1.22. El enfoque debería funcionar en cualquier sistema operativo host, siempre que pueda crear un equivalente del pequeño script bash anterior para ese sistema operativo.
fuente
0000000b
y00000017
(inclusive) y ejecutándolas una por unavboxmanage modifyvm my_vm_name --cpuidset <line>
para que esto se pueda hacer fácilmente a mano, ya que es único.