web-dev-qa-db-ja.com

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

どして /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

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

8
Irbis

4つのレコードは異なる権限を持っているため、それらをマージすることはできません。

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

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

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

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

マップされていないギャップのソースと詳細情報: RJKがgnome-panelで290MBを使用する理由 Linuxカーネルのドキュメントの /proc/PID/mapsのエントリも参照してくださいLinuxの理解/ proc/id/maps および / proc/$ pid/mapsは、スタックオーバーフロー上のx86_64 linux でrwx権限のないページを表示します。