簡體   English   中英

全局變量如何存儲?

[英]How are global variables stored?

AFAIK,有兩種類型的全局變量,已初始化初始化。 它們是如何存儲的? 它們都存儲在可執行文件中嗎? 我可以想到初始化的全局變量,它們的初始值存儲在可執行文件中。 但是需要為未初始化的存儲什么?

我目前的理解是這樣的:

可執行文件被組織為幾個部分,例如 .text、.data 和 .bss。 代碼存儲在 .text 節中,初始化的全局或靜態數據存儲在 .data 節中,未初始化的全局或靜態數據存儲在 .bss 節中。

感謝您抽出時間查看我的問題。

更新 1 - 2010 年 11 月 3 日上午 9:56

我在這里找到了一個很好的參考:

匯編語言源代碼中的段 - 使用 .text、.data 和 .bss 指令構建文本和數據段

更新 2 - 2010 年 11 月 3 日上午 10:09

@邁克爾

  1. 我在我的匯編代碼中定義了一個 100 字節的未初始化數據區域,這 100 字節沒有存儲在我的可執行文件中,因為它沒有被初始化。

  2. 誰來分配 RAM 中 100 字節的未初始化內存空間? 程序加載器

假設我得到以下代碼:

int global[100];

void main(void)
{
   //...
}

全局[100] 未初始化。 global[100] 將如何在我的可執行文件中重新編碼? 誰將在什么時間分配它? 如果初始化了怎么辦?

初始化的變量值存儲在可執行文件的.data段中。 未初始化的不必存儲 它們最終在 RAM 中的.bss段中,但在可執行文件中段的大小為零,只是所需的內存量存儲在段描述符中。 .text部分中的代碼通過段的偏移量訪問這些。 運行時鏈接器加載器修補這些對實際虛擬地址的引用。 例如,請參見大多數類 Unix 操作系統上使用的Executable and Linkable Format

在 PE 文件中,為每個段指定了兩種大小:RAWsize(磁盤大小)和 Vsize(RAM 大小)。

Vsize大於RAWsize時,RAM 中的其余段將歸零。

.bss (如果存在)的 RAWsize 始終為 0,未初始化的全局變量位於此處。

另一種常見的方法是使.dataVsize大於其RAWsize ,以便該段的其余部分將保存未初始化的變量。

加載程序時,操作系統鏈接器/加載器會在計算機的虛擬內存中分配全局變量的存儲空間。 實際的全局變量存儲位於物理內存層次結構(緩存、RAM 內存、SSD/HD 后備存儲等)中的某個位置,由緩存和 VM 系統映射。 這一切都可能最終變得支離破碎。

初始化的全局變量的值從 .data 段復制到分配的虛擬內存的一部分。 未初始化的全局變量可能會被清零,或者可能會在其中留下垃圾,這取決於運行程序的特定操作系統的安全性。

還有其他變體,具體取決於語言、編譯器、語言運行時和操作系統。

未初始化的變量只是機器級別的指針。 它們的空間是在運行時分配的,程序將在稍后的某個時間填充它。

例如,如果在匯編程序中創建一個全局變量global BYTE 100 ,它將保留global作為指向 100 字節區域的指針。 然后,該程序可以訪問該區域以獲取所需的任何內容。

編輯:我在我的匯編手冊中查找,看起來未初始化的全局變量是在 .data 部分中定義的,就像初始化的變量一樣。 據我了解,空間是在 exe 中分配的(比如上面的 100 個字節),但會有未定義的內容。 在 Windows 中的 Intel 機器上,這將是垃圾; 程序負責初始化它。 希望這可以幫助!

暫無
暫無

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

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