自己プロセッサの識別。 パヌト2 毛深いCPUID

最初の郚分では、特定のプロセッサに存圚する拡匵機胜を識別する必芁性に぀いお話したした。 これは、実行可胜コヌドオペレヌティングシステム、コンパむラ、たたはナヌザヌアプリケヌションが䜿甚できるハヌドりェア機胜を確実に刀断できるようにするために必芁です。 たた、以前の蚘事で、いく぀かの䞀般的な汎甚CPUアヌキテクチャを比范したした。 それらを識別するための可胜性は倧きく異なりたすISA拡匵に関する完党な情報を提䟛するものもあれば、ベンダヌずリビゞョンを区別するために数個に制限されるものもありたす。

このパヌトでは、むンテル®IA-32アヌキテクチャヌの1぀の呜什、CPUIDに぀いお説明したす。これは、プロセッサヌで宣蚀された拡匵機胜のリスト甚に特別に導入されたものです。 圌女が登堎する前に䜕が起こったのか、圌女はどのような驚きが埅っおいるのか、どの゜フトりェアが圌女の解釈を解釈できるのかを䌝える方法を知っおいるこずに぀いお少し。





画像゜ヌス[1]





物語



最初の郚分で述べたように、次の傟向がありたす。プロセッサの性質が「埋め蟌たれる」ほど、そのアヌキテクチャに埋め蟌たれる識別の機䌚が少なくなりたす。 䜕らかの理由で、組み蟌みシステムの䜜成者は、バむナリコヌドの移怍性に぀いお心配したせん。



Intel 8086も䟋倖ではありたせんでした。1970幎代のマむクロプロセッサは、「蚈算機」シリヌズ8008、8080、8085から発展したした。最初は、識別手段は組み蟌たれおいたせんでした。

808386から、モデル、ステッピング、およびファミリに関する情報が、リブヌトRESET信号の受信の盎埌にEDXレゞスタで報告されるようになりたした。 バむト0x0f 0xa2で゚ンコヌドされたCPUID呜什は、プロセッサ80486で導入されたした。CPUIDの存圚は、可胜であればフラグレゞスタのビット21に曞き蟌むこずで認識できたす。 叀いCPUでの䜜業をサポヌトするには、8086から80386のプロセッサを区別するために非垞に掗緎された方法を䜿甚する必芁がありたした。



CPUIDアルゎリズム戊争1996
1996幎の蚘事[2]で、Robert Collinsは、圓時存圚しおいたすべおのIntel IA-32補品を区別するアルゎリズムを提案したした。 圌は、普遍的ではないため、PUSH SP呜什の動䜜の違いのみに基づいお、Intelの公匏の識別方法に満足しおいたせんこれに぀いおは以䞋で詳しく説明したす。 ロバヌトは自身の研究で、次の远加のトリックを䜿甚するこずを提案したした。

  • すべおのプロセッサに存圚しない呜什を実行し、UD䟋倖をキャッチしたす。 どの呜什が䟋倖をスロヌしなかったかを知るず、プロセッサフ​​ァミリを決定できたす。 ただし、8086/8088では、サポヌトされおいないチヌムの動䜜が定矩されおいないため、このアプロヌチは機胜したせん。
  • PUSH SP呜什の動䜜は、8086ず80286で異なりたす。最初のCPUでは、SPレゞスタの倀は、倀が倉わるたでスタックにヒットしたす。 80286で、この゚ラヌは修正されたした。

    「iAPX 286は、PUSH SPのスタックにiAPX 86/88ずは異なる倀をプッシュしたす。」
  • 80186も間違ったSP倀をスタックにプッシュしたすが、CPUIDは匕き続きサポヌトしたす。
  • 8086プロセッサでオフセット0xffff぀たり、アドレス指定された最埌のバむトから始たるのセグメントにワヌド16ビットを曞き蟌むず、このワヌドの2番目のバむトがオフセット0でメモリに入り、80186でこのバむトが海倖に移動したすオフセット0x10000のセグメント。
  • 䞀郚のIntel PentiumクロヌンはCPUIDをサポヌトしおいたしたが、フラグレゞスタのビット21を䜿甚しおこれを報告したせんでした。これはドキュメントず矛盟するか、ロヌド埌にこの呜什のサポヌトを動的に有効にするこずを蚱可したした。
  • 同じ「番号」を持぀プロセッサモデルたずえば、80386 DXず808386 SX、CX、EX、SLたたはIntel Pentium P5、P54C、OverDriveを区別するには、サポヌトされおいる拡匵機胜の違いを慎重に怜蚎する必芁がありたした。
  • 80386 DXずSXは、CR0レゞスタの倉曎されたビットの数の違いによっお区別できたす。
  • I / Oポヌトで文曞化された䞀連の操䜜IN / OUT呜什を䜿甚しお、䞀郚の識別情報を取埗できたす。
  • 80486モデルの違いは、80487数孊コプロセッサヌの可甚性を確認するこずで取埗できたす。


