標籤:標準 應該 記憶體地區 tar 意義 new stat 堆棧 div
一個程式本質上都是由 BSS 段、data段、text段三個組成的。這種概念在當前的電腦程式設計中是非常重要的一個基本概念,並且在嵌入式系統的設計中也非常重要,牽涉到嵌入式系統執行時的記憶體大小分配,儲存單元佔用空間大小的問題。
程式編譯後產生的目標檔案至少含有這三個段。這三個段的大致結構圖例如以下所看到的:
當中.text即為程式碼片段,為僅僅讀。.bss段包括程式中未初始化的全域變數和static變數。
data段包括三個部分:heap(堆)、stack(棧)和待用資料區。
當程式在運行時動態分配空間(C中的malloc函數),所分配的空間就屬於heap。其概念與資料結構中“堆”的概念不同。
stack段存放函數內部的變數、參數和返回地址,其在函數被調用時自己主動分配。訪問方式就是標準棧中的LIFO方式。
(由於函數的局部變數存放在此,因此其訪問方式應該是棧指標加位移的方式,否則若通過push、pop操作來訪問相當麻煩)
data段中的待用資料區存放的是程式中已初始化的全域變數、靜態變數和常量。
在採用段式記憶體管理的架構中(比方intel的80x86系統),BSS 段(Block Started by Symbol segment)一般是指用來存放程式中未初始化的全域變數的一塊記憶體地區,一般在初始化時 BSS 段部分將會清零。BSS 段屬於靜態記憶體配置。即程式一開始就將其清零了。
比方,在C語言之類的程式編譯完畢之後,已初始化的全域變數儲存在.data 段中,未初始化的全域變數儲存在.bss 段中。
text和data段都在可運行檔案裡(在嵌入式系統裡通常是固化在鏡像檔案裡)。由系統從可運行檔案裡載入;而BSS段不在可運行檔案裡,由系統初始化。
圖引自《C專家編程》
BSS段僅僅儲存沒有值的變數。所以其實它並不須要儲存這些變數的映像。執行時所須要的BSS段大小記錄在目標檔案裡,但BSS段並不佔領目標檔案的不論什麼空間。
//main.cint a = 0; //全域初始化區char *p1; //全域未初始化區main(){ static int c =0。 //全域(靜態)初始化區 int b; //棧 char s[] = "abc"; //棧 char *p2; //棧 char *p3 = "123456"; //"123456\0"在常量區,p3在棧上。 p1 = (char *)malloc(10); p2 = (char *)malloc(20); //分配得來得10和20位元組的地區就在堆區。}
C語言的代碼記憶體布局具體解釋