CPUID는 인텔(Intel)과 AMD 등 x86 계열 마이크로프로세서에서 제공하는 명령어 집합 중 하나로, 프로세서의 고유 식별 정보와 지원 기능을 조회하는 기능을 수행한다. 이 명령은 소프트웨어가 실행 중인 CPU의 모델, 제조사, 클럭 속도, 캐시 크기, 지원 명령 집합(예: SSE, AVX) 등 다양한 정보를 프로그램적으로 얻을 수 있게 한다.
개요
- 명령어 형식:
CPUID는 어셈블리 언어에서cpuid명령어로 사용되며, EAX, EBX, ECX, EDX 레지스터에 입력값(함수 번호)과 출력값을 전달한다. - 주요 목적: 운영 체제와 응용 프로그램이 실행 환경에 맞는 최적화 코드를 선택하거나, 특정 CPU 기능을 활성화/비활성화하기 위한 정보를 제공한다.
역사
- 도입 배경: 초기 x86 프로세서에서는 모델별 차이를 확인하기 어려웠으며, 소프트웨어 호환성 문제를 해결하기 위해 프로세서 식별 메커니즘이 필요했다. 인텔은 1993년 Pentium 프로세서부터
CPUID명령을 도입하였다. - 표준화: 이후 AMD, VIA 등 다른 제조사도 동일한 명령을 구현했으며, 인텔은 명령어의 반환값과 기능을 지속적으로 확장해 왔다. 현재 대부분의 32비트·64비트 x86 프로세서에서 지원된다.
기능 및 반환값
CPUID는 입력값(함수 번호)에 따라 여러 가지 정보를 반환한다. 주요 함수 번호와 반환 내용은 다음과 같다.
| 함수 번호 (EAX) | 반환 레지스터 | 내용 |
|---|---|---|
| 0x0 | EAX, EBX, ECX, EDX | 최고 지원 함수 번호와 제조사 문자열(“GenuineIntel”, “AuthenticAMD” 등) |
| 0x1 | EAX, EBX, ECX, EDX | 프로세서 패밀리, 모델, 스텝, 기능 플래그(시그니처, SSE, AVX 등) |
| 0x2 | EAX, EBX, ECX, EDX | 캐시 및 TLB 구조 정보(다중 호출 필요) |
| 0x4 | EAX, EBX, ECX, EDX | 각 코어·논리 프로세서의 캐시 파라미터 |
| 0x7 (ECX=0) | EAX, EBX, ECX, EDX | 확장 기능 플래그(AVX‑512, BMI 등) |
| 0x80000000~0x80000008 | EAX, EBX, ECX, EDX | 확장 제조사 문자열 및 추가 기능(64비트 모드 지원 등) |
사용 예시
; CPUID를 이용해 제조사 문자열을 얻는 예 (32비트 어셈블리)
mov eax, 0 ; 함수 0 호출
cpuid
; EBX, ECX, EDX에 제조사 문자열이 저장됨
운영 체제 커널, 가상화 소프트웨어, 하드웨어 진단 도구 등에서 널리 활용된다.
제한 사항
- 보안: 일부 악성 코드는
CPUID결과를 기반으로 시스템 맞춤형 공격을 시도할 수 있다. 따라서 보안 민감 환경에서는 결과를 숨기거나 변조하는 기술(예: 가상화 환경에서의 CPUID 가상화)이 사용되기도 한다. - 가상화: 하이퍼바이저는 가상 머신에 제공되는
CPUID정보를 조작하여 호스트와 구분되도록 할 수 있다.
관련 명령 및 기술
- RDTSC: 시간 스탬프 카운터를 읽는 명령어로, 프로세서 성능 측정에 사용된다.
- XGETBV: 확장 레지스터 상태를 읽는 명령어로, AVX 지원 여부 확인에 활용된다.
- MSR (Model Specific Register): 프로세서별 추가 설정을 제어하는 레지스터 집합.
참고 문헌
- Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 2A: Instruction Set Reference, A-M.
- AMD64 Architecture Programmer’s Manual, Volume 3: General-Purpose and System Instructions.
- “CPUID Instruction”, Intel Developer Zone, 공식 문서.