BSS段:BSS段(bss segment)一般是指用來存放程序中未初始化的全局變量的一塊內存區域。BSS是英文Block Started by Symbol的簡稱。BSS段屬於靜態內存分配。
數據段:數據段(data segment)一般是指用來存放程序中已初始化的全局變量的一塊內存區域。數據段屬於靜態內存分配。
代碼段:代碼段(code segment/text segment)一般是指用來存放程序執行代碼的一塊內存區域。這部分區域的大小在程序運行前就已經肯定,而且內存區域一般屬於只讀, 某些架構也容許代碼段爲可寫,即容許修改程序。在代碼段中,也有可能包含一些只讀的常數變量,例如字符串常量等。
堆(heap):堆是用於存放進程運行中被動態分配的內存段,它的大小並不固定,可動態擴張或縮減。當進程調用malloc等函數分配內存時,新分配的內存就被動態添加到堆上(堆被擴張);當利用free等函數釋放內存時,被釋放的內存從堆中被剔除(堆被縮減)
棧(stack):棧又稱堆棧,是用戶存放程序臨時建立的局部變量,也就是說咱們函數括弧「{}」中定義的變量(但不包括static聲明的變量,static意味着在數據段中存放變量)。除此之外,在函數被調用時,其參數也會被壓入發起調用的進程棧中,而且待到調用結束後,函數的返回值也會被存放回棧中。因爲棧的先進先出特色,因此棧特別方便用來保存/恢復調用現場。從這個意義上講,咱們能夠把堆棧當作一個寄存、交換臨時數據的內存區。 架構
一個程序本質上都是由 bss段、data段、text段三個組成的。函數
這樣的概念,不知道最初來源於哪裏的規定,但在當前的計算機程序設計中是很重要的一個基本概念。並且在嵌入式系統的設計中也很是重要,牽涉到嵌入式系統運行時的內存大小分配,存儲單元佔用空間大小的問題。spa
在採用段式內存管理的架構中(好比intel的80x86系統),bss段(Block Started by Symbol segment)一般是指用來存放程序中未初始化的全局變量的一塊內存區域,通常在初始化時bss 段部分將會清零。bss段屬於靜態內存分配,即程序一開始就將其清零了。設計
好比,在C語言之類的程序編譯完成以後,已初始化的全局變量保存在.data 段中,未初始化的全局變量保存在.bss 段中。
在《Programming ground up》裏對.bss的解釋爲:There is another section called the .bss. This section is like the data section, except that it doesn’t take up space in the executable.
text和data段都在可執行文件中(在嵌入式系統裏通常是固化在鏡像文件中),由系統從可執行文件中加載;而bss段不在可執行文件中,由系統初始化。code
一直以來對於ARM體系中所描述的RO,RW和ZI數據存在似是而非的理解,這段時間對其仔細瞭解了一番,發現了一些規律,理解了一些之前書本上有的可是不理解的東西,我想應該有很多人也有和我一樣的困惑,所以將個人一些關於RO,RW和ZI的理解寫出來,但願能對你們有所幫助。
要了解RO,RW和ZI須要首先了解如下知識。進程
此處所說的「ARM程序」是指在ARM系統中正在執行的程序,而非保存在ROM中的bin映像(image)文件,這一點清注意區別。
一個ARM程序包含3部分:RO,RW和ZI
RO是程序中的指令和常量
RW是程序中的已初始化變量
ZI是程序中的未初始化的變量內存
由以上3點說明能夠理解爲:
RO就是readonly,
RW就是read/write,
ZI就是zero字符串
所謂ARM映像文件就是指燒錄到ROM中的bin文件,也成爲image文件。如下用Image文件來稱呼它。
Image文件包含了RO和RW數據。
之因此Image文件不包含ZI數據,是由於ZI數據都是0,不必包含,只要程序運行以前將ZI數據所在的區域一概清零便可。包含進去反而浪費存儲空間。
Q:爲何Image中必須包含RO和RW?
A:由於RO中的指令和常量以及RW中初始化過的變量是不能像ZI那樣「無中生有」的。編譯器
從以上兩點能夠知道,燒錄到ROM中的image文件與實際運行時的ARM程序之間並非徹底同樣的。所以就有必要了解ARM程序是如何從ROM中的image到達實際運行狀態的。
實際上,RO中的指令至少應該有這樣的功能:
1. 將RW從ROM中搬到RAM中,由於RW是變量,變量不能存在ROM中。
2. 將ZI所在的RAM區域所有清零,由於ZI區域並不在Image中,因此須要程序根據編譯器給出的ZI地址及大小來將相應得RAM區域清零。ZI中也是變量,同理:變量不能存在ROM中
在程序運行的最初階段,RO中的指令完成了這兩項工做後C程序才能正常訪問變量。不然只能運行不含變量的代碼。it