CPUID

CPUID命令とは



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の初期のエンジニアリングサンプル
"AuthenticAMD" - AMD
"CentaurHauls" - セントールテクノロジー
"CyrixInstead" - サイリックス
"GenuineIntel" - インテル
"GenuineTMx86", "TransmetaCPU" - トランスメタ
"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` インタフェースを提供
* ハードウェア仮想化サポートを検出

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。