Unix/Linux ローダープロセス

Unix/Linux ローダープロセス

オペレーティングシステムのどのプロセスが実行可能およびリンクされたフォーマット(ELF)ファイルをRAMにロードするのかを教えることができる人はいますか?

ベストアンサー1

ユーザーは通常、.oファイル、通常の実行可能ファイル、共有ライブラリの3種類のELFファイルに遭遇します。これらのファイルはすべて異なる目的で使用されますが、内部構造ファイルは非常に似ています。

他のすべてのELFファイルタイプ(a.outや他の多くの実行可能ファイル形式を含む)の共通の概念はセクションの概念です。セクションは同様のタイプの情報の集まりです。各セクションはファイルの一部を表します。たとえば、実行可能コードは常に次のファイルに配置されます。。テキスト;ユーザーが初期化したすべてのデータ変数は。データ;初期化されていないデータは.bss

実際、すべてが混在する実行可能ファイル形式を設計できます(例:オペレーティングシステム)。しかし、実行ファイルを複数の部分に分割することには重要な利点があります。たとえば、実行可能ファイルの実行部分がメモリにロードされた場合、これらのメモリの場所を変更する必要はありません。最新のマシンアーキテクチャでは、メモリマネージャはメモリの一部を読み取り専用としてマークできるため、読み取り専用メモリの場所を変更しようとするとプログラムが終了し、コアがダンプされます。したがって、特定のメモリ位置を変更したくないと言うことができるだけでなく、読み取り専用メモリ位置を修正しようとするすべての試みがアプリケーションのバグを示す致命的なエラーであると指定することもできます。つまり、一般に各メモリバイトの読み取り専用状態を個別に設定することはできませんが、ページというメモリ領域の保護は個別に設定できます。 i386アーキテクチャでは、ページサイズは4096バイトなので、アドレス0〜4095は読み取り専用で、バイト4096以上は書き込み可能であることを示します。

実行可能ファイルのすべての実行部分が読み取り専用メモリにあり、変更可能なすべてのメモリ位置(変数など)が書き込み可能メモリにあることを考慮すると、実行可能ファイルのすべての実行部分を1つのセクションにグループ化することが最も効率的です。です。メモリ(.text 部分)、変更可能なすべてのデータ領域を異なるメモリ領域(以下.data セクション)。

ユーザーが初期化したデータ変数と、ユーザーが初期化していないデータ変数をさらに区別します。ユーザーが変数の初期値を指定しない場合は、その値を保存するために実行可能ファイルからスペースを無駄にする必要はありません。したがって、初期化された変数は.dataセクションにグループ化され、初期化されていない変数は.bssセクションにグループ化されます。これはファイル内のスペースを占有しないので特別です。初期化されていない変数に必要なスペースを教えてくれます。

カーネルに実行可能ファイルをロードして実行するように要求したら、まずイメージヘッダーでイメージのロード方法に関する手がかりを見つけます。実行可能ファイルで.textセクションを見つけて適切なメモリ部分にロードし、そのページを読み取り専用としてマークします。次に、実行可能ファイルで.dataセクションを見つけて、それをユーザーのアドレス空間(今回は読み書きメモリ)にロードします。最後に、イメージヘッダーの.bssセクションの位置とサイズを見つけて、適切なメモリページをユーザーのアドレス空間に追加します。ユーザーが.bssの変数の初期値を指定しない場合でも、カーネルは通常、これらすべてのメモリをゼロに初期化します。

ご覧のとおり、実行可能ファイルをメモリにロードするコマンドを実行するのは実際にはカーネルです。これらの呼び出しの結果であるテキスト部分は読み取り専用メモリにロードされ、データ部分は読み書きメモリにロードされます。

おすすめ記事