プログラムがアクセスしているページを確認したい。
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の両方です)。