80386のステップ実行に関する情報を取埗するには、RESETの盎埌にEDX倀を読み取る必芁がありたす。 しかし、珟時点では、BIOSが動䜜を開始し、制埡がナヌザヌコヌドに転送される前に、おそらくこのレゞスタが䞊曞きされたす。 ただし、ここでロバヌトは、リブヌトプロセスを欺いお制埡を埗るために、悪名高いA20ラむンを操䜜するトリッキヌなスキヌムを発明し、説明しおいたす。



元の蚘事に蚘茉されおいる手法は、䞻にIntel CPUでテストされたした。 この蚘事では、著者は他のメヌカヌのx86クロヌンの信頌できる分類を蚱可しおいないこずを認めおいたす。





むンタヌフェヌス



システムプログラマの堎合、拡匵機胜を識別する䜜業は通垞、レゞスタEAXリヌフ、英語リヌフおよびECXサブリスト、英語サブリヌフに入力倀を蚭定し、CPUIDを実行し、4぀のレゞスタEAX、EBX、ECX、EDXで結果を読み取るこずで構成されたす。 出力レゞスタの個別のビットフィヌルドには、特定のプロセッサコアの関連するアヌキテクチャパラメヌタの倀に関する情報が含たれたす。



入力シヌトず出力の4぀のレゞスタのすべおの有効な組み合わせがCPUIDテヌブルを圢成したす。 最新のプロセッサでは、4぀の32ビット列からなる玄12行が含たれたす。

この衚の公匏に説明されおいるすべおのフィヌルドに぀いおは詳しく説明したせん。 興味のある人はい぀でもIntel SDMで芋぀けるこずができたす[1]忍耐匷くお勧めしたす-CPUIDに぀いおの玄40ペヌゞのテキスト。 さらに、既に発衚されおいるが物理補品でただリリヌスされおいないISA拡匵に぀いおは、察応する新しいCPUIDフィヌルドが[3]にありたす。 代わりに、この呜什の出力から抜出できる情報を分類したす。 テヌブルのビットフィヌルドを瀺すために、 CPUID.leaf.subleaf.reg [bitstartbitend]の衚蚘を䜿甚したす。 たずえば、CPUID.0.EBX [310]-これらは、シヌト0を入力ずしお受け取ったCPUIDの実行埌のEBX出力レゞスタのビット0〜31ですEAX = 0。 サブリスト入力ECX倀は無芖されるため、指定されたせん。



シヌト領域


サポヌトされおいない入力EAXおよびECX倀は䟋倖を発生させたせんが、代わりに4぀すべおのレゞスタたたは「ガベヌゞ」仕様に応じた別のシヌトの倀にれロを返したす。 シヌトずサブシヌトの蚱容可胜な組み合わせは、3぀の連続した領域を圢成したす。











ISA


CPUIDで゚ンコヌドされた開業医にずっお最も重芁なデヌタは、サポヌトされおいる呜什セットのフラグです。 埓来、CPUID.1.ECXおよびCPUID.1.EDXのビットがこのために割り圓おられおいたした。 以䞋にいく぀かの䟋を瀺したす。



ただし、珟圚、シヌト1の容量が䜿い果たされおいるため、ISA拡匵は他のシヌトのビットで瀺すこずができたす。



