どして /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
これは何を意味するのでしょうか ?
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権限のないページを表示します。