私はLinuxがファイルをメインメモリにmmapする方法(私のコンテキストでは実行のためのものですが、mmapプロセスは書き込みと読み取りにも同じだと思います)とそれが使用するサイズに興味があります。
だから私はLinuxが一般的な4kBページサイズのページングを使用していることを知っています(カーネルでこのサイズをどこで見つけることができますか?)。しかし、これが割り当てられたメモリについて正確に何を意味するのか:数キロバイトのバイナリファイル(5812Bなど)があるとします。カーネルでは何が起こりますか? 2 * 4kBを割り当ててから5812Bをそのスペースにコピーして、ページ2から3 KB以上のメインメモリを無駄にしますか?
ページサイズを定義するカーネルソースコードのファイルを知っている人がいれば良いでしょう。
2番目の質問も簡単です。ファイルサイズを5812Bとします。このサイズはインデックスノードから直接得られたものですか?
ベストアンサー1
実行可能ファイルサイズとメモリサイズの間には直接的な関係はありません。バイナリが実行されたときに何が起こるかについての簡単な概要は次のとおりです。
- カーネルはファイルを解析し、いくつかの部分に分割します。一部のセクションはメモリの別のページに直接ロードされます。一部の部分はまったくロードされません(デバッグ記号など)。
- 実行可能ファイルが動的にリンクされると、カーネルは動的ローダーを呼び出し、必要な共有ライブラリをロードし、必要に応じてリンク編集を実行します。
- プログラムはコードの実行を開始し、通常はデータを保存するためにより多くのメモリを要求します。
実行可能ファイルの種類、接続、および実行可能ファイルの読み込みの詳細については、次を参照してください。リンカーとローダー著者:ジョンR.レビン。
5kB実行可能ファイルでは、ヘッダーを除くすべてがメモリにロードする必要があるコードまたはデータである可能性が高くなります。少なくとも1ページ、多分2ページの実行可能コードがあり、スタック用の少なくとも1ページ、おそらく1ページまたはヒープ(その他のデータ)用の1ページ、および共有ライブラリで使用されるメモリがあります。
Linuxでは、実行可能ファイルのメモリマップを確認できますcat /proc/$pid/maps
。この形式は、次の文書で説明されています。proc(5)
マンページも参照してください。Linux /proc/id/mapsについて。