web-dev-qa-db-ja.com

プロセスのページテーブルを表示する

カーネルが私のプロセスの1つに対して管理するページテーブルを見たいのですが。私の場合、PID 4680はdhclientにマップされます。したがって、ページテーブルを表示するために、次のことを試しました。

Sudo cat /proc/4680/pagemap 

ただし、このコマンドは出力なしでUbuntu 14.04でハングします。私は2分間待ってから、それを殺さなければなりませんでした。

これを行うより良い方法はありますか?

3
sshekhar1980

ドキュメント によると、/proc/PID/pagemapには、仮想ページごとに1つの64ビット値が含まれています。

4096バイトのページと64ビットの仮想アドレス空間により、2**52ページ。したがって、完全なpagemapファイルは2**52各8バイトのエントリ。これは非常に大きなファイルです。すべてをキャッチするには長い時間がかかります。 2分ではありません。本当に長い時間です。私のコンピューターでの速度テストでは、約21年かかると考えられます。

そして、ほとんどがゼロで埋められます(プロセスでマッピングされていないすべての仮想アドレスに対して)。たくさんの \0の端末への出力は、目に見える効果を引き起こしません。ハングしていない、それはあなたが要求したことをしている。

これはテキストファイルではないので、0以外のエントリは、端末でも見栄えがよくありません。

ページマップファイルを使用する正しい方法は、探している仮想アドレスを確認し、シークして、8バイトを読み取ることです。または、ある範囲の情報が必要な場合は、8バイトの倍数を読み取ります。すべてのゼロ以外のエントリが必要な場合は、最初に/proc/PID/mapsマップされている範囲を検索します。

5
user41515

/proc/<pid>/mapsをお探しのようです。プログラムとそのライブラリのマップを見ることができます。これらの各領域のコンテンツにアクセスする場合は、/proc/<pid>map_filesディレクトリにアクセスできます。ここで、各ファイル名は各ブロックのメモリ範囲によって設定されます。

この詳細については、man proc/proc/[pid]/map_files/および次の段落を探してください。

X11ベースのプログラムのメモリ使用量ブロックの(一部)の例を次に示します。

enter image description here

0
jcoppens