CPUIDは、x86アーキテクチャにおける
機械語命令の一つで、
CPUの識別情報を取得するために用いられます。この命令を使用することで、ソフトウェアはプロセッサの種類、製造元、サポートする機能(
MMXやSSEなどの拡張命令の有無)などを知ることができます。
CPUID命令は、486の後期モデルから導入され、Pentiumで広く利用されるようになりました。
CPUID命令の基本
CPUID命令のオペコードは`0FA2h`です。この命令を実行する際、EAXレジスタに取得したい情報の種類を指定します。例えば、EAXレジスタに`0`を設定して
CPUID命令を実行すると、
CPUのベンダIDを取得できます。
CPUID命令の利用可否
CPUID命令は、すべてのx86プロセッサで利用できるわけではありません。80486以降のプロセッサで利用できますが、古いプロセッサでは利用できません。そのため、
CPUID命令を実行する前に、プロセッサが
CPUID命令をサポートしているか確認する必要があります。80486以上のプロセッサでは、EFLAGSレジスタの第21ビットが変更可能であれば、
CPUID命令を使用できます。
CPUID命令の呼び出し
CPUID命令は、EAXレジスタを暗黙のオペランドとして使用します。EAXレジスタに取得したい情報の種類を示す値を設定し、
CPUID命令を実行します。
CPUでサポートされている最大のパラメータを取得するには、まずEAXレジスタに0を設定して
CPUID命令を呼び出す必要があります。拡張機能情報を取得するには、EAXのビット31をセットして
CPUIDを呼び出します。また、拡張機能情報でサポートされている最大の機能番号を得るためには、EAXに`8000000h`を設定して
CPUID命令を呼び出します。
EAX=0: ベンダIDの取得
EAXに0を設定して
CPUID命令を実行すると、
CPUのベンダIDが返されます。ベンダIDは、12文字のASCII文字列として、EBX、EDX、ECXレジスタに順に格納されます。
既知のベンダID文字列
"AMDisbetter!" - AMD K5の初期のエンジニアリングサンプル
"Authentic
AMD" -
AMD
"CentaurHauls" - セントールテクノロジー
"CyrixInstead" -
サイリックス
"GenuineIntel" - インテル
"GenuineTMx86", "Transmeta
CPU" - トランスメタ
"Geode by NSC" - ナショナル セミコンダクター
"
NexGenDriven" -
NexGen
"RiseRiseRise" - Rise Technology
"SiS SiS SiS " - SiS
"UMC UMC UMC " - UMC
"VIA VIA VIA " - VIA Technologies
例えば、ベンダIDが"GenuineIntel"の場合、EBXレジスタには0x756e6547、EDXレジスタには0x49656e69、ECXレジスタには0x6c65746eが格納されます。
EAX=1: プロセッサ情報とプロセッサの機能
EAXに1を設定して
CPUID命令を実行すると、プロセッサのステッピング、モデル、ファミリーの情報がEAXレジスタに返されます。また、機能フラグがEDXとECXレジスタに、追加の機能情報がEBXレジスタに返されます。
EAXレジスタのフォーマット
3:0 - ステッピング
7:4 - モデル
11:8 - ファミリー
13:12 - プロセッサタイプ
19:16 - 拡張モデル
27:20 - 拡張ファミリー
インテルと
AMDは、
CPUのファミリーを「ファミリー」と「拡張ファミリー」の合計で表示し、モデルを「モデル」と4ビット左シフトした「拡張モデル」の合計で表示するように推奨しています。
EAX=2: キャッシュとTLBディスクリプタ情報
EAXに2を設定して
CPUID命令を実行すると、キャッシュとTLBの機能を示すディスクリプタのリストがEAX, EBX, ECX, EDXレジスタに格納されます。
EAX=3: プロセッサ・シリアル・ナンバ
EAXに3を設定して
CPUID命令を実行すると、プロセッサのシリアル番号が返されます。ただし、この機能はプライバシーの懸念から、最近のプロセッサでは実装されていません。
インテルPentium IIIやトランスメタのプロセッサでのみ利用できます。
EAX=80000000h: サポートする最大拡張機能番号の取得
EAXに`80000000h`を設定して
CPUID命令を実行すると、サポートされている最大の拡張機能番号がEAXレジスタに返されます。
EAX=80000001h: 拡張プロセッサ情報とプロセッサの機能
EAXに`80000001h`を設定して
CPUID命令を実行すると、
AMD社の
CPUの拡張機能フラグがEDXとECXレジスタに格納されます。EDXの一部のビットは、EAX=1の場合の
CPUIDの結果と重複しています。また、Intelの
CPUでは未使用のビットも含まれます。
EAX=80000002h, 80000003h, 80000004h: プロセッサブランド文字列
EAXに`80000002h`から`80000004h`を設定して
CPUID命令を実行すると、プロセッサのブランド文字列がEAX、EBX、ECX、EDXレジスタに格納されます。これらを組み合わせることで、48バイトのNULL終端ASCII文字列としてプロセッサのブランド文字列を取得できます。
EAX=80000006h: 拡張L2キャッシュ情報
EAXに`80000006h`を設定して
CPUID命令を実行すると、L2キャッシュの詳細情報がECXレジスタに格納されます。
EAX=80000008h: 仮想アドレスと物理アドレスのサイズ
EAXに`80000008h`を設定して
CPUID命令を実行すると、最大の仮想アドレスサイズと物理アドレスサイズがEAXレジスタに格納されます。
まとめ
CPUID命令は、x86プロセッサの情報を取得するための重要な手段です。プロセッサのベンダ、モデル、機能、キャッシュ情報などを識別できるため、ソフトウェア開発において重要な役割を果たします。この命令を理解し、適切に利用することで、より高度なシステム情報を取得し、ソフトウェアの最適化や互換性の確保に役立てることができます。
関連情報
Pentium III: プライバシーに関する論争
CPU-Z: 各種のシステム情報を取得するために
CPUIDを使用するWindowsユーティリティ
sandpile.org: x86プロセッサの技術的な情報
Intel CPUIDガイド (PDF)
AMD CPUIDガイド (PDF)
外部プログラム
Windows プログラム:
SIV
CPUZ
WCPUID
DOS プログラム:
cpulevel2007.zip
cpu.zip
cpuid.zip
Linux プログラム:
cpuid.html
cpuid
`/proc/cpuinfo` インタフェース
Solarisは `/dev/cpu/self/cpuid` インタフェースを提供
*
ハードウェア仮想化サポートを検出