J'ai un invité XP dans VirtualBox, hôte Windows 8. L'invité montre le processeur de manière transparente comme l'hôte (i5 2500k). Cependant, la plupart des installateurs ne reconnaissent pas ces processeurs et ne parviennent pas à indiquer le processeur non pris en charge.
Existe-t-il un moyen de tromper l'invité en lui faisant croire qu'il s'agit d'un ancien processeur? Si je me souviens bien, VMWare avait une fonction de masquage CPU, y a-t-il quelque chose de similaire dans virtualbox?
windows-xp
virtualbox
cpu
virtualization
IUnknown
la source
la source
Réponses:
Bases de VirtualBox et CPUID
Vous devez définir les
VBoxInternal/CPUM/HostCPUID
extradata de la machine virtuelle. Cela fera que VirtualBox rapportera les résultats personnalisés de l' instruction CPUID à l'invité. En fonction de la valeur du registre EAX, cette instruction renvoie des informations sur le processeur - des choses comme le fournisseur, le type, la famille, la progression, la marque, la taille du cache, les fonctionnalités (MMX, SSE, SSE2, PAE, HTT), etc. vous mangle, plus les chances de tromper l'invité sont élevées.Vous pouvez utiliser la
vboxmanage setextradata
commande pour configurer la machine virtuelle. Par exemple,fera CPUID retourner 50202952₍₁₆₎ dans le registre EBX, quand appelé avec EAX réglé à 80000003₍₁₆₎. (Désormais, les nombres hexadécimaux seront écrits comme 0xNN ou NNh.)
Définition de la chaîne du fournisseur de CPU
Si EAX est 0 (ou 80000000h sur AMD), CPUID renvoie le vendeur sous forme de chaîne ASCII dans les registres EBX, EDX, ECX (notez la commande). Pour un processeur AMD, ils ressemblent à ceci:
(Tiré de la spécification AMD CPUID , sous-section "CPUID Fn0000_0000_E")
Si vous concaténez EBX, EDX et ECX, vous obtiendrez
AuthenticAMD
.Si vous avez Bash et les utilitaires Unix traditionnels, vous pouvez facilement définir le fournisseur avec les commandes suivantes:
Définition de la chaîne de marque du processeur
Si EAX est 80000002h, 80000003h, 80000004h, CPUID renvoie 16 caractères ASCII de la chaîne de marque dans les registres EAX, EBX, ECX, EDX, totalisant 3 * 16 = 48 caractères; la chaîne se termine par un caractère nul . Notez que cette fonctionnalité a été introduite avec les processeurs Pentium 4. Voici à quoi peut ressembler la chaîne de marque sur un processeur Pentium 4:
(Tiré de la référence de programmation des extensions de jeu d'instructions d'architecture Intel , sous-section 2.9, "Instruction CPUID", tableau 2-30. ☠ est le caractère nul (valeur numérique 0).)
Si vous mettez les résultats ensemble, vous obtiendrez
Intel(R) Pentium(R) 4 CPU 1500MHz☠
.Si vous avez Bash et les utilitaires Unix traditionnels, vous pouvez facilement définir la marque avec les commandes suivantes:
Si vous disposez d'une invite de commande Windows, vous pouvez définir la marque sur
Intel(R) Core(TM)2 CPU 6600 @ 2.40 GHz
1 en exécutant:1 Les
HostCPUID
valeurs sont extraites du rapport de bogue VirtualBox # 7865 .la source
's/ //g'
--cpuid
sous - commande nécessite une valeur pour le registre EAX.Voici une approche qui permet de masquer le CPU hôte avec précision en tant que CPU spécifique plutôt que d'essayer de deviner les paramètres nécessaires. Vous aurez besoin d'accéder à une machine exécutant VirtualBox sur ce CPU hôte afin de pouvoir vider ses
cpuid
registres (il est probablement préférable de choisir une architecture raisonnablement similaire à celle de votre CPU réel en tant que modèle). Si vous n'en avez pas sous la main, vous pouvez demander autour (j'ai eu du succès sur Reddit par exemple).Créez un fichier "modèle" à partir du CPU que vous souhaitez émuler:
Exécutez le script suivant pour charger le fichier modèle (
i7_6600U
ici) dans la définition de votre VM VBox (my_vm_name
ici):Voilà, vous pouvez maintenant exécuter votre machine virtuelle et profiter du processeur masqué (remarque: vous n'avez besoin d'exécuter le script ci-dessus qu'une seule fois).
Si jamais vous avez besoin de restaurer la mascarade du processeur, vous pouvez l'utiliser
vboxmanage modifyvm $vm --cpuidremove $leaf
pour chacune des feuilles de la boucle ci-dessus (man vboxmanage
c'est votre ami).Cela fonctionne parfaitement depuis quelques mois pour moi, masquant un processeur Kaby Lake (i7_7500U) comme un Skylake (i7_6600U) sur un hôte Ubuntu 17.04 exécutant la VBox 5.1.22. L'approche devrait fonctionner sur n'importe quel système d'exploitation hôte, à condition que vous puissiez créer un équivalent du petit script bash ci-dessus pour ce système d'exploitation.
la source
0000000b
et00000017
(inclus) et les exécuter un par unvboxmanage modifyvm my_vm_name --cpuidset <line>
afin que cela puisse facilement être fait à la main car il s'agit d'une opération unique.