У меня гость XP в VirtualBox, хост Windows 8. Гость показывает процессор прозрачно так же, как хост (i5 2500k). Однако большинство установщиков не распознают эти процессоры и не могут продолжить указывать неподдерживаемый процессор.
Есть ли способ обмануть гостя, думая, что это старый процессор? Если я правильно помню, у VMWare была функция маскировки процессора, есть ли что-то похожее в virtualbox?
windows-xp
virtualbox
cpu
virtualization
IUnknown
источник
источник
Ответы:
Основы VirtualBox и CPUID
Вам необходимо установить
VBoxInternal/CPUM/HostCPUID
дополнительные данные виртуальной машины. Это заставит VirtualBox сообщать гостю о пользовательских результатах для инструкции CPUID . В зависимости от значения регистра EAX, эта инструкция возвращает информацию о процессоре - такие как поставщик, тип, семейство, степпинг, бренд, размер кэша, функции (MMX, SSE, SSE2, PAE, HTT) и т. Д. Чем больше результатов ты будешь калечить, тем выше шансы одурачить гостя.Вы можете использовать
vboxmanage setextradata
команду для настройки виртуальной машины. Например,заставит CPUID возвращать 50202952₍₁₆₎ в регистр EBX при вызове с EAX, установленным в 80000003₍₁₆₎. (С этого момента шестнадцатеричные числа будут записываться как 0xNN или NNh.)
Установка строки поставщика ЦП
Если EAX равен 0 (или 80000000h для AMD), CPUID возвращает поставщика в виде строки ASCII в регистрах EBX, EDX, ECX (обратите внимание на порядок). Для процессора AMD они выглядят так:
(Взято из спецификации AMD CPUID , подраздел «CPUID Fn0000_0000_E»)
Если вы объедините EBX, EDX и ECX, вы получите
AuthenticAMD
.Если у вас есть Bash и традиционные утилиты Unix, вы можете легко установить поставщика с помощью следующих команд:
Установка строки марки процессора
Если EAX равен 80000002h, 80000003h, 80000004h, CPUID возвращает 16 символов ASCII строки бренда в регистрах EAX, EBX, ECX, EDX, всего 3 * 16 = 48 символов; строка заканчивается нулевым символом . Обратите внимание, что эта функция была введена с процессорами Pentium 4. Вот как может выглядеть строка бренда на процессоре Pentium 4:
(Взято из Справочника по программированию расширений набора команд архитектуры Intel , подраздел 2.9, «Инструкция CPUID», таблица 2-30. ☠ - нулевой символ (числовое значение 0).)
Если вы сложите результаты вместе, вы получите
Intel(R) Pentium(R) 4 CPU 1500MHz☠
.Если у вас есть Bash и традиционные утилиты Unix, вы можете легко установить марку с помощью следующих команд:
Если у вас есть командная строка Windows, вы можете установить марку в
Intel(R) Core(TM)2 CPU 6600 @ 2.40 GHz
1 , запустив:1 В
HostCPUID
значении было взято из VirtualBox Сообщения об ошибке # 7865 .источник
's/ //g'
--cpuid
подкоманда требует значения для регистра EAX.Вот подход, который позволяет маскировать центральный процессор именно под конкретный процессор, а не пытаться угадать необходимые настройки. Вам понадобится доступ к машине с VirtualBox на этом хост-процессоре, чтобы вы могли выгружать его
cpuid
регистры (вероятно, лучше выбрать архитектуру, которая достаточно похожа на модель вашего фактического ЦП в качестве модели). Если у вас нет руки, вы можете поспрашивать (например, у меня был успех на Reddit).Создайте файл модели из процессора, который вы хотите эмулировать:
Запустите следующий скрипт, чтобы загрузить файл модели (
i7_6600U
здесь) в определение вашей виртуальной машины VBox (my_vm_name
здесь):Вот и все, теперь вы можете запустить свою виртуальную машину и наслаждаться маскарадным процессором (примечание: вам нужно запустить вышеупомянутый скрипт только один раз).
Если вам когда-нибудь понадобится откатить маскарад ЦП, вы можете использовать
vboxmanage modifyvm $vm --cpuidremove $leaf
для каждого из листьев в вышеуказанном цикле (man vboxmanage
это ваш друг).Для меня это работало безупречно в течение нескольких месяцев, маскируя процессор Kaby Lake (i7_7500U) под Skylake (i7_6600U) на хосте Ubuntu 17.04 с VBox 5.1.22. Подход должен работать на любой хост-ОС, при условии, что вы можете создать эквивалент маленького скрипта bash выше для этой ОС.
источник
0000000b
и00000017
(включительно) и пропуская их один за другим,vboxmanage modifyvm my_vm_name --cpuidset <line>
так что это можно легко сделать вручную, так как он одноразовый.