/ proc / pid / mapsの共有ライブラリマッピング


8

/proc/pid/maps同じライブラリのいくつかのレコードが含まれているのはなぜですか?次に例を示します。

7fae7db9f000-7fae7dc8f000 r-xp 00000000 08:05 536861                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
7fae7dc8f000-7fae7de8f000 ---p 000f0000 08:05 536861                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
7fae7de8f000-7fae7de97000 r--p 000f0000 08:05 536861                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
7fae7de97000-7fae7de99000 rw-p 000f8000 08:05 536861                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20

これは何を意味するのでしょうか ?

回答:


12

4つのレコードには異なるアクセス許可があるため、それらをマージすることはできません。

  • r-xpエントリは、実行可能メモリ(ブロック説明x許可フラグ)。それがコードです。
  • r--pエントリは(のみ読み取り可能なメモリのブロックについて説明しr許可フラグを)。これは静的データ(定数)です。
  • rw-pエントリは、書き込み可能である(メモリのブロックについて説明w許可フラグ)。これは、ライブラリのグローバル変数用です。
  • ---pエントリは、任意の権限(またはそれにマッピングされた任意のメモリを)持っていないアドレス空間のチャンクを記述する。

すべてがプライベート(pフラグ)です。つまり、プロセスがページを変更した場合(書き込み可能な部分でのみ可能)、そのページはコピーされ(コピーオンライト)、他のプロセスは変更を認識しません。

最後のエントリは、特定の状況下でGNUリンカーによって明示的に挿入されたコードセグメントとデータセグメントの間のギャップです。このギャップの目的は、コード(同じライブラリを使用するプロセス間で共有可能)と書き込み可能なデータ(共有不可)が同じページに存在しないようにすることです。ギャップのサイズは2MBです。これは、Linuxがアーキテクチャ(amd64)で使用する最大のページサイズです¹。Linuxで使用できないように見えるメモリマッピングの目的は何ですか?を参照してください詳細については。

¹ ほとんどのページは4kBで、これは「通常の」ページサイズです。しかし、MMUインダイレクションの使用が少ないページが存在する可能性があります。これはわずかに高速ですが、アプリケーションが実際に非常に大きなメモリブロックを使用しない限り、多くのスペースを浪費します。Linuxはこれらの巨大なページを呼び出します

マッピングされていないギャップのソースと詳細:なぜgnome-panelは290MBを使用するのですか?RJKによる。参照してくださいのエントリ/proc/PID/mapsのLinuxカーネルのドキュメントではLinuxの/ procの/ IDの概要/マップすると、/ procの/ $ PID /は、x86_64版Linux上で無rwxの権限を持つ番組ページにマッピングスタックオーバーフロー上を。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.