オペレーティングシステムの概念Silberschatz A.、Galvin PB、Gagne G.オーサリング - オペレーティングシステムの概念、9版 - 2012
8.1.4 動的ロード
これまでの議論では、プロセスのプログラム全体とすべてのデータを実行するために物理メモリに配置する必要があります。したがって、プロセスのサイズは物理メモリのサイズによって制限されます。より良いメモリ空間を活用するために、動的ローディングを使用できます。動的ロードを使用すると、ルーチンが呼び出されるまでルーチンはロードされません。 すべてのルーチンは、再配置可能なロード形式でディスクに保存されます。メインプログラムがメモリにロードされ実行されます。ルーチンが別のルーチンを呼び出す必要がある場合、呼び出しルーチンは最初に他のルーチンがロードされていることを確認します。それ以外の場合は、再配置可能リンクローダが呼び出され、必要なルーチンをメモリにロードし、プログラムのアドレステーブルを更新してこの変更を反映します。その後、新しくロードされたルーチンに制御が渡されます。
動的ロードの利点は、ルーチンが必要な場合にのみロードされることです。この方法は、エラールーチンなどの頻繁に発生しない状況に対処するために大量のコードが必要な場合に特に便利です。この場合、プログラム全体のサイズは大きくなる可能性がありますが、使用される(したがってロードされる)部分ははるかに小さい場合があります。
動的ロードにはオペレーティングシステムの特別なサポートは必要ありません。この方法を利用するようにプログラムを設計することはユーザーの責任です。しかし、オペレーティングシステムは、動的ローディングを実装するライブラリルーチンを提供することによってプログラマを助けることができる。
8.1.5 ダイナミックリンクおよび共有ライブラリ
Linuxで「再配置可能なロード形式」を持つファイルの種類は何ですか?
- ELF実行可能ファイル、
- .so 共有ライブラリファイル、
- カーネルモジュール、
- .oオブジェクトファイル?
すべて動的にロードできますか?
参照の「再配置可能なロード形式」とは、次のような.o共有ライブラリファイルではなく、.oオブジェクトファイル、カーネルモジュールを意味します。
http://refspecs.linuxbase.org/elf/gabi4+/ch4.intro.htmlELFファイルは、実行ファイル、共有オブジェクトファイル、再配置可能ファイルの3種類に分かれています。
カーネル自体とカーネルモジュールにはどのタイプのELFがありますか?カーネルモジュールも再配置可能ELFであることを示します。
この本では、セクション8.1.5までの共有ライブラリについては何も言及していないので、セクション8.1.4の動的ロードは必ずしも共有ライブラリをユーザープログラムにロードするわけではありませんが、他のものをロードする可能性があります。本当に?
セクション8.1.4の最後の段落は、プログラマが明示的に動的ロードを実行する必要があると言っているようです。それはそれを指すか dlopen()
。dlopen()
.so共有ライブラリ、.oオブジェクトファイル、カーネルモジュール、実行可能ELFファイルなど、どのタイプのELFファイルが最初の引数として受け入れられますか?
ありがとうございます。
ベストアンサー1
共有ライブラリは実際に再配置可能である必要はありません。 AT&Tは1987年頃、SYSvr3で再配置不可能な共有ライブラリを使用しました。
AT&Tで使用する方法は共有ライブラリの固定アドレスに基づいており、共有ライブラリは特別なシステムツールを介して起動時にシステムメモリにインストールされます(すべてのプロセスで利用可能です)。これらのライブラリを使用するプログラムは、インストール時に使用された固定アドレスにリンクされます。さまざまなライブラリがロードされる場所を定義するにはグローバル管理者が必要なため、このアプローチは非常に制限されています。
今日使用されている方法は、Sun Microsystemsの1987年の研究に基づいており、1987年12月に発表されました。
これはmmap()
カーネルの機能に基づいています。各プログラムには、再配置可能コードを使用して必要なライブラリをマップする特別な開始コードが含まれています。
各ライブラリには、ライブラリ内のさまざまなシンボルのオフセットを含む特別なテーブルが含まれています。各プログラムには関数名を含むテーブルが含まれており、バイナリは必要なすべての機能に関連するテーブルエントリでジャンプサブルーチンを実行します。
このテーブルエントリには、ランタイムリンカコードのジャンプコマンドが含まれており、最初に使用されると、ランタイムリンカは共有ライブラリの関数にジャンプしてジャンプを置き換えます。
これらはすべてシステムソフトウェアによって処理され、ユーザープログラミングの対象ではありません。
注:この本では、どのプログラムも物理メモリより大きくすることはできません。 1960年代には確かにこれが事実だった。 IBMは1970年代初頭にメインフレームを変更し、BSDは1979年に仮想メモリ管理を通じてUNIXを変更しました。
dlopen()
実行時に動的ライブラリを「手動で」ロードするために使用できるため、以前に発生した操作への依存関係を可能にします。たとえば、サウンドプレーヤープログラムは、fileパラメータがエンコーディングを使用するサウンドファイルを参照していることを発見した後、dlopen
ロードデコーダを使用することを決定できます。mp3
mp3
を使用すると、dlopen
ロードされた共有ライブラリの関数は自動的にリンクされません。dlsym()
関数名からアドレスを取得し、ポインタの逆参照を介して関数を呼び出す必要があります。
ファイルを作成する必要がありますが、ファイルを作成するために必要な特別な接続プロセスによってファイルが作成されるため、dlopen
ファイルを作成できません。.o
_PROCEDURE_LINKAGE_TABLE_
.so.
マイクロソフトが使用するアプローチはdlopen
。静的ライブラリはプログラムに静的にリンクされており、ライブラリをロードして関数アドレスを取得して関数ポインタを呼び出すtrmapolinコードを含みます。dlopen
dll
Microsoftコンパイラは常に再配置可能なコードを生成するため、そのコンパイラでコンパイルされた完全静的ライブラリでも再配置可能なコードを使用します。
通常、ルーチンが参照されるまでロードされないと言うのは間違っており、このdlopen
場合にのみ適用されます。
ELFランタイムシステムによって管理されているライブラリは一覧表示できますが、
ldd
手動で管理されているライブラリは名前が実行時dlopen
文字列処理の結果である可能性があるため、一覧表示できません。