問題タブ [msr]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
macos - OSX のユーザー空間から x86 デバッグ レジスタを書き込むにはどうすればよいですか?
OSX ユーザー空間プログラムから、x86 仕様 (DR0-7) で定義されているデバッグ MSR を試してみたいと思います。残念ながら、これらには CPL == 0 (別名リング 0) が必要です。私は OSX syscalls を試してみましたが、kernel_debug
これらにアクセスする方法として実際に飛び出すものは何もありません。
のような高レベルのインターフェースを介してのみ利用できる場合もありますが、それが事実なkernel_debug
のか、それともそれらにアクセスするための魔法の呼び出しが見つからなかっただけなのかは不明です。
私の最終的な目標は、レジスタ自体ではなく、これらのレジスタの機能にアクセスすることです。ハードウェアブレークポイントの設定などの方法について洞察を持っている人はいますか?
assembly - CPUID:一部の関数でMISC_ENABLE.LCMVを0に設定する必要があるのはなぜですか?一時的に上書きできますか?
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レジスタ(サポートされている最大標準レベル)の出力に反映されますか?
ふぅ...それだけだと思います。
prefetch - ハードウェア プリフェッチャーを無効にできません
Intel Core i5 2500 でいくつかのメモリ ベンチマークを実行するために、ハードウェア プリフェッチャーを無効にしようとしています。問題は、プリフェッチャーを有効または無効にするオプションが BIOS にまったくないことです。そのため、msr-tools を使用してプリフェッチャーを無効にしようとしています。しかし、msr-tool は必要なレジスタ (0x1a0h) にいくつかの特定の値を書き込むことができません。
これはすべての CPU で同じです。しかし、値 0x850088 (単にテスト用に選択したもの) を書き込もうとすると、その値は正常に書き込まれます。
問題がどこにあり、これに対する解決策は何かを誰でも指摘できますか?
また、BIOS にプリフェッチャーを無効にするオプションがないことも奇妙に感じました。これは、BIOS の特定のバージョンの状況ですか?
ありがとう。
linux - カーネル モジュールから x86 MSR を読み取る
私の主な目的は、プログラムがクラッシュしたときに、LBR レジスタによって維持されている最後の 16 分岐のアドレス値を取得することです。今まで2つの方法を試しました-
1) msr-tools これにより、コマンド ラインから msr 値を読み取ることができます。C プログラム自体からシステム コールを作成し、値を読み取ろうとします。しかし、レジスタ値は、プログラム自体のアドレスに関連していないようです。ほとんどの場合、レジスターはシステム コードの他のブランチから汚染されています。リング 0 とファー ジャンプの分岐の記録をオフにしてみました。しかし、それは役に立ちません。まだ無関係な値を取得しています。
2) カーネル モジュールを介したアクセス わかりました、msr レジスタに直接アクセスし、おそらくレジスタ汚染を回避するために、非常に単純なモジュールを作成しました (これまでにこれを行ったことはありません)。
これが私が持っているものです -
しかし、問題は、dmesg を使用して出力を読み取るたびに、
(私は他のレジスタを試しました - それは常に0になります)
ここで私が忘れていることはありますか?何か助けはありますか?ありがとう
msr - Ivy Bridge Xeon で RAM エラー訂正を制御するモデル固有のレジスタはどれですか?
Ivy Bridge システムでエラー修正が有効かどうかを判断するにはどうすればよいですか? (Xeon 12xx-v2 CPU と ECC UDIMM の組み合わせが必要です)。
理想的には、このようなメソッドは、必要なハードウェアのないシステムでも実行され (ECC が無効であることを返します)、ハードウェアが存在する場合はメモリ コントローラーの構成をチェックします。しかし、私の目的のためには、間違いなく ECC 対応の CPU と RAM を備えたシステムで動作する必要があります。
通常は MemTest86+ などの既存のツールを使用してこれを確認しますが、まだ Ivy Bridge をサポートするように更新されていません。
c - ハードウェアプロセッサカウンターが誤ってリセットされる
Intelチップ上のAPERF/MPERFカウンターを読み取るプログラムを作成しました(http://www.intel.com/content/dam/doc/manual/64-ia-32-architectures-software-developer-volの2ページ) -3b-part-2-manual.pdf)。
これらのカウンターは、readmsr / writemsr命令を介して読み取り/書き込み可能であり、現在、Windows 7のデバイスドライバーを介して一定の間隔で読み取りを行っています。カウンターは64ビットであり、プロセッサークロックごとにほぼ増分します。 dは非常に長い時間でオーバーフローすることを期待していますが、カウンターを読み取ると、別のプログラムによってリセットされているかのように値がジャンプします。
どのプログラムがカウンターをリセットするかを追跡する方法はありますか?他の何かが間違った値を読み取る原因になっている可能性がありますか?私が使用している関連するアセンブリと対応するC関数を以下に添付します。rdmsrからの64ビットの結果はeax:edxに保存されるため、r_xレジスタに数値がないことを確認するために、コマンドを複数回実行してすべてをチェックします。
C:
組み立て:
印刷される結果は次のようになりますが、変更されるレジスタはraxレジスタのみであり、単調に増加することはありません(ジャンプする可能性があります)。
c - LBRスタックがいついっぱいになるかを判断する
私が関わっているプロジェクトの背景から始めましょう。新しいx86プロセッサに存在する最後のブランチレコード(LBR)機能を有効にするLinuxカーネルモジュール(3.5カーネル)を作成しようとしています。後で分析するために、ブランチデータをハードディスク上のファイルに書き込みます。
現在、LBRを有効にすることができ、ブランチを検出するとLBR Top of Stack Pointerが変化するのを確認できます(したがって、LBRが有効になっていることがわかります)。
私たちの問題は、LBRスタックからデータを読み取ってハードディスクに書き込むことができるように、LBRスタックがいついっぱいになるかを判断する方法がわからないという点で発生します。理想的には、LBRスタックがいっぱいに近づいたときに例外をスローし、情報を取得するハンドラーを作成するLBRのオプションを有効にします。
これまでのところ、これを行うのに最も近いのは、分岐が検出されるたびに割り込みをスローできるようにするIA32_DEBUGCTLMSRの8番目のビットを設定することです。残念ながら、分岐が発生するたびにディスクに書き込むと、パフォーマンスに必要以上の影響が生じます。個々のブランチではなく、LBRスタックがいっぱいになるたびにデータをバッチで書き込むことをお勧めします。私が見逃している代替案はありますか、それともすべての分岐の後に弾丸を噛んでディスクに書き込む必要がありますか?
ありがとう
file-permissions - ユーザー空間からの /dev/cpu/*/msr の読み取り: 操作は許可されていません
msr レジスタを読み取ることができる単純なアプリケーションを作成しようとしており、このアプリケーションをユーザー空間から実行しています。
msr モジュールをロードし、すべてのユーザーに /dev/cpu/*/msr への読み取りアクセス許可を付与しました。ただし、ユーザーはこれらのファイルにアクセスできませんが、ルートはアクセスできます。
権限は次のようになります。
これらのファイルをユーザー空間から読み取ろうとすると、「操作は許可されていません」というエラー メッセージが表示され続けますが、root がそれらにアクセスしようとすると正常に動作します。私は何を間違っていますか?私はカーネルバージョン3.11.0のUbuntu 13.04を使用しています。
assembly - MSR MPERF を読み取るための条件は何ですか?
MPERF および APERF MSR を読み取ろうとしています。ただし、これを行うと、おそらく GP 例外が原因でマシンが再起動します。
私が使用するコードは次のとおりです。
コードは rdmsr で壊れます。Intel Haswell プロセッサを使用しています。ロングモードで走っています。
独自のオペレーティング システムを実行しているので、Ring 0 で実行していると確信しています。さらに、もしそうなら:
例外なく機能します。
この特定のレジスタ (MPERF) を読み取るための他の条件は何ですか?
linux - Core i7 でハードウェア プリフェッチャーを無効にできない
Core i7 システムでハードウェア プリフェッチャーを無効にしようとすると、エラーが発生します。リンクの方法に従っていますハードウェアのプリフェッチをプログラムで無効にするにはどうすればよいですか?
私のシステムでは
grep -i msr /boot/config-$(uname -r)
CONFIG_X86_DEBUGCTLMSR=y
CONFIG_X86_MSR=y
CONFIG_SCSI_ARCMSR=m
ここに私のエラーメッセージがあります
root@ ./rdmsr 0x1a0
850089
[root@ ./wrmsr -p 0 0x1a0 0x850289 (Core i7 でハードウェア プリフェッチャーを無効にするため)
wrmsr:pwrite: 入出力エラー
Adjacent cache line prefetcherを無効にしても同じエラーが発生します
この問題を解決する方法はありますか? 前もって感謝します 。