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

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

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

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

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

對於多個進程和進程的第一部分,程式text始終從「0x8048000」開始。

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

這幾乎構成了 128 M 的位址空間,考慮到 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 連結器ld設定 ELF 可執行文件,以便核心將其對應到稍低或稍高的位址。執行此操作的方法因 GCC 和 ld 的版本而異,因此請仔細閱讀手冊頁。這往往表明 0x8048000 並非源自某些硬體要求,而是源自於其他考慮因素。

相關內容