Ich habe einen XP-Gast in VirtualBox, Windows 8-Host. Der Gast zeigt den Prozessor transparent wie den Host (i5 2500k). Die meisten Installationsprogramme erkennen diese Prozessoren jedoch nicht und geben keinen nicht unterstützten Prozessor an.
Gibt es eine Möglichkeit, den Gast zu täuschen, dass dies ein alter Prozessor ist? Wenn ich mich richtig erinnere, hatte VMWare eine CPU-Maskierungsfunktion. Gibt es etwas Ähnliches in virtualbox?
windows-xp
virtualbox
cpu
virtualization
IUnbekannt
quelle
quelle
Antworten:
Grundlagen zu VirtualBox und CPUID
Sie müssen die
VBoxInternal/CPUM/HostCPUID
Extradaten der virtuellen Maschine festlegen. Dadurch meldet VirtualBox dem Gast benutzerdefinierte Ergebnisse für die CPUID- Anweisung. Abhängig vom Wert des EAX-Registers gibt dieser Befehl Informationen über den Prozessor zurück - beispielsweise Hersteller, Typ, Familie, Stepping, Marke, Cache-Größe, Funktionen (MMX, SSE, SSE2, PAE, HTT) usw. Je mehr Ergebnisse Wenn Sie verstümmeln, ist die Wahrscheinlichkeit höher, den Gast zu täuschen.Mit dem
vboxmanage setextradata
Befehl können Sie die virtuelle Maschine konfigurieren. Beispielsweise,bewirkt, dass die CPUID 50202952₍₁₍ im EBX-Register zurückgibt, wenn der Aufruf mit EAX auf 80000003₍₁₍ eingestellt ist. (Hexadezimalzahlen werden ab sofort als 0xNN oder NNh geschrieben.)
Festlegen der Zeichenfolge des CPU-Herstellers
Wenn EAX 0 ist (oder 80000000h bei AMD), gibt die CPUID den Anbieter als ASCII-Zeichenfolge in den Registern EBX, EDX, ECX zurück (beachten Sie die Reihenfolge). Für eine AMD-CPU sehen sie folgendermaßen aus:
(Aus der AMD CPUID-Spezifikation , Unterabschnitt "CPUID Fn0000_0000_E")
Wenn Sie EBX, EDX und ECX verketten, erhalten Sie
AuthenticAMD
.Wenn Sie über Bash und die traditionellen Unix-Dienstprogramme verfügen, können Sie den Anbieter mit den folgenden Befehlen einfach festlegen:
Festlegen der Zeichenfolge der CPU-Marke
Wenn EAX 80000002h, 80000003h, 80000004h ist, gibt die CPUID 16 ASCII-Zeichen der Markenzeichenfolge in den Registern EAX, EBX, ECX, EDX zurück, insgesamt 3 * 16 = 48 Zeichen; Die Zeichenfolge wird mit einem Nullzeichen abgeschlossen . Beachten Sie, dass diese Funktion mit Pentium 4-Prozessoren eingeführt wurde. So kann die Markenzeichenfolge auf einem Pentium 4-Prozessor aussehen:
(Entnommen aus der Programmierreferenz für Intel Architecture Instruction Set Extensions , Unterabschnitt 2.9, "CPUID Instruction", Tabelle 2-30. ☠ ist das Nullzeichen (numerischer Wert 0).)
Wenn Sie die Ergebnisse zusammenfassen, erhalten Sie
Intel(R) Pentium(R) 4 CPU 1500MHz☠
.Wenn Sie über Bash und die traditionellen Unix-Dienstprogramme verfügen, können Sie die Marke mit den folgenden Befehlen einfach festlegen:
Wenn Sie eine Windows-Eingabeaufforderung haben, können Sie die Marke auf
Intel(R) Core(TM)2 CPU 6600 @ 2.40 GHz
1 setzen, indem Sie Folgendes ausführen:1 Die
HostCPUID
Werte wurden aus dem VirtualBox-Fehlerbericht Nr. 7865 übernommen .quelle
's/ //g'
--cpuid
Unterbefehl einen Wert für das EAX-Register erfordert.Hier ist ein Ansatz, der es ermöglicht, die Host-CPU genau als bestimmte CPU zu tarnen, anstatt zu versuchen, die erforderlichen Einstellungen zu erraten. Sie benötigen Zugriff auf eine Maschine, auf der VirtualBox auf dieser Host-CPU ausgeführt wird, damit Sie ihre
cpuid
Register sichern können (wahrscheinlich ist es am besten, eine Architektur zu wählen, die der Ihrer tatsächlichen CPU als Modell ziemlich ähnlich ist). Wenn Sie keine zur Hand haben, können Sie sich umsehen (ich hatte zum Beispiel Erfolg bei Reddit).Erstellen Sie eine "Modell" -Datei aus der CPU, die Sie emulieren möchten:
Führen Sie das folgende Skript aus, um die Modelldatei (
i7_6600U
hier) in die Definition Ihrer VBox-VM (my_vm_name
hier) zu laden :Jetzt können Sie Ihre VM ausführen und die maskierte CPU genießen (Hinweis: Sie müssen das obige Skript nur einmal ausführen).
Wenn Sie jemals die CPU-Maskerade zurücksetzen müssen, können Sie
vboxmanage modifyvm $vm --cpuidremove $leaf
für jedes der Blätter in der obigen Schleife (man vboxmanage
ist Ihr Freund) verwenden.Dies funktioniert für mich seit ein paar Monaten einwandfrei und maskiert eine Kaby Lake-CPU (i7_7500U) als eine Skylake-CPU (i7_6600U) auf einem Ubuntu 17.04-Host mit VBox 5.1.22. Der Ansatz sollte auf jedem Host-Betriebssystem funktionieren, vorausgesetzt, Sie können ein Äquivalent des obigen kleinen Bash-Skripts für dieses Betriebssystem erstellen.
quelle
0000000b
und00000017
(einschließlich) zu überspringen und sievboxmanage modifyvm my_vm_name --cpuidset <line>
einzeln durchlaufen zu lassen.