stm32記憶體管理分配
bss段:
bss段(bss segment)通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域。
bss是英文Block Started by Symbol的簡稱。
bss段屬於靜態記憶體分配。
data段:
資料段(data segment)通常是指用來存放程式中已初始化的全域性變數的一塊記憶體區域。
資料段屬於靜態記憶體分配。
text段:
程式碼段(code segment/text segment)通常是指用來存放程式執行程式碼的一塊記憶體區域。
這部分割槽域的大小在程式執行前就已經確定,並且記憶體區域通常屬於只讀(某些架構也允許程式碼段為可寫,即允許修改程式)。
在程式碼段中,也有可能包含一些只讀的常數變數,例如字串常量等。
堆(heap):
堆是用於存放程序執行中被動態分配的記憶體段,它的大小並不固定,可動態擴張或縮減。
當程序呼叫malloc等函式分配記憶體時,新分配的記憶體就被動態新增到堆上(堆被擴張);
當利用free等函式釋放記憶體時,被釋放的記憶體從堆中被剔除(堆被縮減)。
棧(stack):
棧又稱堆疊,是使用者存放程式臨時建立的區域性變數,
也就是說我們函式括弧“{}”中定義的變數(但不包括static宣告的變數,static意味著在資料段中存放變數)。
除此以外,在函式被呼叫時,其引數也會被壓入發起呼叫的程序棧中,並且待到呼叫結束後,函式的返回值也會被存放回棧中。
由於棧的先進先出(FIFO)特點,所以棧特別方便用來儲存/恢復呼叫現場。
從這個意義上講,我們可以把堆疊看成一個寄存、交換臨時資料的記憶體區。
一個程式本質上都是由 bss段、data段、text段三個組成的。
這樣的概念,不知道最初來源於哪裡的規定,但在當前的計算機程式設計中是很重要的一個基本概念。
而且在嵌入式系統的設計中也非常重要,牽涉到嵌入式系統執行時的記憶體大小分配,儲存單元佔用空間大小的問題。
在採用段式記憶體管理的架構中(比如intel的80x86系統),bss段通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域,
一般在初始化時bss 段部分將會清零。bss段屬於靜態記憶體分配,即程式一開始就將其清零了。
比如,在C語言之類的程式編譯完成之後,已初始化的全域性變數儲存在.data 段中,未初始化的全域性變數儲存在.bss 段中。
text和data段都在可執行檔案中(在嵌入式系統裡一般是固化在映象檔案中),由系統從可執行檔案中載入;
而bss段不在可執行檔案中,由系統初始化。