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,
vboxmanage setextradata WinXP VBoxInternal/CPUM/HostCPUID/80000003/ebx 0x50202952
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:
| 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" |
(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:
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
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:
| 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" |
|-----------------|-----------------|------------------|
(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:
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
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:
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
1 Die HostCPUID
Werte wurden aus dem VirtualBox-Fehlerbericht Nr. 7865 übernommen .