今日のコンピューティングの世界では、CPUID 命令の導入により、プロセッサに関する詳細な情報を取得することが非常に簡単になりました。この機能は、Intel が Pentium および SL 拡張 486 プロセッサを初めて導入した 1993 年に登場し、プログラマーがプロセッサの種類と、MMX や SSE などのプロセッサがサポートする機能を簡単に照会できるようになりました。 CPUID 命令が一般的になる前は、プログラマーはプロセッサの種類を識別するために独自の方法を使用していましたが、これは当時の技術的な冒険でした。
CPUID が登場する前は、プログラマーは CPU の動作の微妙な違いを見つけるために、難解だと考えられていたマシン コードに頼っていました。
80386 プロセッサの導入により、プロセッサは再起動時に EDX レジスタを介してバージョンを示します。ただし、この情報は再起動後にのみ利用可能であり、アプリケーションがこの値を直接読み取る標準的な方法はありませんでした。つまり、プログラマーはさまざまな CPU を識別するためにさまざまな通常とは異なる手段を使用する必要があります。たとえば、Motorola の 680x0 シリーズ プロセッサには CPUID 命令がありませんでした。開発者はプロセッサの種類を判断するためにいくつかの特別な命令を使用する必要があり、これらの命令には特権実行が必要です。このコンテキストでは、68010 プロセッサはステータス レジスタからの MOVE 命令を特権としてマークし、仮想化要件に準拠させます。
CPUID 命令の登場は、x86 アーキテクチャのプログラマーに利便性を提供するだけでなく、ARM などの他のアーキテクチャの設計にも影響を与えます。これらのアーキテクチャは通常、プロセッサに関する基本情報を取得するために、CPUID に似たレジスタを提供します。
CPUID の操作コードは 0F A2 です。通常、アセンブリ言語では、CPUID 命令は、EAX レジスタを暗黙的に使用して返す情報の主要なカテゴリを決定するため、引数を必要としません。この呼び出しは CPUID の「リーフ」と呼ばれます。 Intel の用語によれば、CPUID が初めて呼び出されるとき、CPU でサポートされる最高の関数パラメータを取得するために、EAX を 0 に設定する必要があります。
拡張機能情報を取得するには、CPUID 呼び出しの EAX の最上位ビットを 1 に設定する必要があります。
一般的なコンピューティングの発展に伴い、CPUIDに基づいて取得される多くの基本リーフの有効範囲は23時間に達しました。 CPUID の呼び出しに基づいて、製造元 ID やさまざまなプロセッサ機能のサポートなど、さまざまな情報を取得できます。多くの場合、返される情報は公開ドキュメントでは開示されていないため、開発者は経験と文献に頼ってプロセッサの秘密を探る必要があります。
EAX が 0 に設定されている場合、CPU は製造元 ID 文字列 (EBX、EDX、ECX レジスタに順番に格納されている 12 文字の ASCII 文字列) を返します。最新情報によると、標準プロセッサ製造元 ID は次のとおりです。
EAX を 1 に設定すると、各モデルのパフォーマンスを判断するために重要なプロセッサのステッピング、モデル、およびシリーズの情報を取得できます。これはプロセッサ識別を表し、EAX、EDX、および ECX レジスタ内の機能フラグと追加機能情報を返します。
すべてのプロセッサ情報は製造元によって異なりますが、ほとんどの場合、互換性のために他の製造元では Intel の値が使用されます。
この方法の登場により、開発者はプロセッサの物理レベルを明確に理解できるようになりました。時間が経つにつれて、このテクノロジはますます広く使用されるようになり、コンピューティングテクノロジ全体の進歩を促進しています。さらに、これによりマルチコア プロセッサの設計も促進され、後続のプロセッサ アーキテクチャの継続的な進化が促進されます。
プロセッサ技術の継続的な発展に伴い、CPUID 命令の影響はますます顕著になり、さまざまなプログラムやシステムに重要なハードウェア情報を提供しています。しかし、将来のテクノロジーが深まるにつれて、ハードウェアが急速に変化する中で、将来のプログラミングではどのようにしてこれらのハードウェア特性をよりインテリジェントに理解し、パフォーマンスを最適化できるようになるのだろうか、という疑問が湧いてきます。