In this document on page。 27它說文本段開始於 0x400000。爲什麼選擇這個特定的地址?有沒有 的原因?相同的地址選擇在GNU ld
上Linux
:爲什麼選擇地址0x400000作爲x86_64 ABI文本段的開始?
$ 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;
我讀this question其中討論了爲什麼選擇0x080xxxxx地址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鏈接到由git HEAD修訂的LaTeX源代碼構建的PDF。 x86-64頁表可以使用2MB的巨大頁面(甚至1GiB),而Linux對匿名內存是透明/機會的,但不支持文件映射。我猜想4MB距離0足夠遠,索引的NULL指針deref通常不會索引到有效頁面。呃,我看到你在你的回答中說了同樣的話。 –