[英]How are global variables stored?
AFAIK,有兩種類型的全局變量,已初始化和未初始化。 它們是如何存儲的? 它們都存儲在可執行文件中嗎? 我可以想到初始化的全局變量,它們的初始值存儲在可執行文件中。 但是需要為未初始化的存儲什么?
我目前的理解是這樣的:
可執行文件被組織為幾個部分,例如 .text、.data 和 .bss。 代碼存儲在 .text 節中,初始化的全局或靜態數據存儲在 .data 節中,未初始化的全局或靜態數據存儲在 .bss 節中。
感謝您抽出時間查看我的問題。
我在這里找到了一個很好的參考:
匯編語言源代碼中的段 - 使用 .text、.data 和 .bss 指令構建文本和數據段
@邁克爾
我在我的匯編代碼中定義了一個 100 字節的未初始化數據區域,這 100 字節沒有存儲在我的可執行文件中,因為它沒有被初始化。
誰來分配 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,未初始化的全局變量位於此處。
另一種常見的方法是使.data
的Vsize
大於其RAWsize
,以便該段的其余部分將保存未初始化的變量。
加載程序時,操作系統鏈接器/加載器會在計算機的虛擬內存中分配全局變量的存儲空間。 實際的全局變量存儲位於物理內存層次結構(緩存、RAM 內存、SSD/HD 后備存儲等)中的某個位置,由緩存和 VM 系統映射。 這一切都可能最終變得支離破碎。
初始化的全局變量的值從 .data 段復制到分配的虛擬內存的一部分。 未初始化的全局變量可能會被清零,或者可能會在其中留下垃圾,這取決於運行程序的特定操作系統的安全性。
還有其他變體,具體取決於語言、編譯器、語言運行時和操作系統。
未初始化的變量只是機器級別的指針。 它們的空間是在運行時分配的,程序將在稍后的某個時間填充它。
例如,如果在匯編程序中創建一個全局變量global BYTE 100
,它將保留global
作為指向 100 字節區域的指針。 然后,該程序可以訪問該區域以獲取所需的任何內容。
編輯:我在我的匯編手冊中查找,看起來未初始化的全局變量是在 .data 部分中定義的,就像初始化的變量一樣。 據我了解,空間是在 exe 中分配的(比如上面的 100 個字節),但會有未定義的內容。 在 Windows 中的 Intel 機器上,這將是垃圾; 程序負責初始化它。 希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.