Virtualbox, как заставить конкретный процессор для гостя

У меня есть XP гость в VirtualBox, Windows 8 хост. Гость показывает процессор прозрачно такой же как хост (i5 2500k). Однако большинство установщиков не распознают эти процессоры и не могут продолжать заявлять о неподдерживаемом процессоре.

есть ли способ обмануть гостя, думая, что это старый процессор? Если я правильно recalll компания VMware была маскирования процессора, есть что-то подобное в VirtualBox?

23
задан IUnknown
07.02.2023 9:56 Количество просмотров материала 2633
Распечатать страницу

2 ответа

VirtualBox и CPUID основы

вам нужно установить VBoxInternal/CPUM/HostCPUID дополнительные данные виртуальной машины. Это сделает VirtualBox сообщить пользовательские результаты для CPUID инструкция к гостю. В зависимости от значения регистра EAX, эта инструкция возвращает информацию о процессоре - такие вещи, как производитель, тип, семейство, шаг, Марка, размер кэша, функции (MMX, SSE, SSE2, PAE, HTT) и т.д. Чем больше результатов вы калечить, тем выше шансы обмануть гостя.

можно использовать vboxmanage setextradata команда для настройки виртуальной машины. Например,

vboxmanage setextradata WinXP VBoxInternal/CPUM/HostCPUID/80000003/ebx 0x50202952

сделает с CPUID возвращает 50202952₍₁₆₎ в регистре регистр ebx, когда позвонили с еах значение 80000003₍₁₆₎. (Отныне шестнадцатеричные числа будут записываться как 0xNN или nnh.)

установка строки поставщика процессора

если EAX равен 0 (или 80000000h на AMD), CPUID возвращает поставщика в виде строки ASCII в регистрах EBX, EDX, ECX (обратите внимание на заказ). Для процессора AMD они выглядят следующим образом:

| 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" |

(взято из спецификация AMD CPUID, подраздел "CPUID Fn0000_0000_E")

если объединить EBX, EDX и ECX, получится AuthenticAMD.

если у вас есть Bash и традиционные утилиты Unix, вы можете легко установить поставщика с помощью следующих команд:

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

настройки бренда строку ЦП

если Eax является 80000002h, 80000003h, 80000004h, с CPUID возвращает 16 символов ASCII строки наименование в регистрах еах, ebx потенциально ЕКБ, эдр, на общую сумму 3 * 16 = 48 символов; строка завершается символом null. Обратите внимание, что эта функция была введена с процессорами Pentium 4. Вот как может выглядеть фирменная строка на процессоре Pentium 4:

| 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"           |
|-----------------|-----------------|------------------|

(взято из Intel Архитектура Набор Инструкций Расширения Справочник По Программированию, подраздел 2.9 "инструкция CPUID", таблица 2-30. ☠ является символ (числовое значение 0).)

если вы положите результаты вместе, вы получите Intel(R) Pentium(R) 4 CPU 1500MHz☠.

если у вас есть Bash и традиционные утилиты Unix, вы можете легко установить бренд с помощью следующих команд:

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

если у вас есть командная строка Windows, вы можете установить бренд в Intel(R) Core(TM)2 CPU 6600 @ 2.40 GHz1 by running:

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

Computer: Intel(R) Core(TM)2 CPU 6600 @ 2.40 GHz

1HostCPUID значения были взяты из отчета об ошибке VirtualBox #7865.

18
отвечен Cristian Ciupitu 2023-02-08 17:44

здесь подход который позволяет замаскировать C. P. U. хозяина точно как специфическое C. P. U. вернее чем попытка переосмыслить необходимые установки. Вам понадобится доступ к машине под управлением VirtualBox на этом хост-процессоре, чтобы вы могли сбросить его cpuid регистры (вероятно, лучше выбрать архитектуру, которая достаточно похожа на архитектуру вашего фактического процессора в качестве модели). Если у вас нет под рукой, вы можете спросить (у меня был успех на Reddit, например).

  1. создайте файл "model" из процессора, который вы хотите эмулировать:

    vboxmanage list hostcpuids > i7_6600U
    
  2. на целевом хосте убедитесь, что виртуальная машина, которую вы хотите изменить, не запущена; вы можете сделать резервную копию на всякий случай.
  3. запустите следующий скрипт, чтобы загрузить файл модели (i7_6600U здесь) в определение вашего VBOX VM (my_vm_name здесь):

    #!/bin/bash
    vm=my_vm_name
    model_file=i7_6600U
    
    egrep -e '^[[:digit:]abcdef]{8} ' $model_file |
    while read -r line; do
        leaf="0x`echo $line | cut -f1 -d' '`"
        # VBox doesn't like applying leaves between the below boundaries so skip those:
        if [[ $leaf -lt 0x0b || $leaf -gt 0x17 ]]; then
            echo "Applying: $line"
            vboxmanage modifyvm $vm --cpuidset $line
        fi
    done
    
  4. вот и все, теперь вы можете запустить виртуальную машину и наслаждаться маскарадным процессором (Примечание: необходимо только выполнить вышеупомянутый сценарий однажды).

Если вам когда-нибудь понадобится откатить маскарад процессора, вы можете использовать vboxmanage modifyvm $vm --cpuidremove $leaf для каждого из листьев в петле выше (man vboxmanage - твой друг).

это работает безупречно в течение нескольких месяцев для меня, маскируя Каби озеро CPU (i7_7500U) как Skylake one (i7_6600U) на Ubuntu 17.04 хост под управлением VBox 5.1.22. Этот подход должен работать на любой ОС, при условии, что вы можете создать эквивалент сценария little bash выше для этой ОС.

5
отвечен sxc731 2023-02-08 20:01

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх