すべての呼び出しで ld.so.cache と libc.so.6 メモリがマップされますか?

すべての呼び出しで ld.so.cache と libc.so.6 メモリがマップされますか?

私が見るstraceと、ほとんどすべてのプロセスが開いていてメモリにマップされているようですld.so.cachelibc.so.6少なくとも私が試したプロセスではそうです。これは、これらのプロセスがプロセスメモリに複数回マッピングされるという意味ではありませんか?

もちろん、これらのファイルは非常に小さいですが、メモリの無駄ではありませんか?

strace出力では、これらの項目はMAP_PRIVATEセットを使用してmmappedされ、書き込み中のコピーは可能ですが、まだプロセスごとに新しいマップがあるようです。

私の質問:

  1. 何が起こっているのかを正しく理解していますか?つまり、実際にそのファイルを必要とするすべてのプロセス(すべてのプロセスであるように見える)のメモリにマップされたこれらのファイルの新しいコピーはありますか?
  2. どのタイプのメモリ共有がありますか?つまり、マッピングは書き込み中のコピーなので、多くのプロセスが同じ物理メモリ位置を見ていますか?

答え1

  1. はい、各プロセスには必須ライブラリへの独自のマッピングがあります。

  2. はい、ほとんどのデータは共有されるため、各ファイルの同じバージョンが共有されていると仮定すると、各プロセスは同じ物理メモリ(異なる線形アドレス)を「認識」します。

次のようにmaps各プロセスディレクトリ/proc/のファイルを表示すると、さまざまなマッピングを表示できます。libc

7f1014062000-7f10141f7000 r-xp 00000000 fd:0d 1444681                    /lib/x86_64-linux-gnu/libc-2.24.so
7f10141f7000-7f10143f7000 ---p 00195000 fd:0d 1444681                    /lib/x86_64-linux-gnu/libc-2.24.so
7f10143f7000-7f10143fb000 r--p 00195000 fd:0d 1444681                    /lib/x86_64-linux-gnu/libc-2.24.so
7f10143fb000-7f10143fd000 rw-p 00199000 fd:0d 1444681                    /lib/x86_64-linux-gnu/libc-2.24.so

または

7f4d7a8ec000-7f4d7aa81000 r-xp 00000000 fd:0d 1444681                    /lib/x86_64-linux-gnu/libc-2.24.so
7f4d7aa81000-7f4d7ac81000 ---p 00195000 fd:0d 1444681                    /lib/x86_64-linux-gnu/libc-2.24.so
7f4d7ac81000-7f4d7ac85000 r--p 00195000 fd:0d 1444681                    /lib/x86_64-linux-gnu/libc-2.24.so
7f4d7ac85000-7f4d7ac87000 rw-p 00199000 fd:0d 1444681                    /lib/x86_64-linux-gnu/libc-2.24.so

読み取り専用および実行可能マッピングは、ライブラリの共有実行可能コードに対応します。読み取り専用マッピングは、ライブラリの共有読み取り専用データにアクセスできます。上記のように、リニアアドレスは異なります(アドレス空間レイアウトのランダム化や他のロード順序による)。共有部分がメモリにロードされると、デフォルトの物理アドレスは同じです(マップがデフォルトファイルをマップするため)。共有メモリを直接マッピングするよりも)。

関連情報