Eu tenho um convidado XP no VirtualBox, Windows 8 host. O convidado mostra o processador de forma transparente, igual ao host (i5 2500k). No entanto, a maioria dos instaladores não reconhece esses processadores e falha ao continuar declarando o processador não suportado.
Existe uma maneira de enganar o convidado a pensar que este é um processador antigo? Se bem me lembro, o VMWare tinha um recurso de mascaramento da CPU, há algo semelhante no virtualbox?
windows-xp
virtualbox
cpu
virtualization
IDesconhecido
fonte
fonte
Respostas:
Noções básicas sobre VirtualBox e CPUID
Você precisa definir os
VBoxInternal/CPUM/HostCPUID
extradados da máquina virtual. Isso fará o VirtualBox relatar resultados personalizados para a instrução CPUID ao convidado. Dependendo do valor do registro EAX, esta instrução retorna informações sobre o processador - itens como fornecedor, tipo, família, etapa, marca, tamanho do cache, recursos (MMX, SSE, SSE2, PAE, HTT), etc. Quanto mais resultados você mutilar, maiores as chances de enganar o hóspede.Você pode usar o
vboxmanage setextradata
comando para configurar a máquina virtual. Por exemplo,fará com que CPUID retorne 50202952₍₁₆₎ no registro EBX, quando chamado com EAX definido como 80000003₍₁₆₎. (A partir de agora, os números hexadecimais serão gravados como 0xNN ou NNh.)
Definindo a cadeia de fornecedores da CPU
Se EAX for 0 (ou 80000000h na AMD), o CPUID retornará o fornecedor como uma sequência ASCII nos registros EBX, EDX, ECX (observe o pedido). Para uma CPU AMD, eles se parecem com isso:
(Extraído da especificação CPUID da AMD , subseção "CPUID Fn0000_0000_E")
Se você concatenar EBX, EDX e ECX, você conseguirá
AuthenticAMD
.Se você possui o Bash e os utilitários tradicionais do Unix, pode configurar facilmente o fornecedor com os seguintes comandos:
Definindo a cadeia de caracteres da marca da CPU
Se EAX for 80000002h, 80000003h, 80000004h, CPUID retornará 16 caracteres ASCII da string da marca nos registros EAX, EBX, ECX, EDX, totalizando 3 * 16 = 48 caracteres; a cadeia é finalizada com um caractere nulo . Observe que esse recurso foi introduzido nos processadores Pentium 4. É assim que a string da marca pode parecer em um processador Pentium 4:
(Extraído da Referência de programação das extensões do conjunto de instruções da arquitetura Intel , subseção 2.9, "Instrução CPUID", tabela 2-30. ☠ é o caractere nulo (valor numérico 0).)
Se você juntar os resultados, obterá
Intel(R) Pentium(R) 4 CPU 1500MHz☠
.Se você possui o Bash e os utilitários tradicionais do Unix, pode definir facilmente a marca com os seguintes comandos:
Se você tiver um prompt de comando do Windows, poderá definir a marca como
Intel(R) Core(TM)2 CPU 6600 @ 2.40 GHz
1 executando:1 Os
HostCPUID
valores foram retirados do relatório de bug do VirtualBox # 7865 .fonte
's/ //g'
--cpuid
subcomando exige um valor para o registro EAX.Aqui está uma abordagem que permite mascarar a CPU host precisamente como uma CPU específica, em vez de tentar adivinhar as configurações necessárias. Você precisará acessar uma máquina executando o VirtualBox nessa CPU host para poder despejar seus
cpuid
registros (provavelmente é melhor escolher uma arquitetura que seja razoavelmente semelhante à da sua CPU atual como modelo). Se você não tem um em mãos, pode perguntar (eu tive sucesso no Reddit, por exemplo).Crie um arquivo "modelo" da CPU que você gostaria de emular:
Execute o script a seguir para carregar o arquivo de modelo (
i7_6600U
aqui) na definição da sua VM VBox (my_vm_name
aqui):É isso, agora você pode executar sua VM e aproveitar a CPU mascarada (nota: você só precisa executar o script acima uma vez).
Se você precisar reverter o disfarce da CPU, poderá usá-lo
vboxmanage modifyvm $vm --cpuidremove $leaf
para cada uma das folhas no loop acima (man vboxmanage
é seu amigo).Isso funcionou perfeitamente por alguns meses para mim, mascarando uma CPU Kaby Lake (i7_7500U) como Skylake (i7_6600U) em um host Ubuntu 17.04 executando o VBox 5.1.22. A abordagem deve funcionar em qualquer sistema operacional host, desde que você possa criar um equivalente ao pequeno script bash acima para esse sistema operacional.
fonte
0000000b
e00000017
(inclusive) e executá-las uma a uma,vboxmanage modifyvm my_vm_name --cpuidset <line>
para que isso possa ser feito facilmente à mão, pois é único.