アドレス空間の再配置とリンカーによって行われる再配置タスクの間に違いはありますか??私の知る限り、リンカーによって行われる再配置タスクには、シンボリック参照をシンボリック定義に接続するプロセスが含まれます。実行ファイルをメモリに取り込み、そのアドレス参照はすべてメモリに配置されている場所の先頭アドレスを参照して解決されますよね?? また、このアドレス空間の再配置を誰が行っているのか知りたいです。 ??
2 に答える
はい、あなたが正しい。オペレーティング システムのプロセス ローダーは、ロード時の再配置を行います。実際には、実行時リンカーとして機能します。
プロセッサには MMU (Memory Manegemt Unit) があります。これにより、各プロセス/プログラムに独自の限られたメモリ空間が与えられます。これが、プログラムのバッファ オーバーフローが現在大きな損害を与えることができない理由です。このようにして、各プログラムは独自のメモリ内に存在します。OS がこれを処理します。
編集:
プログラムは通常、赤のみの場所 (ROM/ディスク/フラッシュ) から実行され、一時的な値のスタックが必要です。たとえば、c/c++ の場合、ほとんど常に変化しますが、char/int/long/float および配列として定義された特殊な値はもちろんスタックに置かれます。つまり、リンカはスタック上またはプログラム自体 (通常は読み取り専用) 内のデータのみを使用および期待します。
プログラムがコンパイル時に定義できないサイズの余分なメモリを必要とする場合、ヒープが必要です。ヒープは malloc または new で割り当てられます (c/c++)
しかし、RAMからの読み取りは通常、他の種類のメモリストレージデバイスからの読み取りよりも高速であるため、OSはディスクからプログラムをRAMにコピーし、そこからプログラムの実行を開始します。