|
位置独立コード(いちどくりつコード、英: '、PIC)または位置独立実行形式(いちどくりつじっこうけいしき、英: '、PIE)とは、主記憶装置内のどこに置かれても絶対アドレスに関わらず正しく実行できる機械語の列である。PICは主に共有ライブラリに使われ、各プログラムが(例えば他の共有ライブラリに)使われていない任意の別々のアドレスに同じ共有ライブラリをロードして使うことができる。PICはMMUのない古いコンピュータシステムでも使われていた。PICを使えば、MMUのないシステムであってもオペレーティングシステム (OS) が単一のアドレス空間内で複数のアプリケーションを共存させることができる。 位置独立コードはメモリ上の任意の位置にコピーでき、修正することなく実行できる。リロケータブルコードは、指定されたアドレスで実行可能にするためにリンケージエディタやローダが特別な処理を施すが、位置独立コードではそれが不要である。位置独立コードはソースコードにおける特別な意味論が必要で、コンパイラがそれをサポートしていなければならない。絶対アドレスを指定する分岐命令など、特定のメモリアドレスを参照する命令は、等価なプログラムカウンタ相対命令に置き換えなければならない。そのために命令数が増えることもあるので効率は低下するが、最近のプロセッサはその差が無視できる程度になるよう設計されている。、PIC)または位置独立実行形式(いちどくりつじっこうけいしき、英: '、PIE)とは、主記憶装置内のどこに置かれても絶対アドレスに関わらず正しく実行できる機械語の列である。PICは主に共有ライブラリに使われ、各プログラムが(例えば他の共有ライブラリに)使われていない任意の別々のアドレスに同じ共有ライブラリをロードして使うことができる。PICはMMUのない古いコンピュータシステムでも使われていた。PICを使えば、MMUのないシステムであってもオペレーティングシステム (OS) が単一のアドレス空間内で複数のアプリケーションを共存させることができる。 位置独立コードはメモリ上の任意の位置にコピーでき、修正することなく実行できる。リロケータブルコードは、指定されたアドレスで実行可能にするためにリンケージエディタやローダが特別な処理を施すが、位置独立コードではそれが不要である。位置独立コードはソースコードにおける特別な意味論が必要で、コンパイラがそれをサポートしていなければならない。絶対アドレスを指定する分岐命令など、特定のメモリアドレスを参照する命令は、等価なプログラムカウンタ相対命令に置き換えなければならない。そのために命令数が増えることもあるので効率は低下するが、最近のプロセッサはその差が無視できる程度になるよう設計されている。、PIE)とは、主記憶装置内のどこに置かれても絶対アドレスに関わらず正しく実行できる機械語の列である。PICは主に共有ライブラリに使われ、各プログラムが(例えば他の共有ライブラリに)使われていない任意の別々のアドレスに同じ共有ライブラリをロードして使うことができる。PICはMMUのない古いコンピュータシステムでも使われていた。PICを使えば、MMUのないシステムであってもオペレーティングシステム (OS) が単一のアドレス空間内で複数のアプリケーションを共存させることができる。 位置独立コードはメモリ上の任意の位置にコピーでき、修正することなく実行できる。リロケータブルコードは、指定されたアドレスで実行可能にするためにリンケージエディタやローダが特別な処理を施すが、位置独立コードではそれが不要である。位置独立コードはソースコードにおける特別な意味論が必要で、コンパイラがそれをサポートしていなければならない。絶対アドレスを指定する分岐命令など、特定のメモリアドレスを参照する命令は、等価なプログラムカウンタ相対命令に置き換えなければならない。そのために命令数が増えることもあるので効率は低下するが、最近のプロセッサはその差が無視できる程度になるよう設計されている。 == 歴史 == 初期のコンピュータではコードは位置依存だった。プログラムは特定アドレスにロードされ、実行されるよう構築されていた。複数のジョブを同時に並行して実行させるには、それらジョブが必要とするアドレスが重ならないようオペレータが注意深くスケジューリングする必要があった。例えば、給与支払いプログラムと受取勘定プログラムが共に同じアドレスで動作するよう構築されていた場合、オペレータはそれらを同時に実行させることができない。時には1つのプログラムのロードアドレスを変化させた複数のバージョンを作っておき、スケジューリングしやすくしていた。 より柔軟にするため、位置独立コードが発明された。位置独立コードをロードするアドレスはオペレータが任意に選択可能である。 動的アドレス変換(MMUが提供する機能)によって各プロセスに別々のアドレス空間が割り当てられるようになり、位置独立コードはほとんど不要となった。位置独立コードは位置依存コードより効率が悪いため、動的アドレス変換の方がよりよい解決策だった。 次に解決すべき課題は、複数の似たようなジョブを同時に実行する際、同じコードを複数回ロードしなければならず、メモリを無駄に使用することになる点である。全く同じプログラムを動作させる2つのジョブがあるとき、動的アドレス変換では物理メモリ上にロードしたプログラムを2つのジョブの仮想アドレス空間にマッピングすることで、1つのプログラムのコピーがメモリ上には1つしかないようにすることができる。 しかし、プログラムは別々でも多くのコードが共通しているということの方が多い。例えば給与支払いプログラムと受取勘定プログラムは、全く同一のサブルーチンを数多く含んでいると考えられる。そこでモジュールの共有という考え方が生まれた(共有ライブラリは共有モジュールの一種である)。給与支払いプログラムと受取勘定プログラムの主プログラムはそれぞれ別のメモリにロードされるが、共有モジュールは物理メモリ上には1回だけロードされ、それを2つの仮想アドレス空間にマッピングする。 位置独立コードはユーザーレベルのアプリケーションで使われるだけでなく、OS内でも使われている。初期のページング方式は仮想アドレス空間を採用していなかった。その代わりOSが必要に応じて個々のモジュールをロードし、必要性の低いモジュールを上書きしていた(OSが使用可能なメモリはOS自体よりも小さかった)。モジュールは必要なときに空いているメモリ上で動作可能でなければならないため、個々のOSモジュールは位置独立コードとして書かれていた。 仮想記憶の発明で、OS自体も広大な仮想アドレス空間を持てるようになり、各OSモジュールに別々の恒久的仮想アドレスを割り当てられるようになったので、、この技法も廃れた。 抄文引用元・出典: フリー百科事典『 ウィキペディア(Wikipedia)』 ■ウィキペディアで「位置独立コード」の詳細全文を読む スポンサード リンク
|