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

/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

どういう意味ですか?

ベストアンサー1

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

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

すべてプライベート(pフラグ)です。つまり、あるプロセスがページを変更した場合(書き込み可能な部分にのみ適用されます)、ページがコピーされ(書き込み時のコピー)、他のプロセスに変更は表示されません。

最後のエントリはコードセグメントとデータセグメントの間の間隔で、場合によってはGNUリンカによって明示的に挿入されます。この間隔の目的は、コード(同じライブラリを使用するプロセス間で共有可能)と書き込み可能データ(共有不可能)が決して同じページにないことを確認することです。間隔のサイズは2MBです。これは、アーキテクチャ(amd64)でLinuxが使用する最大ページサイズであるためです。バラよりLinuxで利用できないように見えるメモリマッピングの目的は何ですか?詳細については。

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

マップされていないギャップと追加情報のソース:gnome-panelが290MBを使用するのはなぜですか?RJK提供。また、見ることができます/proc/PID/mapsLinuxカーネルドキュメントのエントリLinux /proc/id/mapsについてそして/proc/$pid/maps は、x86_64 Linux で rwx 権限のないページを表示します。スタックオーバーフローに。

おすすめ記事