/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/maps
Linuxカーネルドキュメントのエントリ、Linux /proc/id/mapsについてそして/proc/$pid/maps は、x86_64 Linux で rwx 権限のないページを表示します。スタックオーバーフローに。