日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

堆栈、BSS段、代码段、数据段/RO、RW、ZI

發布時間:2024/3/24 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 堆栈、BSS段、代码段、数据段/RO、RW、ZI 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

嵌入式_堆棧、BSS段、代碼段、數據段/RO、RW、ZI

提示:這里只針對ARM嵌入式系統所說,PC端和其他系統不議


文章目錄

  • 嵌入式_堆棧、BSS段、代碼段、數據段/RO、RW、ZI
  • 前言
  • 一、代碼態
  • 二、存儲態
  • 三、運行態
  • 四、運行過程
  • 總結


前言

剛好做單片機的相關項目,學習到基礎內容,主要寫個博客幫助自己總結和梳理知識,根據自己的理解和邏輯重新梳理順序的,歡迎指正。


一、代碼態

代碼態就是使用keil-MDK編譯出來的準備燒錄的二進制文件,現在只是文件,既沒有燒錄更沒有運行。
例如使用keil編譯的工程,打開.map文件最底下顯示如圖:

==============================================================================Total RO Size (Code + RO Data) 10824 ( 10.57kB)Total RW Size (RW Data + ZI Data) 2960 ( 2.89kB)Total ROM Size (Code + RO Data + RW Data) 11100 ( 10.84kB)==============================================================================

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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲少妇xxx | 无码视频一区二区三区 | 精品国产123| 毛片在线观看网站 | 人人干人人艹 | 野花av | 欧美顶级metart裸体全部自慰 | 国产剧情精品在线 | 中国免费看的片 | 亚洲激情在线观看视频 | 粉嫩av | 在线播放精品 | 17c精品麻豆一区二区免费 | 亚洲系列 | 伊人久久青青 | 国产精品videossex久久发布 | 欧洲精品一区二区三区久久 | 欧美freesex黑人又粗又大 | 亚洲一区二区三区免费视频 | 国产精品视频全国免费观看 | 成人免费高清视频 | 看av网址| 亚洲一二三区在线观看 | 大毛片| 久久国产精品精品国产 | www国产免费 | 物业福利视频 | aaa黄色大片| 激情小说av| www.99av| 日本午夜影视 | 爱爱视频在线播放 | 精品久久人人妻人人做人人 | 伊人射 | 妖精视频一区二区三区 | av丝袜在线观看 | 不卡免费视频 | 久久久国产网站 | 亚洲男女av | 91精品国产入口在线 | 久久精品视频中文字幕 | 日韩精品――色哟哟 | 一本久道综合色婷婷五月 | 久久精品aⅴ无码中文字字幕重口 | 亚洲制服丝袜诱惑 | 成人在线免费电影 | 国产精品二区一区 | 无套中出丰满人妻无码 | 成人精品一区二区三区电影黑人 | 国产无遮挡又黄又爽又色 | 日本一级吃奶淫片免费 | 欧美三个黑人玩3p | 国产美女一级片 | 国产精品成人国产乱一区 | 国产精品白嫩极品美女视频 | 国产无遮挡aaa片爽爽 | 视频一区 国产 | av在线小说 | 中文字字幕码一二三区 | 一色av| 欧美成人免费播放 | 国产做受高潮 | 热久久最新网址 | 欧美在线一二三 | 国产精品久久久久久免费播放 | jizzjizz日本人| 天天插天天干 | 神秘马戏团在线观看免费高清中文 | 九色在线| 色偷偷人人澡人人爽人人模 | 色婷婷国产精品 | 男女视频免费网站 | 日本xxxxxxxxx| 看全色黄大色黄大片大学生 | 福利久久久 | 96亚洲精品久久久蜜桃 | 黄色精品网站 | 欧美 日韩 国产 一区 | 手机福利视频 | 国产成人在线一区二区 | 福利资源在线 | 九九九九精品 | 99re这里| 91视频88av| 国产精品久久久久久妇女 | 青春草在线视频观看 | 男女在线视频 | 日本午夜激情视频 | 日韩一区二区精品视频 | 娇妻被老王脔到高潮失禁视频 | 亚洲图片一区 | 天天射狠狠干 | 国产v亚洲v天堂无码 | 国产精品一区三区 | 国产粉嫩一区二区三区 | 99精品在线 | 欧美精品不卡 | 午夜激情啪啪 | 国产欧美日 |