ユーザー空間のテキストセグメントを 0x8048000 から開始する理由

ユーザー空間のテキストセグメントを 0x8048000 から開始する理由

どこかで読んだのですが、(少なくとも Linux バージョン 2.6 以降) すべてのユーザー空間コードは仮想メモリ アドレス空間のロード アドレス 0x8048000 に配置されているそうです。

私の観察でもこのことが確認されています。

cat /proc/......../maps

複数のプロセスおよびプロセス プログラムの最初のセクションtextは常に '0x8048000' から始まります。

さらに、C ライブラリの起動コードとその他のすべてのランタイム機能はすべて、このデフォルト値の後にマッピングされるようです。

これは約 128 M のアドレス空間を構成しますが、0xC0000000 - 0x8048000 がユーザー空間用の約 3 G のアドレス空間であることを考慮すると、それほど多くはありません。

それで私の質問はなぜですか?

仮想アドレスを扱っているため、VM の動作方法の定義により、他のプログラムとの干渉や重複は排除されます。

0x00000000 ~ 0x8048000 の範囲に固定/デフォルトのマッピングはありますか?

デフォルトの開始アドレスがページ境界上にあるという事実以外に、他の値ではなくこの数値を選択した理由は何ですか?

答え1

以下は良い答えではないことは認めますが、0x8048000の値はELF仕様その文書の図A.4、A.5、A.6を参照してください。System V ABI Intel 386 アーキテクチャ サプリメント0x8048000 も標準化されています。3-22 ページ、図 3-25 を参照してください。0x804800 は、低テキスト セグメント アドレス/高スタック アドレスとして規定されています。スタックは通常、プロセスのメモリ空間の高アドレスに設定されるため、それ自体が奇妙であり、Linux も例外ではありません。

GNU リンカーをld使用して ELF 実行ファイルをセットアップし、カーネルがそれを多少低いまたは高いアドレスにマップするようにすることができます。これを行う方法は、GCC および ld のバージョンによって異なるため、マニュアル ページを注意深く読んでください。これは、0x8048000 がハードウェア要件から派生したものではなく、他の考慮事項から派生したものであることを示しています。

関連情報