堆栈、BSS段、代码段、数据段/RO、RW、ZI
嵌入式_堆棧、BSS段、代碼段、數據段/RO、RW、ZI
提示:這里只針對ARM嵌入式系統所說,PC端和其他系統不議
文章目錄
- 嵌入式_堆棧、BSS段、代碼段、數據段/RO、RW、ZI
- 前言
- 一、代碼態
- 二、存儲態
- 三、運行態
- 四、運行過程
- 總結
前言
剛好做單片機的相關項目,學習到基礎內容,主要寫個博客幫助自己總結和梳理知識,根據自己的理解和邏輯重新梳理順序的,歡迎指正。
一、代碼態
代碼態就是使用keil-MDK編譯出來的準備燒錄的二進制文件,現在只是文件,既沒有燒錄更沒有運行。
例如使用keil編譯的工程,打開.map文件最底下顯示如圖:
Code(代碼部分):一般是程序執行代碼部分,編譯器生成的機器指令(指令又包含操作碼和操作數,此處不細說)。
RO_data(read only): 程序中用到的除了內聯數據的只讀數據,全局變量,典型為const修飾的全局變量,(注:要區別于下述的:RO)
RW_data(ReadWrite):可讀寫數據部分,初始化不為0的全局變量和static修飾的靜態變量(包含全局變量和局部變量),這些數據運行時候長駐RAM區執行讀寫操作。
ZI_data(zero):未初始化或初始化為0的全局變量和靜態變量(包含全局變量和局部變量),與RW_data的區別是初始化賦的值,運行是和RW_data一樣。
實驗:可以使用keil手動編寫一個C語言程序,初始化和不初始化或初始化為0的全局變量,靜態變量和只讀變量然后查看map文件信息。該實驗參見我的另一篇博客:https://blog.csdn.net/Yin_w/article/details/129541728
二、存儲態
存儲狀態就是燒錄到機器而沒有運行的二進制文件,可以是Flash或ROM。
RO:Total RO Size (Code + RO Data),只讀數據,存儲在ROM或Flash中,運行時被加載到RAM區
RW:Total RW Size (RW Data + ZI Data),讀寫數據
ROM:Total ROM Size (Code + RO Data + RW Data),燒錄/下載程序到Falsh或者ROM時,所占的最小空間
剩下的ZI_data不被包含到ROM中,是因為初始化值是零,只需要在RAM中執行時將ZI_data所在區域擦除即可
三、運行態
程序運行時候涉及的概念比較多,如圖是在RAM中運行時的數據與存儲位置的狀態(根據框架不同,有些數據也在ROM中運行,此處不細說),運行時將ROM中的代碼數據和只讀數據分別加載到RAM的text代碼段和data段中。
保留區:一般是出廠信息或者編碼信息
text代碼段:指令將RO中的程序代碼加載到此處,
靜態存儲區:靜態存儲區分為.bss段和.data段;RO中的RO_data只讀數據和RW中的RW_data數據會被加載到此處的.data段,而游離的ZI_data數據此時被加載到.bss區。
Heap堆區:用于存放進程運行中被動態分配的內存段,其大小不固定,可動態擴張或縮減。當進程調用malloc堆區域被擴張,調用free堆區被縮減。
Stack棧區:用戶存放程序臨時創建的局部變量。函數被調用時,其參數也會被壓入發起調用的進程棧中,并且待到調用結束后,函數的返回值也會被存放回棧中。由于棧的后進先出特點,所以棧特別方便用來保存/恢復調用現場
內核區:內核運行的區域,此處不細說
注意:我們一般說的堆棧是指的棧區:堆是堆,棧是棧,堆棧是棧
二者的區別總結為:
A.分配方式不同:棧由操作系統自動分配釋放;堆的申請和釋放工作由程序員手動控制;
B.生長方向不同:堆內存地址由低到高(向上);棧的內存地址由高到低(向下);
C.存放內容不同:棧動態存放函數返回地址、參數、局部變量和寄存器值等。堆頂一字節存放堆的大小,堆中具體內容由程序員填充。
D.存在狀態不同:程序運行時候,棧區隨程序運行狀態而動態變化,堆區則是靜態的,申請則有,改寫則變,釋放則無
四、運行過程
由運行態和存儲態可以知道,燒錄到ROM中的二進制文件和運行的程序并不一致,這就需要知道程序運行過程是怎樣的。
1.首先從存儲態將RW從ROM中搬到RAM中,因為RW是變量,變量不能存在ROM中。
2.將ZI所在的RAM區域全部清零,因為ZI區域并不在Image中,所以需要程序根據編譯器給出的ZI地址及大小來將相應得RAM區域清零。ZI中也是變量,同理:變量不能存在ROM中
在程序運行的最初階段,RO中的指令完成了這兩項工作后C程序才能正常訪問變量。否則只能運行不含變量的代碼。
根據以上概念、各個階段程序數據和存儲位置的映射關系,合成理解圖如圖所示:
淺黃色部分的code和RO_data文字顏色為灰色,表示可能發生在ROM,也可能發生在RAM,根據架構不同而不同
總結
如有錯誤,歡迎指正,原創不易,轉載留名!
總結
以上是生活随笔為你收集整理的堆栈、BSS段、代码段、数据段/RO、RW、ZI的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国税务申报软件市场深度研究分析报告
- 下一篇: 从单片机初学者迈向单片机工程师前传---