4

プログラムがアクセスしているページを確認したい。1 つの方法は、handler を使用mprotectSIGSEGVて、アクセスされているページを書き留めることです。ただし、これには、関心のあるすべてのメモリ ページに保護ビットを設定するオーバーヘッドが伴います。

心に浮かぶ 2 番目の方法は、最初にトランスレーション ルックアサイド バッファー (TLB) を無効にしてから、ミスを書き留めることです。失敗するたびに、アドレス指定されたメモリページを書き留めます。したがって、それを書き留めます。問題は、Linux プログラムのユーザー空間で TLB ミスを処理する方法です。

また、TLB ミスやmprotectよりも速く、汚れたメモリ ページを書き留める方法を知っている場合は、お知らせください。また、x86 のみのソリューションが必要です。

4

3 に答える 3

7

プログラムがアクセスしているページを確認したい。

CPUをシミュレートして、このデータを取得できます。バリエーション:

  • 1)valgrind-インストルメンテーションを適切にサポートするユーザースペースバイナリの動的トランスレータ。cachegrindツールを試してください-L1/L2キャッシュもエミュレートします。また、すべてのメモリアクセスをログに記録する新しいツールの構築を試みることもできます(ページの粒度など)
  • 2)qemu-システム全体とプロセス全体の両方のモードの動的トランスレータ。私が知っているように、元のqemuにはインストルメンテーションはありません
  • 3)bochs-システム全体のCPUエミュレーター(非常に遅い)。「メモリアクセス」コードを簡単にハックして、メモリログを取得できます。
  • 4)PTLsim-www.ptlsim.org/papers/PTLsim-ISPASS-2007.pdf

ただし、これには、すべてのメモリページの保護ビットを設定するオーバーヘッドが含まれます。

このオーバーヘッドは大きすぎますか?

ここで問題となるのは、LinuxプログラムのユーザースペースでTLBミスを処理する方法です。

カーネル空間(x86および他の多くの一般的なプラットフォーム)でも、ミスもユーザー空間でも処理できません。これは、ほとんどのプラットフォームがハードウェアのTLBミスを管理しているためです。MMU(CPU /チップセットの一部)はページテーブルをウォークオンし、物理アドレスを透過的に取得します。一部のビットが設定されている場合、またはアドレス領域がマップされていない場合にのみ、ページフォールト割り込みが生成され、カーネルに配信されます。

また、最近のCPUではTLBをダンプする方法がないようです(しかし、386DXはこれを行うことができました

導入された遅延により、TLBミスの検出を試みることができます。ただし、この遅延は、TLBルックアップの順序が正しくない開始によって隠すことができます。

また、ほとんどのハードウェアイベント(メモリアクセス、tlbアクセス、tlbヒット、tlbミス)は、ハードウェアパフォーマンスモニタリングによってカウントされます(CPUのこの部分は、Vtune、CodeAnalyst、およびoprofileによって使用されます)。残念ながら、これはイベントのグローバルカウンターにすぎず、同時に2〜4を超えるイベントをアクティブ化することはできません。良いニュースは、あるカウントに達したときに割り込みをかけるようにperfmonカウンターを設定できることです。次に、カウントに達した命令のアドレス($ eip)を(割り込みを介して)取得します。したがって、このハードウェアでTLB-miss-heavyホットスポットを見つけることができます(これは、すべての最新のx86 CPUにあります。IntelとAMDの両方です)。

于 2011-09-24T15:09:46.930 に答える
6

TLB はユーザー空間プログラムに対して透過的です。せいぜい、いくつかのパフォーマンス カウンター (アドレスなし) で TLB ミスをカウントできます。

于 2011-09-23T15:08:25.727 に答える
-1

プロセスの /proc/PID/maps ファイルを見てください。http://www.kernel.org/doc/Documentation/filesystems/proc.txtのドキュメントによると、 /proc/PID/maps は各プロセスのメモリ マップを指定します。このマップは、「私のプログラムがどのページにアクセスしているか」を示します。ただし、これらのうちどれがダーティ ページかを知りたいようです。ダーティなページの正確なリストを見つける方法はわかりません、/proc/PID/smaps のプライベート ダーティ フィールドと共有ダーティ フィールドを見て、それをページサイズで割ることで、ダーティなページの数を見つけることができます。この方法はかなり高速であることに注意してください。/proc/PID/maps を定期的にポーリングすることで、どのページが汚れているかについてのおおよそのアイデアを得ることができると思います。

于 2012-10-10T00:26:10.777 に答える