Linux

使使用者空間文本段從 0x8048000 開始的基本原理

  • June 25, 2012

我在某處讀到(至少從 Linux v. 2.6 開始)所有使用者空間程式碼都放置在虛擬記憶體地址空間中的載入地址 0x8048000 處。

我自己的觀察證實了這一點。我做了一個

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

對於多個程序和程序的第一部分,程序text總是從 ‘0x8048000’ 開始。

此外,C 庫啟動程式碼和所有其他執行時好東西似乎都映射在此預設值之後。

這構成了將近 128 M 的地址空間,考慮到 0xC0000000 - 0x8048000 仍然是使用者空間內容的近 3G 地址空間,這並不多。

所以我的問題是為什麼?

我們正在處理虛擬地址,與其他程序的干擾或重疊被排除在 VM 工作方式的定義之外。

在 0x00000000 到 0x8048000 範圍內是否有一些固定/預設映射?

除了預設起始地址位於頁面邊界這一事實之外,選擇這個數字而不是任何其他值的理由是什麼?

我承認以下不是一個很好的答案,但我相信 0x8048000 值已包含在ELF Specification中。參見該文件中的圖 A.4、A.5 和 A.6。System V ABI Intel 386 Architecture Supplement也對 0x8048000 進行了標準化。請參見第 3-22 頁,圖 3-25。0x804800 被規定為低文本段地址/高堆棧地址。這本身就很奇怪,因為堆棧通常設置在程序記憶體空間的高地址中,Linux 也不例外。

您可以讓 GNU 連結器ld設置 ELF 執行檔,以便核心將其映射到稍低或稍高的地址。執行此操作的方法因 GCC 和 ld 的版本而異,因此請仔細閱讀手冊頁。這往往表明 0x8048000 不是來自某些硬體要求,而是來自其他考慮。

引用自:https://unix.stackexchange.com/questions/41548