ブランド文字列


もちろん、ベンダヌは、補品のIDで名前を氞続化する機䌚を逃したせん。 そしお、これを数字ずしおだけでなく、ASCII文字列を入力するこずをお勧めしたす少なくずも、Unicodeではありたせん。

IA-32では、CPUIDテキストは少なくずも2぀のグルヌプのシヌトにありたす。 CPUID.0.EBX、ECX、EDXには、各ベンダヌに固有の12バむトのASCII文字列が含たれおいたす。 Intelの堎合、これはもちろん「GenuineIntel」です。 たた、CPUID.0x80000002-0x80000004の3枚のシヌトは、いわゆるブランド文字列をASCIIで゚ンコヌドするために最倧48バむトを提䟛したす。 これは、Linuxでcat / proc / cpuinfoをリストするずきに衚瀺されるものです。 たた、その圢匏は倚少暙準化されおいたすが、「ベンダヌブランドのCPUシリヌズ@呚波数」ですが、プログラムコヌドの内容を決定するこずは匷くお勧めしたせん。 その内容は非垞に倧きく異なる可胜性がありたす呚波数はMHzたたはGHzで瀺すこずができたすただし、実際には動的チュヌニングにより完党に異なる堎合がありたす、スペヌスは䜍眮を倉曎でき、シミュレヌタヌたたは仮想マシンはそこに䜕でも代甚できたす。 ブランド文字列からのすべおの情報は、より信頌性の高い方法でプログラムで芋぀けるこずができたす。



キャッシュ


タむプ、量、容量、ゞオメトリ、コア間の分離可胜性などのキャッシュに関する情報は、BLASラむブラリ基本線圢代数システムなどの高性胜数孊゜フトりェアのチュヌニングに圹立ちたす。

圓初、キャッシュの構成はシヌト2で説明されおいたした。 その䞭の情報を゚ンコヌドするためのフォヌマットは、最も柔軟ではなく、将来的には、いく぀かのレベルのキャッシュのボリュヌムず構成の絶え間ない倉曎をサポヌトするこずができたせんでした。 珟圚、シヌト2の情報の䜿甚は掚奚されおいたせん。0xFF-kiが存圚する堎合がありたす。

シヌト0x80000006が拡匵範囲内にあるずいう事実から刀断するずただ文曞による蚌拠が芋぀かっおいないかどうかはわかりたせんが、Intelによっお远加されたわけではありたせん。 これを䜿甚しお、゜フトりェア開発者が必芁ずするキャッシュの構造に関するデヌタをシヌト2の情報に远加する詊みが行われたした。 同時に、再び、成長のためのスペヌスを提䟛する意図はありたせんでした。

シヌト4は、キャッシュデヌタの最新か぀最も柔軟な衚珟です。 この䟡栌は、ECL゚ンコヌドサブシヌトの抂念を远加したものです。 各サブリストは、デヌタ、コヌド、たたは結合された1぀のキャッシュを蚘述し、そのレベル、容量などを決定したす。 4枚目のシヌトは長時間続きたすか



トポロゞヌ


ここで蚀う「トポロゞ」ずは、もちろん数孊のセクションではなく、珟圚のプロセッサにおける個々のコアずハむパヌスレッドIntel HyperThreadingがサポヌトされおいる堎合の盞察的な䜍眮に関する情報を意味したす。 最新のIntelサヌバヌプロセッサでは、次の階局レベルが区別されたす。



「論理プロセッサ」の抂念は、システムに存圚する最䜎レベルに察応しおいたす。 オペレヌティングシステムが認識するのはそれらです。 それらの間のプロセス移行のコスト、デヌタ転送の遅延、キャッシュ効果、NUMAメモリ構成などは、2぀の論理プロセッサが盞察的であるかどうか぀たり、それらが同じコアたたはパッケヌゞの䞀郚であるかどうかに䟝存したす。 そのため、トポロゞデヌタがCPUIDシヌト0xBずそのサブシヌトに含たれおいたす。

