2012-03-22 34 views
17

pmap -xコマンドを使って、Linux x86-64上のプロセスのメモリマップを見ようとしていました。私はpmapの出力を見て混乱しました。特に、ダイナミックライブラリをマッピングするエントリの場合。それらには複数のエントリがあります(実際にはすべて4つ、一部には3つのエントリがあります)。以下は、それがページ権限を持っていない一方で、ライブラリのそれぞれについて、第二列は、常に2メガバイトのサイズを有している例pmap出力を理解する

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 

です。すべての図書館で、RSSはいつもゼロであるようです。最後の2行も同じサイズ(基本ページサイズ)と同じ権限を持ちます(少数のライブラリにはrwマッピングがありません)。

これについて誰かが説明していますか?私は、読み込み専用保護によるマッピングが、ライブラリのメタデータを読み込むためにローダによって行われる可能性があり、実行可能パーミッションを持つ部分が実際にはライブラリのコードである可能性があるという感覚がある。私は間違っているかもしれません。

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

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

+0

[/ proc/$ pid/maps]は、x86 \ _64 linuxのrwx権限を持たないページを表示します(http://stackoverflow.com/questions/16524895/proc-pid-maps-shows-pages-with) -no-rwx-permissions-on-x86-64-linux) –

+0

は、タイプミスを修正しようとしました:*実行可能なパーミッションを持つ*実際にはライブラリのコード* ...は "is"のように見えますが、 100%確実。手伝ってくれる? –

答えて

4

まず、同じプロセスが複数のメモリ使用インスタンスを使用できる場合があります。これがあなたが知りたがっているかどうかは分かりません。 Linuxでブラウザを使用しているときに、1つのタブしか開いていない状態でtopコマンドを使用すると、10MB以上のメモリをカバーする4つ以上のメモリ使用状況が表示されます。私は同じプロセスで実行されているスレッドの数が増えていると思う。

このリンクは、使用例そのものを観察した場合に便利な場合があります。そのため、-xコマンドのマッピングではより多くの使用法が示されます。

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

3

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

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

関連する問題