this文書を参照してください。テキストセグメントは 0x400000から始まります。なぜこの特定の住所が選ばれたのですか?そこには の理由がありますか?同じアドレスがLinux
にGNU ld
に選択されます。x86_64 ABIのアドレス0x400000がテキストセグメントの先頭に選択されているのはなぜですか?
$ ld -verbose | grep -i text-segment
PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x400000)); . = SEGMENT_START("text-segment", 0x400000) + SIZEOF_HEADERS;
このアドレスは32ビットx86実行可能で大きなあるので、それは驚きだ:
$ ld -verbose | grep -i text-segment
PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x08048000)); . = SEGMENT_START("text-segment", 0x08048000) + SIZEOF_HEADERS;
私は0x080xxxxxアドレスが選ばれた理由を説明しthis questionを読みますi386の場合は ですが、x86_64の変更については説明していません。それについては、 の説明は見つけるのが難しいです。誰かが手掛かりを持っていますか?
https://www.uclibc.org/docs/psABI-x86_64.pdfは最新版(0.99.7)、[OSDev Wikiによる](http://wiki.osdev.org/System_V_ABI#ドキュメント)。 –
0x400000は4MiBなので、これは膨大なページのサポートと関係があります。セクション3.3.3では64KiBまでのページサイズしか許されません。 –
@ivan_pozdeev:https://github.com/hjl-tools/x86-psABI/wiki/X86-psABIには、LaTeXソースのgit HEADリビジョンから構築されたPDFへのリンクがあります。 x86-64のページテーブルは2MBのhugeページ(さらには1GiB)を使用することができ、Linuxは透過的に/機会主義的に匿名メモリを使用しますが、ファイルバックアップのマッピングは行いません。私は、4MBは0から離れているので、インデックス付きNULLポインタderefは通常、有効なページにインデックスを作成しないと思います。あなたは答えて同じことを言っているのが分かります。 –