CPUの判別方法

x86系CPUでは、cpuid命令を使うことにより、ソフトウエアでCPUの種類を判別する事が出来ます。ただし、すべてのx86系CPUで使える訳でなく、基本的にはPentium以降のCPUと、一部の486世代CPUで使用出来ます。

cpuid命令の使い方

cpuid命令の使い方は簡単で,EAXレジスタに値を入れ、cpuid命令を実行すると、EAX,EBX,ECX,EDXレジスタにCPU依存の情報がセットされます。戻値レジスタの内容はcpuid命令を実行する前のEAXレジスタの値により、変化し下記のようになります。

VenderID

EAXレジスタに0をセットし、CPUID命令を実行すると、CPUのVenderIDを取得できます。

「VenderID」取得時の入出力
入力 EAX (EAX=0x0)
出力 EAX CPUID命令に与えることの出来るEAXの値の最大値
EBX VenderID文字列の先頭4文字
EDX VenderID文字列の中4文字
CX VenderID文字列の終端4文字

下記の表はIntel CPU上でcpuid命令を実行したときの出力例です。

VenderIDの出力例
出力 EBX 0-7bit VendorIDの 1文字目 'G'
8-15bit VendorIDの 2文字目 'e'
16-23bit VendorIDの 3文字目 'n'
24-31bit VendorIDの 4文字目 'u'
EDX 0-7bit VendorIDの 5文字目 'i'
8-15bit VendorIDの 6文字目 'n'
16-23bit VendorIDの 7文字目 'e'
24-31bit VendorIDの 8文字目 'I'
ECX 0-7bit VendorIDの 9文字目 'n'
8-15bit VendorIDの 10文字目 't'
16-23bit VendorIDの 11文字目 'e'
24-31bit VendorIDの 12文字目 'l'

Vendor IDは次のものが存在する(らしい)

主なVenderID一覧
Vendor ID Vendor
"GenuineIntel" Intel Corp.
"UMC UMC UMC " United Microelectronics Corporation
"AuthenticAMD" Advanced Micro Devices
"CyrixInstead" Cyrix Corp., VIA Inc.
"NexGenDriven" NexGen Inc.
"CentaurHauls" IDT/Centaur, now VIA
"RiseRiseRise" Rise
GenuineTMx86" Transmeta

Type,Model,Family

EAXレジスタに1をセットし、CPUID命令を実行すると、CPUのType,Model,FamilyやCPUの持っている機能等を取得できます。

「Type,Model,Famil」取得時の入出力
入力 EAX (EAX=0x1)
出力 EAX bit 詳細
0-3 Stepping
4-7 Model
8-11 Family
12-13 Processor Type
14-15 Reserved
16-19 Extended Model
20-27 Extended Family
28-31 Reserved
EDX bitMnemonic詳細
0FPUFloating Point Unit
1VMEV86 Mode Extensions
2DEDebug Extensions - I/O breakpoints
3PSEPage Size Extensions (4 MB pages)
4TSCTime Stamp Counter and RDTSC instruction
5MSRModel Specific Registers
6PAEPhysical Address Extensions (36-bit address, 2MB pages)
7MCEMachine Check Exception
8CX8CMPXCHG8B instruction available
9APICLocal APIC present (multiprocesssor operation support)
10 reserved
11SEPFast system call (SYSENTER and SYSEXIT instructions)
12MTRRMemory Type Range Registers
13PGEPage Global Enable - global oages support
14MCAMachine Check Architecture and MCG_CAP register
15CMOVConditional MOVe instructions
16PATPage Attribute Table (MSR 277h)
17PSE3636 bit Page Size Extenions
18PSNProcessor Serial Number
19CFLSHCache Flush
20 reserved
21DTESDebug Trace Store
22ACPIACPI support
23MMXMultiMedia Extensions
24FXSRFXSAVE and FXRSTOR instructions
25SSESSE instructions (introduced in Pentium III)
26SSE2SSE2 (WNI) instructions (introduced in Pentium 4)
27SELFSNOOPSelf-Snoop
28 reserved
29ACCAutomatic clock control
30IA64IA64 instructions?
31 reserved
EBX reserved
ECX reserved

CacheとTLBに関する情報

EAXレジスタに2をセットし、CPUID命令を実行すると、EAX、EBX、ECX、EDXには、Cache特性とTLB特性を示す情報が取得できます。ただし、ALレジスタにはCacheとTLBに関する情報を全て取得するためにCPUID(EAX=2)を実行する回数が設定されます。例えば、出力の結果としてAL レジスタに1が出力された場合、CPUID(EAX=2)を1回実行すれば、CacheとTLBに関する情報が全て取得できる事になります。また、各レジスタの31bitは、ディスクリプタ・ビット・フィールドで次の情報を表わします。

  1. bit31=0:そのレジスタには4つの情報が含まれている。
  2. bit31=1:予約済み
