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マッピングがありません)があります。
誰かこれについて何らかの説明がありますか?おそらく、読み取り専用保護を使用したマッピングはローダーによって行われ、ライブラリのメタデータを読み取りますが、実行権限を持つ部分は実際にはライブラリのコードです。私は間違っているかもしれません。
しかし、私はその真ん中の列についての手がかりはありません。許可も使用法もありませんか?誰かがここに知恵の言葉を持っていますか?
また、匿名のメモリ上にあり、モードビットが設定されていないことが報告されているページがいくつかありました。これらは何を表していますか?
まず最初に、1つの同じプロセスが複数のメモリ使用インスタンスを使用できるというケースが考えられます。これがあなたが知りたいことかどうかはわかりません。 Linuxでブラウザを使用してタブを1つだけ開き、topコマンドを使用すると、メモリ使用量リストに4を超える使用量が表示され、10 MBを超えるメモリをカバーしていることがわかりました。同じプロセスで実行されるスレッドの数が多いため、問題はないと思います。
使用例自体では、観察すると-xコマンドのマッピングがより多くの使用量を表示するため、このリンクが役立つ場合があります。
http://www.cyberciti.biz/tips/howto-find-memory-used-by-program.html
これらの保護された「----」ページは、ポインタがライブラリのコードとデータセグメントの間でインデックスを作成するのを防ぐための保護ページです。それらはプロセスの仮想空間にのみ存在し、ポインターがセグメントの終わりを過ぎると障害を引き起こすために存在します。
これらが共有ライブラリファイルにアドレス指定されていない場合、割り当てを拡張するためのバッファーとして機能していたと言えます。 mallocまたはスタックの成長。たとえば、glibcは、スレッドローカル割り当てアリーナに対してカーネルにアドレススペースの大きなチャンクを要求し、mallocによる割り当てのためにそれらをゆっくりと消費します。私が見ているJVMからのはるかに大きなpmapには、これらの数十があり、それぞれがRWページに従っているか、2つの大きなRW割り当て間のスペースを埋めており、RWページが拡大するにつれてそれらの境界がシフトします。 X86_64では、このようなガードページは、CPUのメモリ保護システムを使用して、不正なポインタ逆参照をキャッチできます。