Mam gościa XP w VirtualBox, hoście Windows 8. Gość pokazuje procesor transparentnie tak samo jak host (i5 2500k). Jednak większość instalatorów nie rozpoznaje tych procesorów i nie informuje o nieobsługiwanym procesorze.
Czy istnieje sposób, aby oszukać gościa, że jest to stary procesor? Jeśli poprawnie pamiętam, VMWare ma funkcję maskowania procesora, czy jest coś podobnego w virtualbox?
windows-xp
virtualbox
cpu
virtualization
Nieznany
źródło
źródło
Odpowiedzi:
Podstawy VirtualBox i CPUID
Musisz ustawić
VBoxInternal/CPUM/HostCPUID
ekstradane maszyny wirtualnej. Spowoduje to, że VirtualBox będzie raportował niestandardowe wyniki dla instrukcji CPUID dla gościa. W zależności od wartości rejestru EAX instrukcja ta zwraca informacje o procesorze - takie jak dostawca, typ, rodzina, stopień, marka, rozmiar pamięci podręcznej, funkcje (MMX, SSE, SSE2, PAE, HTT) itp. Więcej wyników ty się przeklinasz, tym większe są szanse na oszukanie gościa.Możesz użyć
vboxmanage setextradata
polecenia, aby skonfigurować maszynę wirtualną. Na przykład,spowoduje, że CPUID zwróci 50202952₍₁₆₎ w rejestrze EBX, gdy zostanie wywołany z EAX ustawionym na 80000003₍₁₆₎. (Od tej chwili liczby szesnastkowe będą zapisywane jako 0xNN lub NNh.)
Ustawianie ciągu dostawcy procesora
Jeśli EAX ma wartość 0 (lub 80000000h na AMD), CPUID zwraca dostawcę jako ciąg ASCII w rejestrach EBX, EDX, ECX (zwróć uwagę na kolejność). W przypadku procesora AMD wyglądają następująco:
(Zaczerpnięte ze specyfikacji AMD CPUID , podsekcja „CPUID Fn0000_0000_E”)
Jeśli połączysz EBX, EDX i ECX, otrzymasz
AuthenticAMD
.Jeśli masz Bash i tradycyjne narzędzia uniksowe, możesz łatwo ustawić producenta za pomocą następujących poleceń:
Ustawianie ciągu marki procesora
Jeśli EAX to 80000002h, 80000003h, 80000004h, CPUID zwraca 16 znaków ASCII łańcucha marki w rejestrach EAX, EBX, ECX, EDX, łącznie 3 * 16 = 48 znaków; ciąg jest zakończony znakiem zerowym . Zauważ, że ta funkcja została wprowadzona w procesorach Pentium 4. Oto jak ciąg marki może wyglądać na procesorze Pentium 4:
(Zaczerpnięte z Rozszerzenia zestawu instrukcji architektury Intel Programowanie , podrozdział 2.9, „Instrukcja CPUID”, tabela 2-30. ☠ jest znakiem pustym (wartość liczbowa 0).)
Jeśli złożysz wyniki razem, otrzymasz
Intel(R) Pentium(R) 4 CPU 1500MHz☠
.Jeśli masz Bash i tradycyjne narzędzia uniksowe, możesz łatwo ustawić markę za pomocą następujących poleceń:
Jeśli masz wiersz polecenia systemu Windows, możesz ustawić markę na
Intel(R) Core(TM)2 CPU 6600 @ 2.40 GHz
1 , uruchamiając:1 Te
HostCPUID
wartości zostały zaczerpnięte z raportu VirtualBox bug # 7865 .źródło
's/ //g'
--cpuid
podkomenda wymaga wartości dla rejestru EAX.Oto podejście, które pozwala maskaradować procesor hosta dokładnie jako konkretny procesor zamiast próbować odgadnąć niezbędne ustawienia. Będziesz potrzebował dostępu do maszyny z VirtualBox na CPU hosta, abyś mógł zrzucić jego
cpuid
rejestry (prawdopodobnie najlepiej wybrać architekturę, która jest dość podobna do architektury twojego CPU jako modelu). Jeśli nie masz ręki, możesz zapytać (na przykład odnoszę sukcesy na Reddicie).Utwórz plik „modelowy” z procesora, który chcesz emulować:
Uruchom następujący skrypt, aby załadować plik modelu (
i7_6600U
tutaj) do definicji maszyny wirtualnej VBox (my_vm_name
tutaj):To wszystko, możesz teraz uruchomić swoją maszynę wirtualną i cieszyć się maskaradowym procesorem (uwaga: powyższy skrypt wystarczy uruchomić tylko raz).
Jeśli kiedykolwiek będziesz musiał cofnąć maskaradę procesora, możesz użyć
vboxmanage modifyvm $vm --cpuidremove $leaf
dla każdego z liści w powyższej pętli (man vboxmanage
jest twoim przyjacielem).Działa to dla mnie bezbłędnie przez kilka miesięcy, udając procesor Kaby Lake (i7_7500U) jako Skylake (i7_6600U) na hoście Ubuntu 17.04 z VBox 5.1.22. Podejście to powinno działać na każdym systemie operacyjnym hosta, pod warunkiem, że można utworzyć odpowiednik powyższego skryptu bash dla tego systemu operacyjnego.
źródło
0000000b
i00000017
(włącznie) i uruchamia je jeden po drugim, dziękivboxmanage modifyvm my_vm_name --cpuidset <line>
czemu można to łatwo zrobić ręcznie, ponieważ jest to jednorazowe.