「CacheとTLB」取得時の入出力
入力 EAX (EAX=0x2)
出力 AL 情報を全て取り出す為に必要な、CPUID(EAX=2)の実行回数
EAX(AL除く) CacheとTLBに関する情報
1つの情報は8bitで構成される。
またAMD系のCPUでは情報の取得は不可
EBX
ECX
EDX

AMD製CPUの場合、CPUID(EAX=2)ではCacheとTLBに関する情報を取得できません。AMDの場合は、CPUID(EAX=0x80000005)とCPUID(EAX=0x80000006)を使用し取得します。

プロセッサ・シリアル・ナンバ情報

EAXレジスタに3をセットし、CPUID命令を実行すると、ECX、EDXに、96bit プロセッサ・シリアル・ナンバ情報の下位64bitがセットされます。上位32bitは何処から取得するかと言うと、cpuid(EAX=1)を実行した時の、EAXの値がプロセッサ・シリアル・ナンバの上位32bitとなります。

ただし、プロセッサ・シリアル・ナンバをサポートしているCPUであっても、BIOS等でDISABLEされている場合は、取得できません。

「プロセッサ・シリアル・ナンバ情報」取得時の入出力
入力 EAX (EAX=0x3)
出力 ECX 96bit プロセッサ・シリアル・ナンバ(bit31-0)
EDX 96bit プロセッサ・シリアル・ナンバ(bit63-32)
EAX reserved
EBX reserved

拡張CPUID命令

拡張CPUID命令が使用できるかは、CPUID(EAX=0x80000000)を実行した後、EAXの値(CPUID命令に与えることの出来るEAXの値の最大値)で判別できます。EAX>=0x80000000ならば、このCPUは拡張CPUID命令をサポートしています。主に次のCPUが拡張CPUIDを使うことが出来きます。

CPUID命令に与えることの出来るEAXの値の最大値

EAXレジスタに0x80000000をセットし、CPUID命令を実行すると、EAXにCPUID命令に与えることの出来るEAXの値の最大値がセットされます。CPUID(EAX=0)と似ているが、VenderIDを取得することは出来ません。

「EAXの値の最大値」取得時の入出力
入力 EAX (EAX=0x80000000)
出力 EAX CPUID命令に与えることの出来るEAXの値の最大値
EBX Reserved
ECX Reserved
EDX Reserved

CPU名

EAXレジスタに0x80000001,0x80000002,0x80000003,をセットし、CPUID命令を実行すると、EAX,EBX,ECX,EDXにCPU名文字列がセットされます。

「CPU名」取得時の入出力1
入力 EAX (EAX=0x80000001)
出力 EAX CPU名文字列の0〜3文字目
EBX CPU名文字列の4〜7文字目
ECX CPU名文字列の8〜11文字目
EDX CPU名文字列の12〜15文字目
「CPU名」取得時の入出力2
入力 EAX (EAX=0x80000002)
出力 EAX CPU名文字列の16〜19文字目
EBX CPU名文字列の20〜23文字目
ECX CPU名文字列の24〜27文字目
EDX CPU名文字列の28〜31文字目
「CPU名」取得時の入出力3
入力 EAX (EAX=0x80000003)
出力 EAX CPU名文字列の32〜35文字目
EBX CPU名文字列の36〜39文字目
ECX CPU名文字列の40〜43文字目
EDX CPU名文字列の44〜47文字目

CacheとTLBに関する情報

EAXレジスタに0x80000005およびを0x80000006セットし、CPUID命令を実行すると、Cache特性とTLB特性を示す情報が取得できます。

「L1 Cacheに関する情報」 取得時の入出力
入力 EAX (EAX=0x80000005)
出力 --- L1 Cacheに関する情報
CPUにより異なるので、各社CPUマニュアル参照してください。
「L2 Cacheに関する情報」 取得時の入出力
入力 EAX (EAX=0x80000006)
出力 --- L2 Cacheに関する情報
CPUにより異なるので、各社CPUマニュアル参照してください。

power management情報

EAXレジスタに0x80000006セットし、CPUID命令を実行するとpower management 情報がセットされる。AMD K6-III, K6-2+, K6-III+, K7 familyのみ?

その他の拡張CPUID命令

これ以外にも拡張CPUIDは、存在するようですが、CPU依存の情報が多いようなので、各社CPUマニュアル参照して下さい。

参考資料

  インテル® プロセッサの識別と CPUID 命令
  AMD Processor Recognition Application Note
  VIA C3 Processor Datasheets
  Identification of x86 CPUs with CPUID support
Last modified: Thu May 15 16:50:37 2008 JST