Linux

程序的記憶體佈局中的“核心堆棧”、“C 執行時啟動函式的幀”和“main() 的幀”在哪裡?

  • March 15, 2022

從 Linux 程式介面:

在此處輸入圖像描述

  1. 上圖中的核心堆棧(在下面的引用中提到)在哪裡?

是不是上圖中的“核心(映射到程序虛擬記憶體,但沒有訪問程序)”的頂部?

術語 使用者堆棧 用於區分我們這裡描述的堆棧和核心堆棧。核心堆棧是在核心記憶體中維護的每個程序的記憶體區域,用作在執行系統呼叫期間執行內部呼叫的函式的堆棧。(核心不能為此目的使用使用者堆棧,因為它駐留在未受保護的使用者記憶體中。)

  1. 上圖中的“C 執行時啟動函式的框架”和“main() 的框架”(從下圖中提到)在哪裡?

上圖中的“argv,environ”是“C 執行時啟動函式的框架”、“main() 的框架”,還是兩者的一部分?

在此處輸入圖像描述 3. 0x00000000 和 0x08048000 之間的最低段用於什麼?

謝謝。

  1. 沒有核心堆棧。對於每個執行緒,當程序進行系統呼叫時,都有一個記憶體區域用作堆棧空間。還有單獨的“中斷堆棧”,每個 CPU 一個,由中斷處理程序使用。這些記憶體區域駐留在核心地址空間中(0xc0000000在您的圖中上方)。
  2. 堆棧幀(C 執行時幀、main 幀等)是堆棧的一部分。程序參數 ( argv) 和環境是獨立的區域,不是堆棧的一部分。
  3. 0x0和之間的區域0x08048000(大約 128 MB)不用於任何用途。最初,i386 System V ABI 為堆棧保留了這個區域,但 Linux 的做法有所不同。不使用該區域不會浪費 RAM,只會浪費地址空間,因為該區域未映射。請注意,該資訊現在幾乎完全過時了,因為它描述了在 32 位 x86 架構上是如何完成的。今天很難找到僅 32 位的 x86 機器,並且發行版正在逐步取消對它們的支持。

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