x86アーキテクチャにおいて、CPUID命令(CPUIDオペコードで識別される)はプロセッサ補助命令(「 CPU Identification」に由来する)であり、ソフトウェアがプロセッサの詳細情報を取得できるようにします。これは、1993年にIntelによってPentiumおよび後期486プロセッサの発売時に導入されました。[ 1 ]
プログラムは を使用して、プロセッサの種類や、 MMX / SSECPUIDなどの機能が実装されているかどうかを判断できます。
この命令が一般に利用可能になる前はCPUID、プログラマーはCPUの動作のわずかな違いを利用してプロセッサーのメーカーとモデルを判別する難解なマシンコードを書いていました。 [ 2 ] [ 3 ] [ 4 ] [ 5 ] 80386プロセッサーの導入により、リセット時のEDXはリビジョンを示しましたが、これはリセット後にのみ読み取ることができ、アプリケーションが値を読み取るための標準的な方法は存在しませんでした。
x86 ファミリ以外では、開発者はほとんどの場合、CPU 設計のバリエーションを判断するために難解なプロセス (命令のタイミングや CPU 障害のトリガーを含む) を使用する必要があります。
例えば、モトローラ68000シリーズCPUIDでは、いかなる種類の命令も存在しませんでしたが、特定の命令には昇格された権限が必要でした。これらの権限によって、CPUファミリーの異なるCPUを区別することができました。モトローラ68010では、SRからのMOVE命令が特権命令になりました。68000ではSRからのMOVE命令が非特権命令として提供されていたため、CPUエラー状態をトリガーすることで、2つの異なるCPUを区別することができました。
命令は x86 アーキテクチャに固有ですがCPUID、他のアーキテクチャ (ARM など) では、規定の方法で読み取って x86 命令によって提供されるのと同じ種類の情報を取得できるオンチップ レジスタが提供されることがよくありCPUIDます。
オペコードCPUIDは です0F A2。
アセンブリ言語では、このCPUID命令はパラメータを取りません。EAXCPUIDレジスタを暗黙的に使用して、返される情報の主なカテゴリを決定します。Intelの最近の用語では、これはCPUIDリーフと呼ばれます。を最初CPUIDに呼び出す必要がありますEAX = 0。これは、CPUが実装する最大のEAX呼び出しパラメータ(リーフ)をEAXレジスタに格納するためです。
拡張機能情報を取得するには、CPUIDEAXの最上位ビットをセットして呼び出します。拡張機能呼び出しパラメータの最上位値を決定するには、 を呼び出しCPUIDますEAX = 80000000h。
CPUIDリーフのうち3以上80000000未満のものには、モデル固有レジスタのIA32_MISC_ENABLE.BOOT_NT4 [ビット22] = 0(デフォルト)が設定されている場合にのみアクセスできます。名前が示すように、Windows NT 4.0 SP6まではこのビットが設定されていないと正常に起動しませんでしたが[ 6 ]、それ以降のバージョンのWindowsではこのビットは不要であるため、現在のWindowsシステムでは4より大きい基本リーフが表示されていると想定できます。2024年4月現在、有効な基本リーフは23hまでですが、一部のリーフから返される情報は公開されているドキュメントには記載されていません。つまり、それらは「予約済み」となっています。
最近追加されたリーフの中にはサブリーフを持つものもあり、それらは を呼び出す前に ECX レジスタを介して選択されますCPUID。
これはCPUの製造元ID文字列(EBX、EDX、ECX(この順)に格納された12文字のASCII文字列)を返します。EAXには、呼び出し前にEAXに設定できる最大の基本呼び出しパラメータ(値CPUID)が返されます。
以下にプロセッサと実装されている最高機能の一覧を示します。
既知のプロセッサ製造元 ID 文字列は次のとおりです。
"AuthenticAMD" – AMD"CentaurHauls" – IDT WinChip/ Centaur(一部のVIAおよびZhaoxin CPUを含む)"CyrixInstead" –サイリックス/ 初期のSTマイクロエレクトロニクスとIBM"GenuineIntel" –インテル"GenuineIotel" – インテル(レア)[ 7 ] [ 8 ]"TransmetaCPU" –トランスメタ"GenuineTMx86" –トランスメタ"Geode by NSC" –ナショナルセミコンダクター"NexGenDriven" –ネクスジェン"RiseRiseRise" -上昇"SiS SiS SiS " – SiS"UMC UMC UMC " – UMC"Vortex86 SoC" – DM&Pボルテックス86" Shanghai " – 趙新"HygonGenuine" –ハイゴン"Genuine RDC" – RDCセミコンダクター株式会社[ 9 ]"E2K MACHINE " – MCSTエルブルス[ 10 ]"VIA VIA VIA " -経由"AMD ISBETTER"– AMD K5プロセッサ の初期エンジニアリングサンプル[ 11 ] [ 12 ]以下はオープンソースのソフト CPU コアで使用される ID 文字列です。
"GenuineAO486" – ao486 CPU(旧型)[ 13 ] [ 14 ]"MiSTer AO486" – ao486 CPU(新)[ 15 ] [ 14 ]"GenuineIntel" – v586コア[ 16 ](これはIntel ID文字列と同一)以下は仮想マシンの既知の ID 文字列です。
"ConnectixCPU" – Connectix Virtual PC(バージョン6以下)[ 17 ] [ 18 ]"Virtual CPU " – Microsoft Virtual PC 7; [ 18 ] Microsoft x86-to-ARM (32ビットx86) [ 19 ]"AuthenticAMD" – Microsoft x86-to-ARM(64ビットx86)[ 19 ]"GenuineIntel" –アップル・ロゼッタ2 [ 20 ]"Insignia 586" – Insignia RealPC [ 21 ] [ 22 ]およびSoftWindows 98 [ 23 ]"Compaq FX!32" – Compaq FX!32 ( DEC Alphaプロセッサ用x86エミュレータ)[ 24 ]"PowerVM Lx86" – PowerVM Lx86 (IBM POWER5 / POWER6プロセッサ用のx86エミュレータ) [ 25 ]"Neko Project" – Neko Project II ( PC-98エミュレータ) (エミュレートするCPUが「Neko Processor II」に設定されている場合に使用) [ 26 ] [ 27 ]例えば、GenuineIntelプロセッサでは、EBX に返される値は0x756e6547、EDX に返される値は0x49656e69、ECX に返される値は です0x6c65746e。次のサンプルコードは、ベンダーID文字列と、CPU が実装する最大の呼び出しパラメータを表示します。
.intel_syntaxプレフィックスなし。文章.m0: .string "CPUID: %x\n".m1: .string "実装されている最大基本関数番号: %i\n".m2: .string "ベンダーID: %s\n".globlメイン主要:R12を押すmov eax , 1サブrsp 、16cpuidlea rdi , .m0 [ rip ]mov esi 、eaxprintfを呼び出すxor eax 、eaxcpuidlea rdi , .m1 [ rip ]mov esi 、eaxmov r12d 、edxmov ebp 、ecxprintfを呼び出すmov 3 [ rsp ], ebxレアrsi 、3 [ rsp ]lea rdi , .m2 [ rip ]mov 7 [ rsp ], r12dmov 11 [ rsp ], ebpprintfを呼び出すrspを追加、16ポップr12ret.section .note.GNU -スタック、"" 、@ progbits一部のプロセッサでは、CPUID.(EAX=0)命令を用いて特定のMSR(モデル固有レジスタ)に新しいID文字列を書き込むことで、CPUID.(EAX=0)によって報告される製造元ID文字列を変更することが可能WRMSRです。これは、Intel以外のプロセッサにおいて、ID文字列を返さないCPU向けにソフトウェアで無効化されている機能や最適化を有効にするために利用されてきましたGenuineIntel。[ 28 ]このようなMSRを持つことが知られているプロセッサには、以下のものがあります。
これは、CPUのステッピング、モデル、およびファミリー情報をEAXレジスタ(CPUのシグネチャとも呼ばれる)に返し、機能フラグをEDXレジスタとECXレジスタに返し、追加の機能情報をEBXレジスタに返します。 [ 36 ]
2023年10月現在、以下のx86プロセッサファミリーIDが知られています。[ 38 ]
プロセッサ情報と機能フラグは製造元によって異なりますが、通常、互換性のために他の製造元では Intel の値が使用されます。
CPUID実行する前に、EBXとECXを0にすることをお勧めしますCPUIDこの動作を示すことが知られているプロセッサには、Cyrix MII [ 55 ]とIDT WinChip 2 [ 56 ]がある。
CentaurHauls、 、GenuineTMx86)RiseRiseRiseでは、このCMPXCHG8B命令は常にサポートされますが、この命令の機能ビットが設定されていない可能性があります。これはWindows NTのバグに対する回避策です。 [ 57 ]AuthenticAMDファミリー5モデル0)プロセッサのみ、EDXビット9はPGEのサポートを示していました。これはK5モデル1以降、ビット13に移動されました。 [ 58 ]GenuineIntelSYSENTERSYSEXITMTRRCAPMSR(MSR0FEh)を通じて取得できます。このMSRのレイアウトは以下のとおりです。 CMPXCHG16B命令をサポートしていないにもかかわらず機能ビットが設定されているものがあります。これは、GenuineIntelファミリー0Fhモデル3ステッピング4チップ(90nm Pentium 4)にのみ適用されます。 [ 63 ]FCMOVおよびFCOMI命令は、オンボード x87 FPU も存在する場合にのみ利用可能です (EDX ビット 0 で示されます)。119h CPUでは、MSR (のビット21を1に設定することでPSNを無効にすることができます。BBL_CR_CTLこれを行うと、リーフ3が削除され、 CPUID.(EAX = 1):EDX[ビット18]が0を返します。古いドキュメントでは、このビットは「ハイパースレッディングテクノロジー」フラグとして記載されていることがよくあります[ 68 ]。ただし、このフラグはハイパースレッディングサポートの前提条件ですが、それ自体ではハイパースレッディングのサポートを示すものではなく、マルチスレッディングテクノロジーを搭載していない多くのCPUで設定されています[ 69 ] 。
予約フィールドは、プロセッサ識別目的で使用する前にマスクする必要があります。
これは、EAX、EBX、ECX、EDX レジスタ内の キャッシュおよびTLB機能を示す記述子のリストを返します。
このリーフをサポートするプロセッサでは、CPUIDEAX=2 で呼び出すと、EAX の下位バイトが01h[ a ]に設定され、EAX/EBX/ECX/EDX の残りの 15 バイトに 1 バイトずつ 15 個の記述子が格納されます。これらの記述子は、プロセッサのキャッシュ、TLB、およびプリフェッチに関する情報を提供します。通常、記述子 1 つにつき 1 つのキャッシュまたは TLB が含まれますが、一部の記述子値は他の情報も提供します。具体的には、 は00h空の記述子に使用され、リーフにFFh有効なキャッシュ情報が含まれていないため、代わりにリーフ 4h を使用する必要があることを示します。また、 はFEhリーフに有効な TLB 情報が含まれていないため、代わりにリーフ 18h を使用する必要があることを示します。記述子は任意の順序で出現できます。
4 つのレジスタ (EAX、EBX、ECX、EDX) のそれぞれについて、ビット 31 が設定されている場合、レジスタには有効な記述子が含まれているとは見なされません (たとえば、IA-32 モードの Itanium では、CPUID(EAX=2) が80000000hEDX で返されます。これは、EDX に 512K L2 キャッシュの記述子が含まれているという意味ではなく、有効な情報が含まれていないという意味と解釈されます)。
以下の表は、既知の記述子値について、その記述子値(または該当する場合はその他の情報)が示すキャッシュまたはTLBの簡潔な説明を示しています。表で使用されている接尾辞は以下のとおりです。
CPUID01h01h0Dh、0EhIntel AP-485 rev 37 [ 74 ]にECCを持つと説明されているキャッシュがリストされていますが、これは rev 38 以降の Intel ドキュメントでは削除されました。10h、、、、、、、、15hはItaniumのIA-32動作モードについてのみ文書化さ1Ahれています。[ 75 ]88h89h8Ah90h96h9Bh21h、いくつかの場所では(例えばAP-485 rev 36 [ 76 ]、rev 37ではそうではない)、"MLC"(中間レベルキャッシュ)と呼ばれています。26h、27h、28hは81hインテルのドキュメントには記載されておらず、リリースされているCPUでは使用されていない。 (キャンセルされたインテルTimna81hのエンジニアリングサンプルで確認されている。[ 86 ] )ただし、 Windows NTカーネルv5.1(Windows XP )以降では認識されると報告されている。はv5.0( Windows 2000 )でも認識される。[ 87 ]81h39h-3Ehは73hIntel AP-485のrev 36に記載されていますが、[ 76 ] 、そのうちのいくつかはIntel CPU(主にNetburstベースのCeleron CPU、例えば「Willamette-128」[ 77 ]、「Northwood-128」[ 78 ]、「Prescott-256」[ 79 ]39h )で使用されているにもかかわらず、それ以降のIntelのドキュメントからは削除されています。3Bh3Ch3Fhは、2024年11月現在、Intelの既知のドキュメントには記載されていないが、Intel Tolapaiプロセッサでは使用されており[ 80 ]、Intelが提供するLinuxカーネルパッチにも記載されている。 [ 81 ]CyrixInsteadファミリー6モデル5)のドキュメントには、このプロセッサがTLBに記述子値74hとを使用し、キャッシュに値とを使用することが記載されているが、これらの記述子値がプロセッサ内のどのキャッシュ/TLBに対応するかは指定されていない。[ 82 ]77h42h82h49hではレベル 3 キャッシュを示しGenuineIntel、その他の CPU ではレベル 2 キャッシュを示します。4Fh。この記述子を使用するプロセッサ(Intel Atom "Bonnell" [ 83 ])は、他の文献では、完全連想型の32エントリITLBを備えていると説明されている。 [ 84 ]CyrixInsteadおよびGeode by NSC)では、記述子70hおよびは80h異なる意味を持つ:[ 85 ]70h、4K ページ サイズを持つ 32 エントリの共有命令 + データ 4 ウェイ セット アソシエティブ TLB を示します。80h、4 ウェイ セット アソシアティビティと 16 バイトのキャッシュ ライン サイズを持つ 16 KB の共有命令 + データ L1 キャッシュを示します。76hはIntel AP-485のrev 37では1MBのL2キャッシュとして記載されているが[ 74 ]、rev 38以降のすべてのIntelドキュメントでは命令TLBとして記載されている。77h、7EhはItanium 28DhのIA-32動作モードについてのみ文書化されています。[ 88 ]B1h、TLB 容量は 2 MB ページを使用すると 8 要素ですが、4 MB ページを使用すると 4 要素に減少します。C3h、この記述子を使用する多くのIntelプロセッサは、6ウェイ・セットアソシアティブではなく、12ウェイ・セットアソシアティブのL2 TLBを備えています。これは少なくともSkylake [ 91 ]およびWhiskey/Kaby/Coffee/Comet Lake [ 92 ]のCPUに当てはまります。F0h、命令F1hによるメモリプリフェッチの推奨ストライドですPREFETCHNTA。[ 94 ]プロセッサのシリアル番号を返します。プロセッサのシリアル番号はIntel Pentium IIIで導入されましたが、プライバシー上の懸念から、この機能は以降のモデルでは実装されていません(PSN機能ビットは常にクリアされています)。TransmetaのEfficeonおよびCrusoeプロセッサもこの機能を提供しています。ただし、AMD CPUはどのCPUモデルにもこの機能を実装していません。
Intel Pentium III CPU の場合、96ビットシリアル番号の下位64ビットは EDX:ECX レジスタに返されます。Transmeta Efficeon CPU の場合、EBX:EAX レジスタに返されます。Transmeta Crusoe CPU の場合、EBX レジスタにのみ返されます。
プロセッサのシリアル番号機能が機能するには、 BIOS設定で有効にする必要があることに注意してください。
これら2つのリーフは、命令が実行されるプロセッサコアで利用可能なキャッシュ階層レベルに関する情報を提供するために使用されます。leafはIntelプロセッサで使用され、 leaf はAMDプロセッサで使用されます。どちらもEAX、EBX、ECX、EDXでデータを返します。データ形式は同じですが、 leaf はleaf 用に「予約済み」と見なされるいくつかの追加フィールドを返します。どちらもECXによって選択される一連のサブリーフでCPUキャッシュ情報を提供します。すべてのキャッシュレベルに関する情報を取得するには、EAX=またはとECX を0から始まる増加値(0、1、2、...)に設定して、キャッシュを記述しないサブリーフ(EAX[4:0]=0)が見つかるまで繰り返し呼び出す必要があります。キャッシュ情報を返すサブリーフは任意の順序で出現する可能性がありますが、それらはすべて、キャッシュを記述しない最初のサブリーフよりも前に出現します。 CPUID48000'001Dh48000'001DhCPUID48000'001Dh
以下の表では、リーフに対して定義されている4が、リーフに対しては定義されていないフィールドが8000'001Dh、黄色のセルの色と(#4)項目で強調表示されています。
有効で完全連想型ではないキャッシュの場合、ECX に返される値は、キャッシュ内のセットの数から 1 を引いた値です (完全連想型キャッシュの場合、ECX は値 0 を返すものとして扱われます)。リーフCPUIDまたは4のサブリーフで記述される任意のキャッシュの場合8000'001Dh、合計キャッシュ サイズ (バイト単位) は次のように計算できます。
CacheSize = (EBX[11:0]+1) * (EBX[21:12]+1) * (EBX[31:22]+1) * (ECX+1)
たとえば、Intel Crystalwell CPU で、EAX=4 および ECX=4 で CPUID を実行すると、プロセッサは EBX および ECX のレベル 4 キャッシュについて次のサイズ情報を返します。EBX=03C0F03FこれECX=00001FFFは、このキャッシュのキャッシュ ライン サイズが 64 バイト (EBX[11:0]+1)、タグごとに 16 のキャッシュ ライン (EBX[21:12]+1)、16 ウェイ セット アソシアティブ (EBX[31:22]+1)、8192 セット (ECX+1) であり、合計サイズが 64*16*16*8192=134217728 バイト、つまり 128 バイナリ メガバイトであることを意味します。
これら2つのリーフは、Intelマルチコア(およびハイパースレッド)プロセッサのプロセッサトポロジ(スレッド、コア、パッケージ)とキャッシュ階層の列挙に使用されます。[ 96 ] 2013年現在、AMDはこれらのリーフを使用していませんが、コア列挙を行う代替方法があります。[ 97 ]
他のほとんどのCPUIDリーフとは異なり、リーフBhはCPUID命令が実行される論理プロセッサに応じてEDXに異なる値を返します。EDXに返される値は、実際には論理プロセッサのx2APIC IDです。ただし、x2APIC ID空間は論理プロセッサに連続的にマッピングされるわけではなく、マッピングにギャップが生じる可能性があります。つまり、一部の中間x2APIC IDは必ずしもどの論理プロセッサにも対応するとは限りません。x2APIC IDをコアにマッピングするための追加情報は、他のレジスタに提供されています。リーフBhにはサブリーフ(後述するようにECXによって選択される)がありますが、EDXに返される値は、命令が実行されている論理プロセッサによってのみ影響を受け、サブリーフによって影響を受けることはありません。
リーフBhによって公開されるプロセッサトポロジは階層構造ですが、この階層における(論理)レベルの順序は、物理階層(SMT /コア/パッケージ)の順序と必ずしも一致しないという奇妙な注意点があります。ただし、すべての論理レベルは、ECXサブリーフ(Bhリーフ)として「レベルタイプ」(SMT、コア、または「無効」のいずれか)との対応を照会できます。レベルID空間は0から始まり、連続しています。つまり、あるレベルIDが無効な場合、それより上位のすべてのレベルIDも無効になります。レベルタイプはECXのビット15:08に返され、照会されたレベルの論理プロセッサの数はEBXに返されます。最後に、これらのレベルとx2APIC IDの関係は、次のレベルで一意のIDを取得するためにx2APIC IDをシフトする必要があるビット数として、EAX[4:0]に返されます。
たとえば、ハイパースレッディングが可能なデュアルコアのWestmereプロセッサ(合計 2 つのコアと 4 つのスレッドを持つ) には、4 つの論理プロセッサに対して x2APIC ID 0、1、4、5 が割り当てられます。CPUID のリーフ Bh (=EAX)、サブリーフ 0 (=ECX) は、たとえば ECX に 100h を返します。これは、レベル 0 が SMT (ハイパースレッディング) 層を表していることを意味します。また、物理コアごとに 2 つの論理プロセッサ (SMT ユニット) があるため、EBX に 2 を返します。この場合、この 0 サブリーフの EAX に返される値は 1 になります。前述の x2APIC ID を 1 ビット右にシフトすると、一意のコア番号 (レベル ID 階層の次のレベル) が割り当てられ、各コア内の SMT ID ビットが消去されるためです。この情報を解釈するより簡単な方法は、x2APIC ID の最後のビット (ビット番号 0) が、この例の各コア内の SMT/ハイパースレッディング ユニットを識別することです。サブリーフ 1 に進むと (EAX=Bh および ECX=1 で CPUID をもう一度呼び出すことにより)、たとえば ECX に 201h (これはコア タイプ レベルであることを意味します) が返され、EBX には 4 (パッケージ内に 4 つの論理プロセッサがあるため) が返されます。返される EAX は 3 より大きい任意の値になる可能性があります。これは、x2APIC ID でコアを識別するためにビット番号 2 が使用されるためです。x2APIC ID のビット番号 1 はこの例では使用されないことに注意してください。ただし、このレベルで返される EAX は 4 になる可能性があります (Clarkdale Core i3 5x0 ではたまたまそうなのですが)。これは、x2APIC ID を 4 ビットシフトすると、パッケージ レベルでも一意の ID (明らかに =0) が提供されるためです。最後に、EAX=4 のリーフが、私たちがまだ知らないことを伝えることができるのか疑問に思うかもしれません。EAX[31:26] は、パッケージ用に予約されているAPIC マスクビットを返します。この例では、ビット 0 から 2 はこのパッケージ内の論理プロセッサを識別するために使用されますが、ビット 1 も予約されていますが、論理プロセッサ識別スキームの一部としては使用されません。つまり、APIC ID 0 から 7 はパッケージ用に予約されていますが、これらの値の半分は論理プロセッサにマッピングされません。
プロセッサのキャッシュ階層は、リーフ4のサブリーフを調べることで確認できます。この階層では、APIC IDも使用され、SMTユニットとコア間で異なるレベルのキャッシュがどのように共有されているかに関する情報が伝達されます。例を続けると、Westmereでは、同じコアのSMTユニット間では共有されますが、物理コア間では共有されないL2キャッシュは、EAX[26:14]が1に設定されていることで示されます。一方、L3キャッシュがパッケージ全体で共有されている情報は、これらのビットが(少なくとも)111bに設定されていることで示されます。キャッシュの種類、サイズ、アソシエティビティなどのキャッシュの詳細は、リーフ4の他のレジスタを介して伝達されます。
インテルのアプリケーションノート485の古いバージョンには、特にマルチコアプロセッサーのコアの識別とカウントに関して、誤解を招く情報が含まれていることに注意してください。[ 98 ]この情報の誤った解釈によるエラーは、CPUIDを使用するためのMicrosoftのサンプルコード(Visual Studioの2013エディション用)にも組み込まれています。[ 99 ]また、CPUIDのsandpile.orgページにも含まれています。[ 100 ]しかし、プロセッサートポロジーを識別するためのインテルのコードサンプル[ 96 ]には正しい解釈があり、現在のインテルソフトウェア開発者マニュアルではより明確な言葉が使用されています。Wildfire Gamesの(オープンソースの)クロスプラットフォーム製品コード[ 101 ]も、インテルのドキュメントの正しい解釈を実装しています。
x2APIC がない (したがって EAX=Bh リーフを実装していない) 古い (2010 年より前の) Intel プロセッサに関するトポロジ検出の例は、2010 年の Intel プレゼンテーションで示されています。[ 102 ]古い検出方法を 2010 年以降の Intel プロセッサで使用すると、コアと論理プロセッサの数を過大評価する可能性があることに注意してください。これは、古い検出方法では APIC ID 空間にギャップがないものと想定されており、この想定は一部の新しいプロセッサ (Core i3 5x0 シリーズ以降) では違反しているためです。ただし、これらの新しいプロセッサには x2APIC も搭載されているため、EAX=Bh リーフ方法を使用してトポロジを正しく判別できます。
これは、EAX、EBX、ECX、および EDX レジスタ内の命令 に関連するMONITOR機能情報を返します。MWAIT
これは、EAX レジスタの機能ビットと、EBX、ECX、および EDX レジスタの追加情報を返します。
IA32_HWP_REQUESTのビット0を設定する必要があります。FAST_UNCORE_MSRS_CTL657hEBX、ECX、EDXの拡張機能フラグを返します。EAXでは、EAX=7のECXの最大値を返します。
これにより、4 つのレジスタすべてに拡張機能フラグが返されます。
MWAITのいずれかで示されます(どちらか一方、または両方が設定される場合があります。) 前者は命令のサポートも示しますが、後者は命令の存在の有無を明示的に示しません。「モニターレスMWAIT」機能をサポートするシステムでは、このフラグが存在する場合があります(この機能自体はCPUID.(EAX=5).ECX[3]で示されます)。MONITORMONITORMWAITMONITORこれは、EDX で拡張機能フラグを返します。
EAX、EBX、ECX は予約されています。
このリーフは、XSAVE 機能と状態コンポーネントを列挙するために使用されます。
XSAVE 命令セット拡張は、CPU 拡張状態 (通常はコンテキスト スイッチング用) を保存/復元するように設計されています。この保存/復元は、OS のコンテキスト スイッチング コードが新しい拡張機能の詳細を理解する必要なく、新しい命令セット拡張機能をカバーするように拡張できます。これは、一連の状態コンポーネントを定義することによって行われます。状態コンポーネントはそれぞれ、特定の保存領域内でサイズとオフセットを持ち、ある CPU 拡張または別の CPU 拡張に必要な状態のサブセットに対応します。CPUIDEAX=0Dhリーフは、CPU がサポートする状態コンポーネントとそのサイズ/オフセットに関する情報を提供するために使用され、OS は適切な量のスペースを予約し、関連する有効ビットを設定できます。
状態コンポーネントは、ユーザー状態(アプリケーションから参照可能な状態項目、例:AVX-512ベクターレジスタ)とスーパーバイザ状態(アプリケーションに影響を与えるが、ユーザーからは直接参照できない状態項目、例:ユーザーモード割り込み設定)の2つのグループに分類できます。ユーザー状態項目はXCR0制御レジスタ内の関連ビットを設定することで有効化され、スーパーバイザ状態項目はIA32_XSS( )MSR内の関連ビットを設定することで有効化されます。これらの状態項目は、 /命令ファミリ0DA0hで保存および復元可能な状態コンポーネントとなります。 XSAVEXRSTOR
XSAVEメカニズムは、この方法で最大63個の状態コンポーネントを処理できます。状態コンポーネント0と1(それぞれx87とSSE )は固定のオフセットとサイズを持ちます。状態コンポーネント2から62については、状態コンポーネントのインデックスを指定 CPUIDしてEAX=0Dh実行することで、サイズ、オフセット、およびいくつかの追加フラグを取得できます。これにより、EAX、EBX、ECX(EDXは予約済み)に以下の項目が返されます。ECX
この方法でサポートされていない状態コンポーネントを照会しようとすると、EAX、EBX、ECX、EDX がすべて 0 に設定されます。
CPUIDリーフのサブリーフ 0 と 1 は、0Dh機能情報を提供するために使用されます。
2023 年 7 月現在、アーキテクチャ的に定義されている XSAVE 状態コンポーネントは次のとおりです。
このリーフは、Intel Software Guard Extensions (SGX) 機能のサポート情報を提供します。このリーフには、ECX で選択される複数のサブリーフがあります。
サブリーフ0は、EAXでサポートされているSGXリーフ機能と、EDXでサポートされている最大SGXエンクレーブサイズに関する情報を提供します。ECXは予約済みです。EBXは、SECS(SGXエンクレーブ制御構造)のMISCSELECTフィールドに設定できるビットのビットマップを提供します。このフィールドは、AEX(SGX非同期エンクレーブ出口)が発生したときにSSA(SGX保存状態領域)のMISC領域に書き込まれる情報を制御するために使用されます。
サブリーフ1は、EDX:ECX:EBX:EAXのSECSの128ビットATTRIBUTESフィールドに設定可能なビットマップを提供します(これは、ENCLS[ECREATE]リーフ関数への入力として使用されるSECSコピーに適用されます)。上位64ビット(EDX:ECXで指定)は、XFRM(X機能要求マスク)に設定可能なビットマップです。このマスクは、AEX発生時にSSAに保存されるCPU状態コンポーネント(リーフ0Dhを参照)のビットマスクです。これはXCR0制御レジスタと同じレイアウトです。その他のビットは、EAXとEBXで次のように指定されます。
ENCLS[EINIT]。 への入力として与えられるSECSコピーでは、このビットは0である必要がありますENCLS[CREATE]。サブリーフ 2 以上は、SGX で EPC (Enclave Page Cache) セクションとして使用できる物理メモリ領域に関する情報を提供するために使用されます。
このリーフは、Intel Processor Trace (Real Time Instruction Trace とも呼ばれます) の機能情報を提供します。
サブリーフ0の場合、EAXに返される値は、EAX=14hのCPUIDでサポートされる最上位サブリーフのインデックスです。EBXとECXは機能フラグを提供し、EDXは予約されています。
これら 2 つのリーフは、EAX、EBX、ECX で CPU のさまざまな周波数に関する情報を提供します (EDX は両方のリーフで予約されています)。
リーフ 15h の EBX と ECX に返された値が両方ともゼロ以外の場合、TSC (タイム スタンプ カウンター) 周波数 (Hz) は次のように表されますTSCFreq = ECX*(EBX/EAX)。
一部のプロセッサ(例:Intel Skylake)では、CPUID_15h_ECXはゼロですが、CPUID_16h_EAXはゼロではありません。このような状況にある既知のプロセッサ[ 128 ]では、 TSC周波数はプロセッサベース周波数と等しく、コアクリスタルクロック周波数(Hz)は次のように計算できますCoreCrystalFreq = (CPUID_16h_EAX * 10000000) * (CPUID_15h_EAX/CPUID_15h_EBX)。
CPUIDリーフ15hにTSC/コアクリスタルクロック比を列挙するプロセッサでは、APICタイマー周波数はコアクリスタルクロック周波数をAPICの除算構成レジスタで指定された除数で割ったものになります。[ 129 ]
このリーフは、x86 CPU IP コアが他社製SoC ( System on ChipCPUID ) に実装されているシステムに存在します。他のリーフはx86 CPU コアに関する情報を提供しますが、このリーフは SoC に関する情報を提供します。このリーフは ECX のサブリーフインデックスを取得します。
サブリーフ 0 は、EAX の最大サブリーフ インデックス (少なくとも 3) と、EBX/ECX/EDX の SoC 識別情報を返します。
サブリーフ1から3は、UTF-8形式の48バイトのSoCベンダーブランド文字列を返します。サブリーフ1はEAX、EBX、ECX、EDX(この順序)の最初の16バイトを返し、サブリーフ2は次の16バイトを返し、サブリーフ3は最後の16バイトを返します。文字列はヌル終端されていても構いませんが、必須ではありません。
このリーフは、EAX、EBX、ECX の Intel Key Locker の機能情報を提供します。EDX は予約済みです。
の場合ECX=0、サポートされている最高位の「パレット」サブリーフがEAXに列挙されます。 の場合、パレットnECX≥1の情報が返されます。
TMUL) 情報このリーフはAMXTMUL(タイル乗数)ユニットに関する情報を返します。リーフは複数のサブリーフを備えており、ECXで選択されます。
サブリーフ 0 は、EAX でサポートされている最大のサブリーフと EBX の基本 TMUL 情報を返します。サブリーフ 1 は、EAX の追加機能情報を返します。
Intel TDX(信頼ドメイン拡張CPUID)がアクティブな場合、 TD(信頼ドメイン)ゲストによる命令実行の試みはTDXモジュールによって傍受されます。このモジュールは、がおよび(リーフ、サブリーフ0)CPUIDで呼び出されると、リーフでサポートされている最高のサブリーフのインデックスと、TDXモジュールベンダーID文字列をEBX、EDX、ECX(この順序)の12バイトASCII文字列として返します。Intel独自のモジュール実装は、ベンダーID文字列(末尾に4つのスペースを含む)を返します[ 133 ]。このモジュールでは、追加機能情報はを通じては利用できず、代わりにTDX固有の命令を通じて取得する必要があります。 EAX=21hECX=021h21hEAX"IntelTDX "CPUIDTDCALL
21hこのリーフはハードウェアで予約されており、 CPU 上で直接実行されると、EAX/EBX/ECX/EDX に 0 を返します (最高の基本リーフが 以上のプロセッサの場合)。
これは、EAXでサポートされている最大のサブリーフとEBXのAVX10機能情報を返します。[ 120 ](ECXとEDXは予約されています。)
サブリーフ 1 は、バージョンにバインドされていない AVX10 機能用に予約されています。
最高位の関数はEAXに返されます。このリーフはXeon Phiプロセッサにのみ存在します。[ 137 ]
この関数は機能フラグを返します。
命令がIntel VT-x または AMD-v 仮想化環境CPUIDで実行されると、ハイパーバイザーによってインターセプトされ、ハイパーバイザーは基盤となるハードウェアとは異なる機能フラグを返すことができます。リーフはハードウェアに実装されておらず、このインターセプト メカニズムを通じてハイパーバイザー固有の識別情報と機能情報を提供するためにハイパーバイザーによって予約されています。 CPUIDCPUID40000000h4FFFFFFFh
リーフ については40000000h、ハイパーバイザーは EAX にサポートされている最高のハイパーバイザー CPUID リーフのインデックスと、EBX、ECX、EDX (この順序で) に 12 文字のハイパーバイザー ID 文字列を返すことが期待されます。 リーフ については、ハイパーバイザーは EAX にインターフェイス識別シグネチャを返す場合があります。たとえば、 Hyper-V40000001h互換であることをアドバタイズしたいハイパーバイザーは、EAX に—を返すことができます。 [ 138 ] [ 139 ]リーフ からサポートされている最高レベルのリーフまでの形式は、それ以外はハイパーバイザー固有です。これらのリーフを実装するハイパーバイザーは通常、CPUID リーフ 1 の ECX のビット 31 も設定して、それらの存在を示します。 0x31237648"Hv#1"40000001h
複数のハイパーバイザーインターフェースを公開するハイパーバイザーは、追加インターフェースごとに100hリーフの間隔で、追加のCPUIDリーフセットを提供する場合があります。例えば、QEMUがHyper-VインターフェースとKVMインターフェースの両方を提供するように構成されている場合、CPUIDリーフから始まるHyper-V情報40000000hと、リーフから始まるKVM情報を提供します40000100h。[ 140 ] [ 141 ]
リーフにハイパーバイザー ID 文字列を返すことが知られているハイパーバイザーに40000000hは、次のようなものがあります。
最も高い呼び出しパラメータが EAX に返されます。
EBX/ECX/EDX は、AMD CPU では製造元 ID 文字列 (EAX=0 と同じ) を返しますが、Intel CPU では返しません。
これは、EDX および ECX の拡張機能フラグを返します。
のビットの多くEDX(ビット 0 ~ 9、12 ~ 17、23、および 24)はリーフEDXからの重複ですEAX=1。これらのビットは薄い黄色で強調表示されています。(これらの重複ビットは AMD CPU には存在しますが、Intel CPU には存在しません。)
AMD機能フラグは以下のとおりです。[ 163 ] [ 164 ]
SYSCALLSYSRETAuthenticAMDこれらの命令はモデル7で初めて導入されました[ 165 ] - これらの命令のサポートを示すCPUIDビットはモデル8( AMD K6-2 )以降はEDXビット11に移動されました[ 166 ]。
SYSCALLSYSRETCPUIDAuthenticAMDこれらは、EAX、EBX、ECX、EDXでプロセッサブランド文字列を返します。48CPUIDバイトのASCIIプロセッサブランド文字列全体を取得するには、各パラメータを順番に発行する必要があります。[ 175 ]CPUID最初にを発行しEAX = 80000000h、返された値が以上であるかどうかを確認することで、CPUにこの機能が存在するかどうかを確認する必要があります80000004h。
Intel/AMDのドキュメントでは、文字列はヌル終端されるように指定されていますが、これは常に当てはまるわけではありません(たとえば、DM&P Vortex86DX3とAMD Ryzen 7 6800HSは、リーフでヌル終端されていないブランド文字列を返すことが知られています80000002h- 80000004h[ 176 ] [ 177 ])。そのため、ソフトウェアはこれに依存しないでください。
#include <stdio.h> #include <string.h> #include <cpuid.h>int main () { unsigned int regs [ 12 ]; char str [ sizeof ( regs ) + 1 ];__cpuid ( 0x80000000 , regs [ 0 ], regs [ 1 ], regs [ 2 ], regs [ 3 ]);if ( regs [ 0 ] < 0x80000004 ) 1 を返します。__cpuid ( 0x80000002 , regs [ 0 ], regs [ 1 ], regs [ 2 ], regs [ 3 ]); __cpuid ( 0x80000003 , regs [ 4 ], regs [ 5 ], regs [ 6 ], regs [ 7 ]); __cpuid ( 0x80000004 , regs [ 8 ], regs [ 9 ], regs [ 10 ], regs [ 11 ]);memcpy ( str , regs , sizeof ( regs )); str [ sizeof ( regs )] = '\0' ; printf ( "%s \n " , str );0を返す; }AMDプロセッサでは、180nm Athlon以降(AuthenticAMDファミリー6モデル2以降)では、CPUIDリーフによって返されるプロセッサブランド文字列を変更することが可能です80000002h。これは、MSRに48バイトの置換文字列を書き込む命令80000004hを使用することで可能です。[ 172 ] [ 178 ] AMD Geode GX/LXでも、 MSRを使用することで同様のことが可能です。[ 179 ]WRMSRC0010030hC0010035h300Ah300Fh
CPUID によって返される文字列には80000002h、80000004h先頭、末尾、または中間の複数のスペースが含まれることがよくあります。Intel/AMD CPU に見られるような、連続するスペースが多数含まれるプロセッサ ブランド文字列の例をいくつか挙げると、次のとおりです。
Intel(R) Core(TM) i7-3960X CPU @ 3.30GHz[ 180 ]Intel(R) Xeon(R) CPU W3670 @ 3.20GHz[ 181 ]AMD EPYC 9655 96-Core Processor [ 182 ]場合によっては、CPUベンダーを特定するには、CPUIDリーフ0のベンダーIDとリーフ1のCPUシグネチャだけでなく、リーフ80000002h-のプロセッサブランド文字列も調べる必要があります80000004h。既知のケースとしては、以下が挙げられます。
MontageMontage Jintide CPU は、Montage CPU のブランド文字列にサブ文字列が含まれていることで、ベースとなっている Intel Xeon CPU モデルと区別できます(例: Montage Jintide C2460 [ 183 ]と Intel Xeon Platinum 8160 [ 184 ]は、どちらもGenuineIntelFamily 6 Model 55h Stepping 4 として識別されるため、この方法で区別できます)。CentaurHaulsファミリー 6 CPU は VIA または Zhaoxin CPU のいずれかです。これらは、ZHAOXINZhaoxin CPU のブランド文字列内のサブ文字列の存在によって区別できます (例: Zhaoxin KaiXian ZX-C+ C4580 [ 185 ]と VIA Eden X4 C4250 [ 186 ]はどちらもCentaurHaulsファミリー 6 モデル 0Fh ステッピング 0Eh として識別され、この方法で区別できます)。GenuineIntelサブ文字列の存在によって、エミュレートしているIntel Xeonプロセッサと区別できます。[ 19 ]VirtualAppleAuthenticAMDサブ文字列が存在することで、エミュレートしているAMDプロセッサーと区別できます。 [ 19 ]Virtual CPUこれは、EAX、EBX、ECX、EDXにおけるプロセッサのレベル1キャッシュとTLB特性に関する情報を次のように提供します。[ a ]
CyrixInsteadleafGeode by NSCが80000005h存在するが、leaf 2と似た完全に異なるフォーマットになっている。 [ 187 ]0x80000005FFh256 エントリの TLB を示すために使用されます。80000005h、次の値が使用されます。 ECX の L2 キャッシュの詳細を返します。これには、バイト単位のライン サイズ (ビット 07 - 00)、連想の種類 (4 ビット フィールドでエンコード、ビット 15 - 12)、および KB 単位のキャッシュ サイズ (ビット 31 - 16) が含まれます。
#include <stdio.h> #include <cpuid.h>int main () { unsigned int eax 、ebx 、ecx 、edx ; unsigned int lsize 、assoc 、cache ;__cpuid ( 0x80000006 , eax , ebx , ecx , edx ); lsize = ecx & 0xff ; assoc = ( ecx >> 12 ) & 0x07 ; cache = ( ecx >> 16 ) & 0xffff ;printf ( "行サイズ: %d B、アソシエーションタイプ: %d、キャッシュサイズ: %d KB。\n " 、lsize 、assoc 、cache );0を返す; }この機能は、CPU の 電力管理、電力レポート、および RAS (信頼性、可用性、保守性) 機能に関する情報を提供します。
AuthenticAMDファミリー0Fh モデル14h [ 194 ] (90nm Athlon64/Opteron)CPUで導入され、それ以降のすべてのAMD CPUに搭載されています(ただし、「no_efer_lmsle」フラグが設定されているものは除きます)。このリーフは、EAX、EBX、EDX の AMD SVM (セキュア仮想マシン) 機能に関する情報を返します。
AMDのそれ以降のドキュメント、例えば#25481「CPUID仕様」rev 2.18 [ 197 ]以降では、このビットは予約済みとしてのみリストされています。
rev 2.30 [ 198 ]以降では、別のビットがハイパーバイザー用に予約済みとしてリストされています: CPUID.(EAX=1):ECX[ビット31]。
#25481のRev 2.28では、このビットは「Ssse3Sse5Dis」としてリストされています[ 200 ]。Rev 2.34では、このビットはRev 2.32で「SseIsa10Compat」という名前で仕様から削除されたと記載されています[ 201 ] 。
いくつかのAMD CPUモデルでは、CPUIDが の場合、 EAX、EBX、ECX、EDXにイースターエッグ文字EAX=8FFF'FFFFh列が返されます。 [ 210 ] [ 211 ]既知のイースターエッグ文字列には以下のものがあります。
さらに、AMD K6 CPUは、CPUIDが の場合EAX=8FFF'FFFEh、EAXに「DEI 」へのイースターエッグ参照を返します。 [ 213 ]
EAX 内の最上位 Centaur リーフのインデックスを返します。EAX の戻り値が 未満の場合C0000001h、Centaur 拡張リーフはサポートされません。
IDT WinChip CPU(CentaurHaulsファミリー5)では、拡張リーフはC0000001h-C0000005hCentaur固有の機能をエンコードせず、代わりにリーフのエイリアスです80000001h-80000005h。[ 214 ]
このリーフはCentaurの機能情報(主にVIA/Zhaoxin PadLock)をEDXで返します。[ 215 ] [ 216 ] [ 217 ] [ 218 ](EAX、EBX、ECXは予約済みです。)
このサブリーフは、EAX でフィーチャ情報を返します。EBX、ECX、EDX は予約されています。
この情報は他の言語からも簡単にアクセスできます。例えば、以下のgccのCコードは、cpuidによって返される最初の5つの値を出力します。
#include <stdio.h> #include <cpuid.h>int main () { unsigned int i 、eax 、ebx 、ecx 、edx ;for ( i = 0 ; i < 5 ; i ++ ) { __cpuid ( i , eax , ebx , ecx , edx ); printf ( "InfoType %x \n EAX: %x \n EBX: %x \n ECX: %x \n EDX: %x \n " , i , eax , ebx , ecx , edx ); }0を返す; }MSVC および Borland/Embarcadero C コンパイラ (bcc32) のフレーバー付きインライン アセンブリでは、上書き情報は命令に暗黙的に含まれています。
#include <stdio.h>int main () { unsigned int a 、b 、c 、d 、i = 0 ;__asm { /* 呼び出しを実行します。 */ mov EAX , i ; cpuid ; /* 結果を保存します。 */ mov a , EAX ; mov b , EBX ; mov c , ECX ; mov d , EDX ; }printf ( "InfoType %x \n EAX: %x \n EBX: %x \n ECX: %x \n EDX: %x \n " , i , a , b , c , d ); 0 を返す; }どちらかのバージョンが単純なアセンブリ言語で記述されている場合、値を使い続けたいときは、プログラマーは EAX、EBX、ECX、EDX の結果を別の場所に手動で保存する必要があります。
<cpuid.h>GCCは、 CPUIDを持つシステムで呼び出されるヘッダーも提供します。これは__cpuidインラインアセンブリに展開されるマクロです。典型的な使用法は次のとおりです。
#include <stdio.h> #include <cpuid.h>int main () { unsigned int eax 、ebx 、ecx 、edx ;__cpuid ( 0 /* ベンダー文字列 */ 、eax 、ebx 、ecx 、edx ); printf ( "EAX: %x \n EBX: %x \n ECX: %x \n EDX: %x \n " 、eax 、ebx 、ecx 、edx );0を返す; }しかし、このCPUに存在しない拡張機能を要求した場合、そのことに気づかず、予期せぬランダムな結果が返される可能性があります。より安全なバージョンも提供されています<cpuid.h>。これは拡張機能をチェックし、追加の安全性チェックを行います。出力値は、参照のようなマクロパラメータではなく、より一般的なポインタで渡されます。
#include <stdio.h> #include <cpuid.h>int main () { unsigned int eax 、ebx 、ecx 、edx ;/* 0x81234567 は存在しませんが、存在すると想定します */ if ( ! __get_cpuid ( 0x81234567 , & eax , & ebx , & ecx , & edx )) { printf ( "警告: CPUID 要求 0x81234567 は無効です! \n " ); return 1 ; }printf ( "EAX: %x \n EBX: %x \n ECX: %x \n EDX: %x \n " , eax , ebx , ecx , edx );0を返す; }&a, &b, &c, &d条件文のアンパサンドに注目してください。__get_cpuid呼び出しが正しいリクエストを受け取った場合はゼロ以外の値を返し、失敗した場合はゼロを返します。[ 221 ]
Microsoft Visual C コンパイラには組み込み関数が用意されており__cpuid()、cpuid 命令をインラインアセンブリを使用せずに埋め込むことができます。これは、x86-64 版の MSVC ではインラインアセンブリが全くサポートされていないため便利です。MSVC で同じプログラムを実行すると、以下のようになります。
#include <stdio.h> #ifdef _MSC_VER #include <intrin.h> #endifint main () { unsigned int regs [ 4 ]; int i ;for ( i = 0 ; i < 4 ; i ++ ) { __cpuid ( regs , i ); printf ( "コード %d は %d、%d、%d、%d を返します" 、regs [ 0 ]、regs [ 1 ]、regs [ 2 ]、regs [ 3 ]); }0を返す; }多くのインタプリタ型またはコンパイル型のスクリプト言語は、 FFIライブラリを介してCPUIDを使用できます。そのような実装の1つは、 RubyのFFIモジュールを使用してCPUIDオペコードを含むアセンブリ言語を実行する例です。
.NET 5以降のバージョンでは、このSystem.Runtime.Intrinsics.X86.X86base.CpuIdメソッドが提供されています。例えば、以下のC#コードは、CPUID命令をサポートしている場合、プロセッサのブランド名を出力します。
System.Runtime.InteropServicesを使用します。System.Runtime.Intrinsics.X86を使用します。System.Textを使用します。namespace X86CPUID { class CPUBrandString { public static void Main ( string [] args ) { if ( ! X86Base . IsSupported ) { Console . WriteLine ( "お使いのCPUはCPUID命令をサポートしていません。" ); } else { Span < int > raw = stackalloc int [ 12 ]; ( raw [ 0 ], raw [ 1 ], raw [ 2 ], raw [ 3 ]) = X86Base . CpuId ( unchecked ( ( int ) 0x80000002 ), 0 ); ( raw [ 4 ], raw [ 5 ], raw [ 6 ], raw [ 7 ]) = X86Base . CpuId ( unchecked ( ( int ) 0x80000003 ), 0 ); ( raw [ 8 ], raw [ 9 ], raw [ 10 ], raw [ 11 ]) = X86Base . CpuId ( unchecked ( ( int ) 0x80000004 ), 0 );Span < byte > bytes = MemoryMarshal.AsBytes ( raw ) ; string brand = Encoding.UTF8.GetString ( bytes ) .Trim ( ) ; Console.WriteLine ( brand ) ; } } } }x86 以外の CPU アーキテクチャの中には、プロセッサの機能に関する特定の形式の構造化情報を、通常は特殊レジスタのセットとして提供するものもあります。
CPUID必要とするコプロセッサレジスタがあります。 [ 222 ]STIDP)命令があり、CPUタイプなどの情報を提供します。[ 223 ] [ 224 ] : 10-147–10-149 STFL)[ 224 ]:10-149 命令と、非特権のStore Facilities List Extended(STFLE)命令、:7-394–7-395 もあります。PrId)と一連のデイジーチェーン構成レジスタを定義しています。[ 225 ]PVRmcpuid「CPU実装の機能に関する情報を含む読み取り専用レジスタ」がある[ 227 ]DSPやトランスピュータのようなチップファミリは、設計のバリエーションが(相対的に)豊富であるにもかかわらず、この命令を目立った形で採用していません。シリコン識別の代替手段が存在する可能性があります。例えば、Texas InstrumentsのDSPには、各機能ユニットごとにメモリベースのレジスタセットが搭載されており、ユニットの種類とモデル、ASIC設計リビジョン、設計段階で選択された機能を識別する識別子から始まり、ユニット固有の制御レジスタとデータレジスタが続きます。これらの領域へのアクセスは、既存のロード命令とストア命令を使用するだけで実行されるため、このようなデバイスでは、デバイス識別のためにレジスタセットを拡張する必要はありません。
CPUID、さまざまなシステム設定を識別するために使用するWindowsユーティリティです。"Compaq FX!32"。およびAMD CPUは、CPUIDリーフ0x1のECXビット31をハイパーバイザー存在ビットとして予約しています。このビットにより、ハイパーバイザーはゲストOSに自身の存在を示すことができます。ハイパーバイザーはこのビットを設定し、物理CPU(既存および将来導入されるすべてのCPU)はこのビットを0に設定します。ゲストOSはビット31を検査することで、仮想マシン内で実行されているかどうかを検出できます。
リーフ0x1のECXのビット31。このビットは、ハイパーバイザー用にIntelとAMDによって予約されており、ハイパーバイザーの存在を示します。仮想CPU(ハイパーバイザー)はこのビットを1に設定し、物理CPU(既存および将来のすべてのCPU)はこのビットを0に設定します。ゲストソフトウェアはこのビットを調べて、仮想マシン内で実行されているかどうかを検出できます。
15.2.2 ゲストモード この新しいプロセッサモードは、VMRUN命令によって開始されます。ゲストモードでは、仮想化を容易にするために一部のx86命令の動作が変更されます。CPUID機能番号4000_0000h~4000_00FFhはソフトウェア用に予約されています。ハイパーバイザーはこれらの機能番号を使用して、ハイパーバイザーからゲストに情報を渡すためのインターフェースを提供できます。これは、CPUIDを使用して物理CPUに関する情報を抽出するのと似ています。ハイパーバイザーは、CPUID Fn 400000[FF:00]ビットを使用して仮想プラットフォームを示します。機能ビットCPUID Fn0000_0001_ECX[31]は、ハイパーバイザーの存在を示すためにハイパーバイザーが使用するために予約されています。ハイパーバイザーはこのビットを1に設定し、物理CPUはこのビットを0に設定します。ゲストソフトウェアはこのビットを調べて、仮想マシン内で実行されているかどうかを検出できます。
" lrpepyh vr"8FFFFFFFh。2022年12月22日閲覧。