さらに、呚蟺機噚や他のプロセッサから割り蟌みを配信するタスクに察凊するために、各論理プロセッサにはいわゆる機胜がありたす。 APIC ID-システム内の䞀意の番号。 トポロゞは、これらの数倀が倚くのアクティブな原子栞に発行される法埋に圱響を䞎えたす。 それらは垞に䞀貫しおいるわけではありたせん。 たずえば、ハむパヌスレッディングがオフになっおいるシステムでは、すべおのAPIC IDが均等になりたす。

クラシックAPIC IDはCPUID.1.EBX [31:24]フィヌルドに保存されたす。 これは8ビットのみであり、これにより論理プロセッサの数が256に制限されたすが、これはもちろん珟代の珟実では十分ではありたせん。 そのため、CPUID.0xB.EDX [310]に保存されおいるX2APIC IDずいう拡匵子がありたす。 これらの32ビットは、より長い期間にわたっお十分だず思いたす。

各論理プロセッサの「座暙」は、そのパッケヌゞのトポロゞで䞀意です。 このため、耇数のCPUIDシヌトを連続しお読み取るスレッドにアフィニティを提䟛するように泚意しおください。そうしないず、異なるコアから倀を取埗するリスクが生じたす。



線集可胜なフィヌルド


トポロゞに問題がほずんどない堎合は、CPUIDテヌブルの内容自䜓がシステム操䜜䞭に動的に倉化する可胜性があるこずを急いで報告したす。 もちろん、すべおのフィヌルドを倉曎できるわけではありたせん。 それでも、BIOS蚭定から、OSが䜿甚されおいるCPUの機胜の䞀郚を芋るかどうかに盎接圱響を䞎えるこずができたす。 そのうちのいく぀かだけをあげたす。





雑倚


このセクションでは、CPUIDチヌムの歎史ず仕事に関連する他の興味深い点を集めたした。



プロセッサヌのシリアル番号


Pentium IIIの実行䞭、各プロセッサはCPUID.3.ECXおよびCPUID.3.EDXに含たれる䞀意のシリアル番号を受け取りたした[7]。 このような機胜が、コピヌからの゜フトりェア保護のニヌズにどのように圹立぀かは容易に想像できたす。 しかし、1999幎に欧州共同䜓は 、そのような機胜がそのようなシステムのナヌザヌのプラむバシヌを損なうこずを合理的に恐れお抗議したした 。 すでにIntel Pentium IVでシリアル番号が削陀され、シヌト3はれロを返したす。



ベンダヌずCPUID


非垞に興味深い衚[5]は、異なるベンダヌがCPUIDの異なるシヌトに保存するたたは過去に保存するものを瀺しおいたす。 たずえば、AMD K8プロセッサが文字列IT'S HAMMER TIMEを返した特定のミステリヌレベル0x8fffffffが蚘述されおいたす。



ISAりォヌズのAgner Fog


IA-32呜什セットの拡匵の歎史は、いく぀かの䌁業間の競争を背景にしおいたす[4]。 新しい呜什を远加するこずは垞にCPUIDに圱響を及がし、垞に正しく実行する方法に぀いお党員が同意できるずは限りたせん。



圌らはCPUIDを台無しにしたした IA32_BIOS_SIGN_ID


CPUID呜什は、その簡朔なむンタヌフェむスず驚きがないため、垞に気に入っおいたした。入力に1぀のレゞスタ、出力に4぀のレゞスタがありたす。 その動䜜には䟋倖がなく、メモリアクセスも、フラグレゞスタの読み取り/倉曎もありたせん。プレフィックスの圱響を受けず、すべおのプロセッサモヌドで動䜜したす。 IAC-32 CISC動物園ず比范するず、ほが理想的でした。

...シヌトずシヌトを゚ンコヌドするには、入力甚に2぀のレゞスタをファむルする必芁があるこずが刀明するたで。 さお、あたり良くありたせん。 さお、少なくずも出力レゞスタは事前に知られおおり、垞に倉曎されたす...

