4

CPUIDを使おうとしていますが、文字列が添付されています。sandpile.orgのCPUIDページによると、CPUID標準関数0000_0004h以上は、MISC_ENABLE.LCMVフラグが0に設定されている場合にのみ機能します。このフラグはモデル固有レジスタ(MSR)1A0のビット22です。どうやら、この制限はWindows NTのバグによるものです(Microsoft、私にとって物事を簡単にしてくれてありがとう;))。

CPUID 0000_0001h(ecxフラグ、ビット3)のLCMVフラグの存在をテストできます。それが存在すると仮定すると、それは正確には何のためにあり、なぜそれがCPUIDにそのような影響を与えるのですか?MSR 1A0は読み取り/書き込みレジスタですか、それとも読み取り専用ですか?このような専用レジスタは、アセンブリコードを使用してどのように読み書きされますか?

レジスタが技術的に読み取り/書き込みの場合、CPUID命令の期間中、ビット22を0にリセットしてから、元の設定に戻すのは安全ですか?それとも、正しく設定されていない(つまり有効になっている)場合、私はかなり困惑していますか?

最後に、sandpileは、「このレベルは、MISC_ENABLE.LCMVが0に設定されている場合にのみ有効になります。これは、WindowsNTのバグが原因です。」という表現を使用しています。この理由で多数の標準レベルが特に無効になっている場合、それはCPUIDレベル0000_000hのeaxレジスタ(サポートされている最大標準レベル)の出力に反映されますか?

ふぅ...それだけだと思います。

4

2 に答える 2

5

インテル®64およびIA-32アーキテクチャーソフトウェア開発者マニュアルには、要求されたすべての情報が含まれているため、ダウンロードすることをお勧めします。

CPUID 0000_0001h(ecxフラグ、ビット3)のLCMVフラグの存在をテストできます。それが存在すると仮定すると、それは正確には何のためにあり、なぜそれがCPUIDにそのような影響を与えるのですか?

フラグのフルネーム( Vol。3B B-17を参照)は「LimitCPUID MaxVal」であり、その効果は「このビットが1に設定されている場合、CPUID.00HはEAX [7:0]の最大値を返します。 3"。

MSR 1A0は読み取り/書き込みレジスタですか、それとも読み取り専用ですか?

Intelのマニュアルに従って読み取り/書き込みを行います(注意点が1つありますが、読み進めてください)。

このような専用レジスタは、アセンブリコードを使用してどのように読み書きされますか?

(Vol。2B 4-301)を使用して読み取り、RDMSR(Vol。2B 4-505)を使用して書き込みWRMSRますが、リアルモードまたは特権レベル0(別名カーネルモード)のいずれかで実行する必要があることに注意してください。

レジスタが技術的に読み取り/書き込みの場合、CPUID命令の期間中、ビット22を0にリセットしてから、元の設定に戻すのは安全ですか?それとも、正しく設定されていない(つまり有効になっている)場合、私はかなり困惑していますか?

実際にはバグのあるオペレーティングシステムにのみ設定する必要があり、クリアするべきではありません。独自のカーネルを作成している場合は、バグのあるバージョンのNTおよび同様の状況でのみ使用できると述べているので、必ず先に進んでカーネルをクリアしてください。

最後に、sandpileは、「このレベルは、MISC_ENABLE.LCMVが0に設定されている場合にのみ有効になります。これは、WindowsNTのバグが原因です。」という表現を使用しています。この理由で多数の標準レベルが特に無効になっている場合、それはCPUIDレベル0000_000hのeaxレジスタ(サポートされている最大標準レベル)の出力に反映されますか?

はい、この場合は強制的に3を返すように特別に設計されています(上記の説明を参照)。

于 2011-08-30T15:44:06.243 に答える
3

上記の非常に包括的な答えに追加するのはほんの少しです。(コメントとして追加したはずですが、まだコメントを追加できません。)Intelのエンジニアは、https://software.intel.com/en-us/forums/topicでその問題に関するいくつかの歴史的な詳細を提供しました。 / 306523?language = en#comment-1590394マイナーなフォーマット/スペル修正を使用して、そこから引用します。

一部のBIOSバージョンには、ユーザーが次回の再起動後にCPUIDがサポートする最大値(またはリーフインデックス)を制限できるメニュー設定があります。BIOSは、エンドユーザーがMicrosoft Windows * NT 4.0のインストールの問題を回避できるようにすることのみを目的としてこのオプションを提供しました。これは、Windows NT 4.0のインストールプログラムにバグがあり、CPUIDがサポートしていると報告した場合にブルースクリーンが発生するためです。 3よりも大きい。BIOSオプションを有効にしてCPUIDを3に制限するEAXmaxvalueは、WindowsNT4.0をインストールする目的でのみ必要です。他のすべての状況では、BIOSはCPUIDEAXの最大値を制限しないように構成する必要があります。

Intel Pentium 4以降のプロセッサでCPUIDが3以下のリーフをサポートするという制限で制限されている場合、リーフ3もサポートされないため、リーフ4を報告するようにCPUIDに要求すると、リーフ2のCPUIDからデータを受信します(最高の葉のインデックス)。ソフトウェアが無効なEAX入力値(つまりリーフインデックス)でCPUIDを実行すると、CPUIDは、現在のランタイム構成でサポートされている最高のリーフでレポートします。

さらに、問題のMSRフラグは、インテル®64およびIA-32アーキテクチャーソフトウェア開発者マニュアルの現在(2014年6月)版では「IA32_MISC_ENABLE.BOOT_NT4[ビット22]」と呼ばれています。今日では安全に無視できるレガシーの問題であることをより明確にするために、ある時点で名前を変更することを決定したのではないかと思います。

于 2014-07-11T15:22:07.787 に答える