VirtualBox, Windows 8 호스트에 XP 게스트가 있습니다. 게스트는 프로세서를 호스트와 투명하게 동일하게 표시합니다 (i5 2500k). 그러나 대부분의 설치 관리자는이 프로세서를 인식하지 못하고 지원되지 않는 프로세서를 계속 언급하지 않습니다.
이것이 오래된 프로세서라고 생각하도록 손님을 속일 수있는 방법이 있습니까? VMWare에 CPU 마스킹 기능이 있다고 올바르게 기억한다면 virtualbox에도 비슷한 것이 있습니까?
답변
VirtualBox 및 CPUID 기본 사항
VBoxInternal/CPUM/HostCPUID
가상 머신 의 추가 데이터 를 설정해야 합니다. 이렇게하면 VirtualBox가 CPUID 명령에 대한 사용자 정의 결과를 게스트에게보고합니다. EAX 레지스터의 값에 따라이 명령어는 공급 업체, 유형, 제품군, 스테핑, 브랜드, 캐시 크기, 기능 (MMX, SSE, SSE2, PAE, HTT) 등과 같은 프로세서에 대한 정보를 반환합니다. 더 많은 결과 맹 글링, 손님을 속일 확률이 높습니다.
vboxmanage setextradata
명령을 사용하여 가상 머신을 구성 할 수 있습니다 . 예를 들어
vboxmanage setextradata WinXP VBoxInternal/CPUM/HostCPUID/80000003/ebx 0x50202952
EAX를 80000003₍₁₆₎으로 설정하여 호출하면 CPUID가 EBX 레지스터에서 50202952₍₁₆₎를 반환합니다. (이후 16 진 숫자는 0xNN 또는 NNh로 기록됩니다.)
CPU 공급 업체 문자열 설정
EAX가 0 (또는 AMD의 경우 80000000h)이면 CPUID는 공급 업체를 레지스터 EBX, EDX, ECX (순서에 따라)에 ASCII 문자열로 반환합니다. AMD CPU의 경우 다음과 같습니다.
| 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
CPU 브랜드 문자열 설정
EAX가 80000002h, 80000003h, 80000004h 인 경우 CPUID는 브랜드 문자열의 ASCII 문자 16 개를 레지스터 EAX, EBX, ECX, EDX (총 3 * 16 = 48 자)로 반환합니다. 문자열은 널 문자로 종료됩니다 . 이 기능은 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 Architecture Instruction Set Extensions Programming Reference , 2.9, “CPUID Instruction”, 표 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 GHz
1 로 설정할 수 있습니다 .
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 개HostCPUID
값은 버추얼 버그 리포트에서 찍은 # 7865 .
답변
다음은 필요한 설정을 추측하지 않고 호스트 CPU를 특정 CPU로 정확하게 가장 할 수있는 방법입니다. 해당 호스트 CPU에서 VirtualBox를 실행하는 컴퓨터에 액세스해야 cpuid
레지스터를 덤프 할 수 있습니다 (실제 CPU의 모델과 유사한 아키텍처를 선택하는 것이 가장 좋습니다). 당신이 한 사람이 없다면, 주위에 물어볼 수 있습니다 (예를 들어 Reddit에서 성공했습니다).
-
에뮬레이션하려는 CPU에서 “모델”파일을 만듭니다.
vboxmanage list hostcpuids > i7_6600U
- 대상 호스트에서 수정하려는 VM이 실행되고 있지 않은지 확인하십시오. 만일을 대비하여 백업을 원할 수도 있습니다.
-
다음 스크립트를 실행하여 모델 파일 (
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
-
이제 VM을 실행하고 가장 된 CPU를 즐길 수 있습니다 (참고 : 위 스크립트를 한 번만 실행하면 됨).
CPU 가장 무도회를 롤백해야하는 경우 vboxmanage modifyvm $vm --cpuidremove $leaf
위 루프의 각 리프에 사용할 수 있습니다 ( man vboxmanage
친구입니다).
이것은 VBox 5.1.22를 실행하는 Ubuntu 17.04 호스트에서 Skylake one (i7_6600U)로 Kaby Lake CPU (i7_7500U)를 가장하여 몇 달 동안 완벽하게 작동했습니다. 해당 OS에 대해 위의 작은 bash 스크립트와 동등한 것을 만들 수 있다면 모든 호스트 OS에서 접근 방식이 작동해야합니다.