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マニュアル参照して下さい。