2016-11-10 12 views
0

私は、プログラムのコンパイルとロードのさまざまな段階でメモリ割り当てがどのように機能するかを理解しようとしています。メモリアドレス:Linker Vs. Loader

1)コンパイラおよびアセンブラアドレス0

2)リンカーは各記号の定義とメモリ位置 を関連付ける、その後の参照のすべてを変更することによって、これらのセクションを再配置で開始コードとデータセクションを生成 それらのシンボルに、このメモリ位置を指すようにします。

3)ローダは、プロセスのコンテキスト内で、メインメモリにプログラムをロードし、ひいては
それはページングと関連するすべてのメモリ管理操作が行われていることをこの段階です。ローダによって割り当てられたものに関連するリンカによって割り当てられたアドレスである方法

1):

私の質問は、約2のものです。リンカのアドレスに仮想アドレスを呼び出すことはできますか?

2)すべてのプログラムが最終的に異なる物理アドレスにマッピングされている同じ仮想アドレス(?)

答えて

0

を持っています一般的に任意の特定のアドレスで起動しない再配置可能なコードを生成するのコンパイラ。それは完全に可能ではない場合があります。例えば。

int x ; 
int *y = &x ; 

これらは、特別な処理を必要とします。

リンカは、コンパイラが参照するプログラムセクションをマージします。リンクの出力は、プログラムをメモリに配置する方法をローダーに指示するプログラムです。これらの手順は上記のケースを処理します。

ローダーはリンカーの指示に従います。

1)リンカによって割り当てられたアドレスは、どのようにローダによって割り当てられたアドレスに関連していますか?リンカのアドレスに仮想アドレスを呼び出すことはできますか?

コンパイラまたはアセンブリが再配置できないものを生成しない限り、一般にリンカは再配置可能コードを生成します。リンカーは仮想アドレスを生成しません。

2)すべてのプログラムは、プログラムの各実行は、同じ論理アドレスのレイアウトを生成し、最終的に異なる物理アドレスにマッピングされている同じ仮想アドレス(?)ほとんどのシステムで

を持っていますか。これがセキュリティ手段としてのケースではないことがより一般的になってきています。プログラムがロードされるたびに、ロードされる方法が異なります。