そしお、 時には CPUIDが別のレゞスタIA32_BIOS_SIGN_IDを倉曎し、珟圚のプロセッサマむクロコヌドプログラムの眲名をその䞭に保存するこずが刀明したした。 これは、プロセッサのファヌムりェアが以前に曎新された堎合に発生したす。 䜕らかの理由で、この手順に関する情報はマニュアル[1]に蚘茉されおいるように千ペヌゞに散らばっおいたため、非垞に長い間私を避けおいたした。



CPUIDを読み取るための゜フトりェア



他のいく぀かのアヌキテクチャずは異なり、IA-32ではCPUID呜什は特暩がありたせん。 OSカヌネルだけでなく、ナヌザヌ゜フトりェアによっお実行できたす。 したがっお、通垞のプログラムは、CPUが実行する機胜を自由に探玢できたす。 もちろん、玛らわしいバむナリ情報CPUIDを人間に優しい圢匏で衚すために、倚くのツヌルが䜜成されおいたす。 ここにいく぀かリストしたす。

  1. CPU-Z www.cpuid.com/softwares/cpu-z.html Windows甚の非垞に人気のある識別アプリケヌション。 私の奜みに合わせお、あたりにも簡朔。
  2. CPUID゚クスプロヌラヌ。 www.flounder.com/cpuid_explorer2.htm より詳现で、したがっおWindows甚の䟿利なアプリケヌション。 残念ながら、長い間曎新されおいないため、最新のCPUIDフィヌルドに぀いおは知りたせん。 ちなみに、これはこのタむプのすべおのプログラムに共通の問題です-それらは非垞に早く廃止されたす。
  3. Windows甚むンテル®プロセッサヌ識別ナヌティリティヌ www.intel.com/support/processors/tools/piu/sb/CS-014921.htm ただし、Intelの公匏アプリケヌションはあたり胜力がありたせん。
  4. Intel Open-source Technology Centerのmsr-tools 01.org/msr-tools CPUID倀ずMSRレゞスタを取埗するためのプログラム。 私が理解できない理由のために、CPUIDを読み取るにはルヌト暩限が必芁です。 さらに、呜什を盎接呌び出す代わりに、最も信頌性の高いLinuxカヌネルむンタヌフェむスは䜿甚されたせん。
  5. Linux甚の別のcpuid www.etallen.com/cpuid.html 私が芋぀けるこずができる最高のサンプル。 すべおの論理プロセッサ䞊のすべおのフラグに関する詳现情報を出力したす。
  6. 私は自分の自転車ggg-cpuid [6]を曞き始めたした。 他のアプリケヌションずは異なり、私のプロゞェクトの目暙は、IA-32だけでなく、さたざたなアヌキテクチャのプロセッサで識別情報を収集できるようにするこずです。 IA-32、IA-64、およびARMで動䜜するようになりたした。 可胜な限り、時間のあるずころで、さたざたなシステムを远加したす。




文孊



  1. Intel Corporation。 むンテル®64およびIA-32アヌキテクチャヌ゜フトりェア開発者マニュアル。 ボリュヌム1〜3、2014。www.intel.com / content / www / us / en / processors / architectures-software-developer-manuals.html
  2. ロバヌト・R・コリンズ。 CPUIDアルゎリズムの戊争。 博士 Dobbs Journal、1996幎11月。www.drdobbs.com/ database / cpuid-algorithm-wars / 184410005
  3. むンテル®アヌキテクチャヌ呜什セット拡匵プログラミング参照。 software.intel.com/en-us/intel-isa-extensions
  4. アグナヌ・フォグ。 呜什セットの戊争を停止したす。 AgnerのCPUブログ。 www.agner.org/optimize/blog/read.php?i=25
  5. x86アヌキテクチャのCPUID。 sandpile.org/x86/cpuid.htm
  6. グリゎリヌ・レヒストフ。 Intel IA-32、IA-64、およびその他のシステム甚のCPU識別ツヌルのセット。 github.com/grigory-rechistov/ggg-cpuid
  7. Intelプロセッサの識別ずCPUID呜什。 AP-485アプリケヌションノヌト、1999幎。netwinder.osuosl.org/ pub / misc / docs / i386 / 24161812.pdf



All Articles