ユーザー空間のテキストセグメントを0x8048000から始める基本原理

ユーザー空間のテキストセグメントを0x8048000から始める基本原理

私は、すべてのユーザースペースコードがロードアドレス0x8048000の仮想メモリアドレススペースに配置されているというどこか(少なくともLinux v. 2.6ベース)を読みました。

私自身の観察はこれを確認します。私は一つ作った

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

複数のプロセスとプロセスの最初の部分の場合、プログラムはtext常に「0x8048000」から始まります。

さらに、Cライブラリのスタートアップコードと他のすべてのランタイム機能がこのデフォルトの後ろにマップされているようです。

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

だから私の質問はなぜですか?

私たちは仮想アドレスを扱っており、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リンカーがldELF実行可能ファイルを設定して、カーネルにそれをわずかに低くまたは高いアドレスにマッピングさせることができます。これを行う方法はGCCとldバージョンによって異なりますので、マニュアルページをよくお読みください。これは、0x8048000が一部のハードウェア要件ではなく他の考慮事項によって発生することを示す傾向があります。

関連情報