오늘날의 컴퓨팅 세계에서는 CPUID 명령어의 도입 덕분에 프로세서에 대한 자세한 정보를 얻는 것이 엄청나게 쉬워졌습니다. 이 기능은 인텔이 펜티엄과 SL 강화 486 프로세서를 처음 출시한 1993년에 등장하여 프로그래머가 프로세서 유형과 MMX, SSE와 같은 지원하는 기능을 쉽게 쿼리할 수 있게 되었습니다. CPUID 명령어가 일반화되기 전에 프로그래머들은 프로세서 유형을 식별하기 위해 몇 가지 고유한 방법을 사용했는데, 당시로서는 기술적으로 어려운 일이었습니다.
CPUID가 나오기 전에는 프로그래머들이 CPU 동작의 미묘한 차이점을 발견하기 위해 난해하다고 여겨졌던 기계어 코드에 의존했습니다.
80386 프로세서가 도입되면서 프로세서는 재시작할 때 EDX 레지스터를 통해 버전을 표시합니다. 그러나 이 정보는 재부팅 후에만 사용할 수 있었고 애플리케이션에서 이 값을 직접 읽을 수 있는 표준적인 방법이 없었습니다. 즉, 프로그래머는 다양한 특이한 수단을 사용하여 서로 다른 CPU를 식별해야 합니다. 예를 들어, 모토로라 680x0 시리즈 프로세서에는 CPUID 명령어가 전혀 없습니다. 개발자는 프로세서 유형을 결정하기 위해 몇 가지 특수한 지침을 사용해야 하며, 이러한 지침에는 특권 실행이 필요합니다. 이러한 맥락에서 68010 프로세서는 상태 레지스터의 MOVE 명령을 특권으로 표시하여 가상화 요구 사항을 준수합니다.
CPUID 명령어의 등장은 x86 아키텍처 프로그래머에게 편리함을 제공할 뿐만 아니라 ARM과 같은 다른 아키텍처의 설계에도 영향을 미칩니다. 이러한 아키텍처는 일반적으로 프로세서에 대한 기본 정보를 얻기 위해 CPUID와 유사한 레지스터를 제공합니다.
CPUID의 연산 코드는 0F A2입니다. 일반적으로 어셈블리 언어에서 CPUID 명령어는 인수가 필요하지 않습니다. 이는 반환할 주요 정보 범주를 결정하기 위해 암묵적으로 EAX 레지스터를 사용하기 때문입니다. 이 호출을 CPUID의 "리프"라고 합니다. Intel 용어에 따르면, 처음 CPUID가 호출될 때 EAX는 0으로 설정되어야 CPU가 지원하는 가장 높은 함수 매개변수를 얻을 수 있습니다.
확장 함수 정보를 얻으려면 CPUID 호출의 EAX의 최상위 비트를 1로 설정해야 합니다.
일반 컴퓨팅의 발달로 CPUID를 기반으로 얻은 많은 기본 리프의 효과적인 범위는 23h에 도달했습니다. CPUID에 대한 호출을 기반으로 제조업체 ID 및 다양한 프로세서 기능에 대한 지원과 같은 다양한 정보를 얻을 수 있습니다. 많은 경우, 반환된 정보는 공개 문서에 공개되지 않으므로 개발자는 경험과 문헌에 의존하여 프로세서의 비밀을 알아내야 합니다.
EAX가 0으로 설정되면 CPU는 제조업체 ID 문자열(EBX, EDX, ECX 레지스터에 순서대로 저장된 12자리 ASCII 문자열)을 반환합니다. 최신 정보에 따르면 표준 프로세서 제조업체 ID는 다음과 같습니다.
<저>EAX를 1로 설정하면 프로세서 스테핑, 모델, 시리즈 정보를 얻을 수 있으며, 이는 각 모델의 성능을 판단하는 데 중요합니다. 이는 프로세서 식별을 나타내며 EAX, EDX, ECX 레지스터에 있는 기능 플래그와 추가 기능 정보를 반환합니다.
모든 프로세서 정보는 제조업체마다 다르지만, 대부분의 경우 다른 제조업체에서는 호환성을 위해 인텔 값을 사용합니다.
이 방법의 등장으로 개발자는 프로세서의 물리적 수준을 명확하게 이해할 수 있습니다. 시간이 지남에 따라 이 기술은 점점 더 널리 사용되고 있으며, 따라서 전체 컴퓨팅 기술의 발전을 촉진하고 있습니다. 또한, 이를 통해 멀티코어 프로세서의 설계가 촉진되고 이후 프로세서 아키텍처의 지속적인 발전이 촉진됩니다.
프로세서 기술의 지속적인 발전으로 CPUID 명령어의 영향력이 점점 더 두드러지게 되었으며, 다양한 프로그램과 시스템에 중요한 하드웨어 정보를 제공하고 있습니다. 하지만 미래 기술이 더욱 발전함에 따라 우리는 의문을 품지 않을 수 없습니다. 하드웨어가 빠르게 변화하는 가운데 미래의 프로그래밍은 어떻게 이러한 하드웨어 특성을 더욱 지능적으로 이해하고 성능을 최적화할 수 있을까요?