x86系CPUでは、cpuid命令を使うことにより、ソフトウエアでCPUの種類を判別する事が出来ます。ただし、すべてのx86系CPUで使える訳でなく、基本的にはPentium以降のCPUと、一部の486世代CPUで使用出来ます。
x86系CPUでは、cpuid命令を使うことにより、ソフトウエアでCPUの種類を判別する事が出来ます。ただし、すべてのx86系CPUで使える訳でなく、基本的にはPentium以降のCPUと、一部の486世代CPUで使用出来ます。
cpuid命令の使い方は簡単で,EAXレジスタに値を入れ、cpuid命令を実行すると、EAX,EBX,ECX,EDXレジスタにCPU依存の情報がセットされます。戻値レジスタの内容はcpuid命令を実行する前のEAXレジスタの値により、変化し下記のようになります。
EAXレジスタに0をセットし、CPUID命令を実行すると、CPUのVenderIDを取得できます。
入力 | EAX | (EAX=0x0) |
---|---|---|
出力 | EAX | CPUID命令に与えることの出来るEAXの値の最大値 |
EBX | VenderID文字列の先頭4文字 | |
EDX | VenderID文字列の中4文字 | |
CX | VenderID文字列の終端4文字 |
下記の表はIntel CPU上でcpuid命令を実行したときの出力例です。
出力 | 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は次のものが存在する(らしい)
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 |
EAXレジスタに1をセットし、CPUID命令を実行すると、CPUのType,Model,FamilyやCPUの持っている機能等を取得できます。
入力 | 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 | bit | Mnemonic | 詳細 | |
0 | FPU | Floating Point Unit | ||
1 | VME | V86 Mode Extensions | ||
2 | DE | Debug Extensions - I/O breakpoints | ||
3 | PSE | Page Size Extensions (4 MB pages) | ||
4 | TSC | Time Stamp Counter and RDTSC instruction | ||
5 | MSR | Model Specific Registers | ||
6 | PAE | Physical Address Extensions (36-bit address, 2MB pages) | ||
7 | MCE | Machine Check Exception | ||
8 | CX8 | CMPXCHG8B instruction available | ||
9 | APIC | Local APIC present (multiprocesssor operation support) | ||
10 | reserved | |||
11 | SEP | Fast system call (SYSENTER and SYSEXIT instructions) | ||
12 | MTRR | Memory Type Range Registers | ||
13 | PGE | Page Global Enable - global oages support | ||
14 | MCA | Machine Check Architecture and MCG_CAP register | ||
15 | CMOV | Conditional MOVe instructions | ||
16 | PAT | Page Attribute Table (MSR 277h) | ||
17 | PSE36 | 36 bit Page Size Extenions | ||
18 | PSN | Processor Serial Number | ||
19 | CFLSH | Cache Flush | ||
20 | reserved | |||
21 | DTES | Debug Trace Store | ||
22 | ACPI | ACPI support | ||
23 | MMX | MultiMedia Extensions | ||
24 | FXSR | FXSAVE and FXRSTOR instructions | ||
25 | SSE | SSE instructions (introduced in Pentium III) | ||
26 | SSE2 | SSE2 (WNI) instructions (introduced in Pentium 4) | ||
27 | SELFSNOOP | Self-Snoop | ||
28 | reserved | |||
29 | ACC | Automatic clock control | ||
30 | IA64 | IA64 instructions? | ||
31 | reserved | |||
EBX | reserved | |||
ECX | reserved |
EAXレジスタに2をセットし、CPUID命令を実行すると、EAX、EBX、ECX、EDXには、Cache特性とTLB特性を示す情報が取得できます。ただし、ALレジスタにはCacheとTLBに関する情報を全て取得するためにCPUID(EAX=2)を実行する回数が設定されます。例えば、出力の結果としてAL レジスタに1が出力された場合、CPUID(EAX=2)を1回実行すれば、CacheとTLBに関する情報が全て取得できる事になります。また、各レジスタの31bitは、ディスクリプタ・ビット・フィールドで次の情報を表わします。
入力 | 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(EAX=0x80000000
)を実行した後、EAXの値(CPUID命令に与えることの出来るEAXの値の最大値)で判別できます。EAX>=0x80000000
ならば、このCPUは拡張CPUID命令をサポートしています。主に次のCPUが拡張CPUIDを使うことが出来きます。
EAXレジスタに0x80000000
をセットし、CPUID命令を実行すると、EAXにCPUID命令に与えることの出来るEAXの値の最大値がセットされます。CPUID(EAX=0)と似ているが、VenderIDを取得することは出来ません。
入力 | EAX | (EAX=0x80000000) |
---|---|---|
出力 | EAX | CPUID命令に与えることの出来るEAXの値の最大値 |
EBX | Reserved | |
ECX | Reserved | |
EDX | Reserved |
EAXレジスタに0x80000001
,0x80000002
,0x80000003
,をセットし、CPUID命令を実行すると、EAX,EBX,ECX,EDXにCPU名文字列がセットされます。
入力 | EAX | (EAX=0x80000001) |
---|---|---|
出力 | EAX | CPU名文字列の0〜3文字目 |
EBX | CPU名文字列の4〜7文字目 | |
ECX | CPU名文字列の8〜11文字目 | |
EDX | CPU名文字列の12〜15文字目 |
入力 | EAX | (EAX=0x80000002) |
---|---|---|
出力 | EAX | CPU名文字列の16〜19文字目 |
EBX | CPU名文字列の20〜23文字目 | |
ECX | CPU名文字列の24〜27文字目 | |
EDX | CPU名文字列の28〜31文字目 |
入力 | EAX | (EAX=0x80000003) |
---|---|---|
出力 | EAX | CPU名文字列の32〜35文字目 |
EBX | CPU名文字列の36〜39文字目 | |
ECX | CPU名文字列の40〜43文字目 | |
EDX | CPU名文字列の44〜47文字目 |
EAXレジスタに0x80000005
およびを0x80000006
セットし、CPUID命令を実行すると、Cache特性とTLB特性を示す情報が取得できます。
入力 | EAX | (EAX=0x80000005) |
---|---|---|
出力 | --- |
L1 Cacheに関する情報 CPUにより異なるので、各社CPUマニュアル参照してください。 |
入力 | EAX | (EAX=0x80000006) |
---|---|---|
出力 | --- |
L2 Cacheに関する情報 CPUにより異なるので、各社CPUマニュアル参照してください。 |
EAXレジスタに0x80000006
セットし、CPUID命令を実行するとpower management 情報がセットされる。AMD K6-III, K6-2+, K6-III+, K7 familyのみ?
これ以外にも拡張CPUIDは、存在するようですが、CPU依存の情報が多いようなので、各社CPUマニュアル参照して下さい。