2011-08-30 1 views
4

CPUID를 사용하려하지만 일부 문자열이 첨부되어 있습니다. sandpile.org's CPUID page에 따르면 CPUID 표준 기능 0000_0004h 이상은 MISC_ENABLE.LCMV 플래그가 0으로 설정된 경우에만 작동합니다.이 플래그는 모델 별 레지스터 (MSR) 1A0의 비트 22입니다. 외관상으로는,이 한계는 Windows NT의 버그로 인한 것입니다 (Microsoft에서 일을 쉽게 해주셔서 감사합니다.)).CPUID : 일부 기능의 경우 MISC_ENABLE.LCMV를 0으로 설정해야하는 이유는 무엇입니까? 임시로 덮어 쓸 수 있습니까?

CPUID 0000_0001h (ecx 플래그, 비트 3)로 LCMV 플래그가 있는지 테스트 할 수 있습니다. 그것이 있다고 가정하면, 정확히 무엇이며, CPUID에 왜 그렇게 영향을 미칩니 까? MSR 1A0은 읽기/쓰기 레지스터 또는 읽기 전용입니까? 이러한 특수 용도 레지스터는 어셈블리 코드를 사용하여 읽거나 쓰는 방법은 무엇입니까?

레지스터가 기술적으로 읽기/쓰기 인 경우 원래 설정으로 복원하기 전에 CPUID 명령어 기간 동안 비트 22를 0으로 재설정해도 안전합니까? 또는 잘못 설정된 경우 (즉, 사용하도록 설정 한 경우)

마지막으로 sandpile은 "이 수준은 MISC_ENABLE.LCMV가 0으로 설정된 경우에만 사용 가능합니다."라는 문구를 사용합니다. 이는 Windows NT 버그 때문입니다. 이런 이유로 표준 수준의 묶음을 특별히 비활성화하면 CPUID 수준 0000_000h의 eax 레지스터 (지원되는 최대 표준 수준)의 출력에 반영됩니까?

Phew ... 나는 그것에 대해 생각합니다.

답변

4

요청한 모든 정보가 포함되어 있으므로 Intel® 64 and IA-32 Architectures Software Developer’s Manuals을 다운로드 할 수 있습니다.

CPUID 0000_0001h (ecx 플래그, 비트 3)로 LCMV 플래그가 있는지 테스트 할 수 있습니다. 그것이 있다고 가정하면, 정확히 무엇이며, CPUID에 왜 그렇게 영향을 미칩니 까? 이 비트가 1로 설정되면, "CPUID.00H은 EAX에서의 최대 값을 리턴로 (Vol. 3B B-17 참조)

플래그의 전체 이름은"제한 CPUID MAXVAL "이고 그 효과를 말한다 [7 : 0] 3의 ".

MSR 1A0은 읽기/쓰기 레지스터 또는 읽기 전용입니까?

Intel 설명서 (주의 사항 1 개 포함)에 따라 읽기/쓰기.

이러한 특수 용도 레지스터는 어셈블리 코드를 사용하여 읽거나 쓰는 방법이 어떻습니까?

당신은 RDMSR 사용하여 읽기

(권을. 2B 4-301)와 WRMSR 사용하여 쓰기 (권을. 2B 4-505), 그러나 그들이 (리얼 모드 또는 특권 레벨 0 중 하나에서 실행해야하는 점에 유의 일명 커널 방법).

레지스터가 기술적으로 읽기/쓰기 인 경우 CPUID 명령어의 지속 기간 동안 비트 22를 원래 설정으로 복원하기 전에 비트 22를 0으로 재설정하는 것이 안전합니까? 또는 잘못 설정된 경우 (즉, 사용하도록 설정 한 경우)

정말 버그가있는 운영 체제에서만 설정해야하며이 설정을 지워서는 안됩니다. 자신의 커널을 직접 작성한다면, NT의 버그 버전이나 이와 유사한 상황에서만 자신이 진술 한 것처럼 지우십시오.

마지막으로 sandpile은 "이 수준은 MISC_ENABLE.LCMV가 0으로 설정된 경우에만 활성화됩니다."이것은 Windows NT 버그로 인한 것입니다. 이런 이유로 표준 수준의 묶음을 특별히 비활성화하면 CPUID 수준 0000_000h의 eax 레지스터 (지원되는 최대 표준 수준)의 출력에 반영됩니까?

예 (위의 설명 참조).이 경우 3을 강제로 반환하도록 특별히 설계되었습니다.

+0

굉장합니다. 정말 고맙습니다! 귀하의 대답은 정말로 최선의 시나리오입니다. 왜냐하면 그것이 정말로 필요하지 않으면 비트가 설정되지 않기 때문입니다. Windows NT에서. Windows NT에서 CPUID와 잘 작동하지 않는 일부 (대부분 직교) 프로세서 기능이 활성화되었음을 알 수있었습니다. 나는 그것이 사실이 아니기 때문에 기쁘다. :) –

2

위의 매우 포괄적 인 답변에 추가 할 내용이 조금 있습니다. (I 코멘트로 추가 한 것입니다,하지만 난 아직 주석을 추가 할 수 없습니다.) 인텔 엔지니어는 작은 포맷/맞춤법을 수정하여 거기에서 인용 https://software.intel.com/en-us/forums/topic/306523?language=en#comment-1590394에서이 문제에 대한 몇 가지 더 역사적인 세부 사항을 제공 :

일부 BIOS 버전에는 사용자가 다음 재부팅 후에 CPUID가 지원할 최대 값 (또는 리프 색인)을 제한 할 수있는 메뉴 설정이 있습니다. BIOS는 Windows NT 4.0의 설치 프로그램에 버그가 있었고 CPUID가 그 이상을 지원한다고보고하면 블루 스크린을 표시하기 때문에 최종 사용자가 Microsoft Windows * NT 4.0 설치 문제를 해결할 수 있도록하기위한 목적으로 만이 옵션을 제공했습니다 BIOS 옵션을 사용하여 CPUID EAX maxvalue를 3으로 제한하려면 Windows NT 4.0 설치 목적으로 만 필요합니다. 다른 모든 상황에서 BIOS는 CPUID EAX 최대 값을 제한하지 않도록 구성되어야합니다.

CPUID가 3보다 높은 잎을 지원하지 않는 제한으로 제한되어있는 경우 Intel Pentium 4 이상의 프로세서에서 리프 3도 지원되지 않으므로 리프 4를보고하도록 CPUID를 요청하면 CPUID에서 데이터가 수신됩니다 잎 2 (가장 높은 잎 색인)에. 소프트웨어가 유효하지 않은 EAX 입력 값 (예 : 리프 인덱스)으로 CPUID를 실행하면 CPUID는 현재 런타임 구성에서 지원하는 가장 높은 리프를보고합니다.

또한, 문제의 MSR 플래그는 인텔 ® 64 및 IA-32 아키텍처 소프트웨어 개발자 설명서의 현재에서 "IA32_MISC_ENABLE.BOOT_NT4 [비트 (22)]"(2014 월) 판이라고합니다. 나는 그들이 요즘 안전하게 무시할 수있는 유산 문제라는 것을 분명히하기 위해 언젠가는 이름을 바꾸겠다고 생각합니다.

관련 문제