CPUID

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, 공식 문서.
둘러보기

더 찾아볼 만한 주제