web-dev-qa-db-ja.com

pmap出力について

Linux x86-64でpmap -xコマンドを使用してプロセスのメモリマップを表示しようとしました。 pmapの出力を見て混乱しました。特に、動的ライブラリをマッピングするためのエントリについて。それらには複数のエントリがあります(実際には、それらすべてのほとんどすべてに対して4つで、一部には3つのエントリがあります)。以下は一例です

  Address           Kbytes   RSS   Dirty Mode   Mapping

00000036ca200000      88      64       0 r-x--  libpthread-2.5.so
00000036ca216000    2044       0       0 -----  libpthread-2.5.so
00000036ca415000       4       4       4 r----  libpthread-2.5.so
00000036ca416000       4       4       4 rw---  libpthread-2.5.so

各ライブラリの2番目の行のサイズは常に2MBですが、ページの権限はありません。すべてのライブラリで、RSSは常にゼロのようです。最後の2行も同じサイズ(基本ページサイズ)と同じ権限(一部のライブラリにはrwマッピングがありません)があります。

誰かこれについて何らかの説明がありますか?おそらく、読み取り専用保護を使用したマッピングはローダーによって行われ、ライブラリのメタデータを読み取りますが、実行権限を持つ部分は実際にはライブラリのコードです。私は間違っているかもしれません。

しかし、私はその真ん中の列についての手がかりはありません。許可も使用法もありませんか?誰かがここに知恵の言葉を持っていますか?

また、匿名のメモリ上にあり、モードビットが設定されていないことが報告されているページがいくつかありました。これらは何を表していますか?

20
Arka

まず最初に、1つの同じプロセスが複数のメモリ使用インスタンスを使用できるというケースが考えられます。これがあなたが知りたいことかどうかはわかりません。 Linuxでブラウザを使用してタブを1つだけ開き、topコマンドを使用すると、メモリ使用量リストに4を超える使用量が表示され、10 MBを超えるメモリをカバーしていることがわかりました。同じプロセスで実行されるスレッドの数が多いため、問題はないと思います。

使用例自体では、観察すると-xコマンドのマッピングがより多くの使用量を表示するため、このリンクが役立つ場合があります。

http://www.cyberciti.biz/tips/howto-find-memory-used-by-program.html

4
Xander

これらの保護された「----」ページは、ポインタがライブラリのコードとデータセグメントの間でインデックスを作成するのを防ぐための保護ページです。それらはプロセスの仮想空間にのみ存在し、ポインターがセグメントの終わりを過ぎると障害を引き起こすために存在します。

これらが共有ライブラリファイルにアドレス指定されていない場合、割り当てを拡張するためのバッファーとして機能していたと言えます。 mallocまたはスタックの成長。たとえば、glibcは、スレッドローカル割り当てアリーナに対してカーネルにアドレススペースの大きなチャンクを要求し、mallocによる割り当てのためにそれらをゆっくりと消費します。私が見ているJVMからのはるかに大きなpmapには、これらの数十があり、それぞれがRWページに従っているか、2つの大きなRW割り当て間のスペースを埋めており、RWページが拡大するにつれてそれらの境界がシフトします。 X86_64では、このようなガードページは、CPUのメモリ保護システムを使用して、不正なポインタ逆参照をキャッチできます。

6
user5479960