Linux
程序的記憶體佈局中的“核心堆棧”、“C 執行時啟動函式的幀”和“main() 的幀”在哪裡?
從 Linux 程式介面:
- 上圖中的核心堆棧(在下面的引用中提到)在哪裡?
是不是上圖中的“核心(映射到程序虛擬記憶體,但沒有訪問程序)”的頂部?
術語 使用者堆棧 用於區分我們這裡描述的堆棧和核心堆棧。核心堆棧是在核心記憶體中維護的每個程序的記憶體區域,用作在執行系統呼叫期間執行內部呼叫的函式的堆棧。(核心不能為此目的使用使用者堆棧,因為它駐留在未受保護的使用者記憶體中。)
- 上圖中的“C 執行時啟動函式的框架”和“main() 的框架”(從下圖中提到)在哪裡?
上圖中的“argv,environ”是“C 執行時啟動函式的框架”、“main() 的框架”,還是兩者的一部分?
3. 0x00000000 和 0x08048000 之間的最低段用於什麼?
謝謝。
- 沒有核心堆棧。對於每個執行緒,當程序進行系統呼叫時,都有一個記憶體區域用作堆棧空間。還有單獨的“中斷堆棧”,每個 CPU 一個,由中斷處理程序使用。這些記憶體區域駐留在核心地址空間中(
0xc0000000
在您的圖中上方)。- 堆棧幀(C 執行時幀、main 幀等)是堆棧的一部分。程序參數 (
argv
) 和環境是獨立的區域,不是堆棧的一部分。0x0
和之間的區域0x08048000
(大約 128 MB)不用於任何用途。最初,i386 System V ABI 為堆棧保留了這個區域,但 Linux 的做法有所不同。不使用該區域不會浪費 RAM,只會浪費地址空間,因為該區域未映射。請注意,該資訊現在幾乎完全過時了,因為它描述了在 32 位 x86 架構上是如何完成的。今天很難找到僅 32 位的 x86 機器,並且發行版正在逐步取消對它們的支持。