簡體   English   中英

代碼、靜態、堆棧和堆段實現

[英]Code, static, stack and heap segments implementation

我知道每個段的目的,但我想知道真正用 c 或 c++ 等語言實現它們?

它們是由 c/c++ 編譯器程序員在編寫語言實現時編寫的嗎? 或者這些段是在操作系統/硬件級別實現的(也許當操作系統為程序選擇地址空間時)?

我把堆棧幀想象成一個簡單的 c 結構,它在每次函數調用時都被推入堆棧。 我把堆想象成一個動態數組等等......

這有點粗略 - 硬件架構、內存模型等都會影響 C/C++ 實現可能具有“段”特征的方式。 較舊的 CPU 有局限性,導致一組更復雜的“段”(iAPX 286 - 還記得嗎?)

目標代碼包含由可執行語句產生的代碼:由匯編機器指令產生的字節。 這將進入一個代碼段,這將(通常)導致一個被寫保護的內存段。

目標代碼包含數據:由匯編數據定義語句產生的字節,帶有一些初始化(或默認值,在 C/C++ 的情況下為零),這將進入數據段,沒有訪問限制。

CPU 的工作方式需要一個堆棧:將返回地址推送到堆棧上,通過推送函數參數也是最有效的參數傳遞約定。 “堆棧幀”部分是“按照慣例”,但通常它由返回地址和參數組成; 為局部變量保留了額外的空間:每個實例化一組(如果函數是遞歸的,這很重要)。

堆只是一個內存區域,從中提供分配(malloc,new)。 它通常分配在代碼和數據段之外。 堆棧可能會從堆中取出 - 這取決於您是否只有一個堆棧段或多個(想想線程)。

此外,請注意有幾種目標代碼“格式”或“語言”,即這些段在目標代碼中的定義方式。 這取決於系統的加載程序可以處理的內容:一種此類格式稱為“a.out”,另一種稱為“ELF”。 編譯器必須遵守格式和可能性。

它們是由 c/c++ 編譯器程序員在編寫語言實現時編寫的嗎? 或者這些段是在操作系統/硬件級別實現的(也許當操作系統為程序選擇地址空間時)?

段入口點主要在工具鏈的鏈接階段(和鏈接程序)進行管理。

從這個意義上說,是的,這些是由編譯器開發人員實現的。

不過,您可以提供自己的鏈接器腳本,您可以在其中指定這些段應出現在哪些具體內存地址,以及這些內存地址是指 ROM 還是 RAM。

我把堆棧幀想象成一個簡單的 c 結構,它在每次函數調用時都被推入堆棧。 我把堆想象成一個動態數組等等......

恐怕這根本沒有那么簡單

  • 堆棧幀通常還需要跟蹤本地實例化的變量、異常堆棧展開所需的信息等。
  • 堆分配的內存需要一些基本機制來跟蹤分配的內存塊及其實際大小。
  • 靜態內存初始化和類初始化需要運行靜態實例化類的構造函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM