精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

從單片機步入Linux之運行地址與加載地址

系統 Linux
在玩單片機(以stm32為例)的時候會有RAM空間和ROM空間,RAM空間主要是用于數據的訪問,而ROM空間用于存放燒錄的固件,當然固件也可以直接加載到RAM中運行,只是說每次上電都需要重新加載。

[[409220]]

大家好,我是情報小哥!

本文為【單片機步入嵌入式Linux】系列文章的第二篇,主要是跟大家講解一下鏈接過程中幾個地址的區分與理解~

01單片機存儲分配

在玩單片機(以stm32為例)的時候會有RAM空間和ROM空間,RAM空間主要是用于數據的訪問,而ROM空間用于存放燒錄的固件,當然固件也可以直接加載到RAM中運行,只是說每次上電都需要重新加載。

如上圖所示ROM為FLASH地址,而RAM為SRAM地址,毋庸置疑生成的單片機固件會燒錄到Flash上,這樣才能保證每次上電都有可以正常運行。

對于很多初學者該有疑問了,明明全局變量等等都是分配到RAM上的呀,怎么說固件放到Flash上的呢?

其實并不矛盾,程序指令中訪問變量都是訪問變量的地址也就是內存的地址,所謂的分配到RAM上,僅僅只是說相應的變量占據了對應的RAM地址,并不能理解為這個變量存在于RAM里面。

可能你還會繼續問 : 暫且認同上面的說法,那對這些變量的初值該如何解釋呢?

可以肯定的是,這些全局變量的初值并不是來源于RAM,因為RAM掉完電以后數據就丟失了,而在程序正常運行過程中,不管怎么上下電其初值都是我們程序中規定的,也就是在編譯中確定的。

所以這些初值要保存只可能存在ROM中,這中間肯定有這樣一種機制 : 在上電以后把ROM中存儲的這些變量初值來重新初始化到對應的RAM地址,以便后續程序指令訪問,這種機制通常叫分散加載。

02簡述分散加載

上圖是一種簡單的分散加載機制,映像文件由不同的段組成,通常都有代碼段(.text)、已初始化數據段(.data)、未初始化及初始化為0的數據段(.bss)等等,而且他們具有不同的屬性RO,RW,ZI等等。

為了便于大家理解,整個系統的存儲區分為ROM和SRAM,左邊Load View表示的是程序存儲地址空間分布情況,也就是程序燒錄到ROM以后的空間分配情況。

固件燒錄到ROM區域并且分為RW區和RO區,RW區域為可讀可寫區域而RO區域為只讀區,分這兩個區域并不是說RW區域存儲地址區域以后就用來數據的讀寫,而是為了上電過程中的copy/decompress(復制或者解壓)過程做好標記,這個過程會把一些非零全局變量(或者靜態變量等)的SRAM地址(實際的運行地址)處賦予初始值。

ZI區域是零填充區域,主要是.bss段的一些初始化為0或者未初始化的全局或者靜態變量分布區域,這些數據沒有必要保存到固件中,所以由加載機制自行清零即可。

一切準備就緒就形成了右側的execution View的運行空間視野,由于ROM中程序運行所涉及到的全局變量等的訪問都是SRAM地址的訪問,而這些地址恰好在程序編譯鏈接過程中已經分配到SRAM里面,經過前面的該部分地址的重新定位,運行空間的程序就可以正確訪問到這些變量的初值等等。

03stm32啟動流程

很多剛玩MCU的朋友,都會以main函數作為程序的開始運行處,不過幾乎所有的C程序在執行前都會使用匯編指令,通過匯編指令構建C語言運行環境,并運行C程序,所以在C程序執行前做了非常多的工作,其中非常重要的就是堆棧指針的設置,這也是從匯編到C運行環境一定要做的一件事了。

那么stm32的啟動大致流程是怎樣的?這里小哥就簡述一下:

當然還有一些小細節,這里就不展開了,stm32的Flash可以直接運行程序,采用分散加載,只需要把相應的數據區域加載到運行地址處便可以正常的訪問,這個與前面的所說是類似的。

04uboot部署Linux

在進行Linux系統開發過程中,一切從Bootloader開始,而bootloader本質上就是一個單任務的裸機程序,和單片機程序是一樣的,而在眾多bootloader中最為常用和廣泛的就是uboot了,他就是為了部署Linux環境而生的,下載、燒錄、運行Linux映像、文件系統等等。

uboot都可以搞定,所以它對地址是非常敏感的,程序、參數等等應該存儲在什么地址,在什么地方運行都是需要確定好的,而這些地址在編譯鏈接的過程中,鏈接腳本已經確定好了這一切,uboot的工作就是把這些固件放在編譯鏈接所規定的運行地址處進行運行即可。

圖片

比如全局變量在什么地址,函數在什么地址,當程序運行的過程中就會從這些確切的地址處取數據,如果你把全局函數指針變量的地址分配到了NANDFlash上,那么程序在訪問的過程中就有可能跑飛。

程序運行最重要的兩個地址加載地址和運行地址。

加載地址也常被大家成為存儲地址,即實際固件存儲的位置,其實該地址也只是一個相對的概念,就相當于單片機中bin文件燒錄在什么位置一樣的道理。

運行地址也叫鏈接地址,即程序的絕對地址。全局變量等等都是以該地址為基礎,來確定程序的運行狀態的各部分的地址布局。

當然Linux以上各部分直接燒寫到RAM也是也可以直接運行的,不過還是那個問題,一旦掉電則全部丟失,所以最終每個部分都會寫入到Flash上(當然在前期調試的時候可以直接下載到RAM中,減少對Flash的反復擦寫),但對于大部分Flash都是無法直接運行程序的,即使能夠運行,比如Norflash也是非常的慢,且不能夠直接寫入,所以Linux內核等都會加載到RAM來運行,以獲得更快的執行速度,那么前面介紹的那種單片機方式只重定位數據段的方式不太適用了。

在嵌入式Linux平臺上,首先執行的就是bootloader,而它只是一個順序執行的程序,它有一個重要的工作就是把Linux內核搬運到RAM中運行,由于我們的內核兼容不同的單板,uboot也會傳遞給內核一些配置參數以配置內核。

往往RAM分配的地址比較高,而整個程序往往都是0地址開始執行了的,如果讓存儲地址與運行地址相同來進行編譯,會導致最終燒錄文件非常之大,并且中間有一大片地址區域是無效的。

那么有什么辦法來解決這個無效區域以縮小我們的固件大小呢?先了解下位置無關指令。

05位置無關指令

既然有位置無關指令就有位置有關指令,簡單的說所執行的指令是不是與位置相關才能達到目的。

可以類比與絕對路徑與相對路徑,相對路徑你可以把程序放在任何文件夾下面,編輯器均可以根據工程文件路徑找到其他每一個文件,而絕對路徑卻不行,一旦文件夾換了,基本上就是定位不到具體的每個文件了。

所以位置無關就相當于相對路徑,數據的訪問、函數的調用幾乎都是相對的,為什么說是幾乎呢?因為有些情況下訪問絕對地址也是與位置關系不大的,可以把這段程序放在可以執行的任何位置,所以位置無關碼的運行與鏈接地址也沒有直接的聯系。

比如跳轉指令B BL等這些跳轉指令采用PC+偏移量,所以為位置無關指令;而如果我們采用ldr r0, =標記,而這些標記都是實際在鏈接過程中確定的運行地址,所以該指令為位置有關指令;并且全局變量基本上都是位置有關,而局部變量為位置無關;所以對于位置無關代碼區域,跳轉一般都使用B指令,而從位置無關代碼區域跳轉到位置有關指令代碼區域去執行就需要借助位置有關跳轉指令。

06加載與運行地址不同

當存儲地址與鏈接地址不同時,多數情況下由于采用位置有關指令會出問題,最常見的就是PC指針取的絕對地址,而此時該絕對地址處無存儲,導致程序飛掉。

既然有了位置無關的程序,那么我們就可以把其當作一個搬運工放在位置有關部分的后面,一旦需要運行位置有關碼,那么就會通過位置無關碼把有關部分拷貝到運行地址處,然后跳轉執行即可,這樣整個的程序就可以做得非常的連續且中間幾乎沒有無效區域,該搬運的過程就是常說的重定位。

07地址的設置

大部分ARM處理器其PC都是從0地址開始執行,所以在0地址處要么是運行程序,要么就是引導程序,如果沒有這兩樣,你的程序燒錄到其他位置均無法得到運行。

對于S3C2440芯片能夠支持NorFlash和NandFlash啟動,其中NorFlash上可以直接運行,而NandFlash啟動由于其程序無法直接在上面運行,芯片會把內部SRAM作為0地址處,并且把NandFlash前4K代碼拷貝到SRAM上運行。

因為這里最終想讓所有的程序都在SDRAM里面運行,考慮使用全部重定位的辦法,在鏈接腳本中確定好程序的存儲地址和運行地址。

上圖是GUN linker中截取的段描述格式,來源于:

http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_mono/ld.html

具體詳細解讀大家可以參考上面的鏈接,下面看看幾個常用的。

可執行文件由各個段組成,:

1、secname段名,一般使用數據段.data段,代碼段.text段等等。

2、AT(ldadr)表示該段存儲地址,也就是加載地址。

3、contents表示目標文件(比如.o目標文件)中的哪些段放在本段,也可以是整個目標文件全部放在這個段內。

4、start表示本段鏈接(或者稱為運行)的地址,如果沒有使用AT(ldadr),本段存儲的地址也是start,也就是說存儲地址與運行地址相等。

通過上面的段描述格式就可以在鏈接過程中確定好程序的運行地址和載入地址,以方便后續的重定位地址的使用。

下面以一個簡單的實例說明一下:

  1.  1//....格式 
  2.  2SECTIONS { 
  3.  3... 
  4.  4secname start BLOCK(align) (NOLOAD) : AT ( ldadr ) 
  5.  5  { contents } >region :phdr =fill 
  6.  6... 
  7.  7} 
  8.  8//.....示例 
  9.  9SECTIONS { 
  10. 10... 
  11. 11.text 0x30000 : AT ( 0x0000 ) 
  12. 12  { *(.text) } 
  13. 13 
  14. 14.data 0x3FFFF : AT ( 0xFFFF ) 
  15. 15  { *(.data) } 
  16. 16... 
  17. 17} 

這樣固件的代碼段的存儲地址為0,數據段存儲地址為0xFFFF,而運行地址分別為0x30000和0x3FFFF,最終重定位部分就根據這鏈接腳本中的符號獲得相應地址,然后把相應的部分"搬運"到運行地址處運行處,比如如果載入地址在NandFlash上,那么重定位的過程中就需要初始化NandFlash控制器,然后讀取NandFlash上的數據并"搬運"到運行地址處。

在嵌入式linux中很多時候這些地址都需要我們自己確認和設置的,不然Linux內核無法啟動或者加載相應程序,而在單片機開發中用慣了IDE工具,所以大部分人涉及得不多~

本文轉載自微信公眾號「嵌入式情報局」,可以通過以下二維碼關注。轉載本文請聯系嵌入式情報局公眾號。

 

責任編輯:武曉燕 來源: 嵌入式情報局
相關推薦

2021-07-08 09:15:20

單片機編程狀態機編程語言

2021-10-14 15:48:28

鴻蒙HarmonyOS應用

2021-11-08 10:53:58

IPMAC地址

2021-06-22 10:02:07

單片機語言代碼

2013-01-04 10:31:32

單片機網絡交換機

2009-04-11 15:12:24

2010-09-08 15:18:54

單片機TCP IP協議棧

2010-06-19 13:32:36

TCP IP協議棧

2010-06-19 14:10:35

TCP IP協議棧

2020-12-03 06:32:21

STM32單片機通信

2021-01-08 05:59:39

Linux應用程序Linux系統

2022-01-26 08:31:25

聯合體單片機編程

2011-05-24 17:47:40

2022-03-01 08:31:37

volatile變量編譯器

2010-07-01 15:38:41

TCP IP協議棧單片機

2018-05-18 09:07:43

Linux內核內存

2009-04-22 17:18:29

PCB技術單片機

2010-08-20 09:00:42

控制列表

2025-04-16 08:15:00

網絡通信IP地址網絡

2009-10-19 09:45:06

linux內存存管理
點贊
收藏

51CTO技術棧公眾號

亚洲精品国产一区二区精华液 | 一区二区在线高清视频| 波多野结衣家庭主妇| 97偷自拍亚洲综合二区| 日韩天堂在线观看| 成人一级片网站| 国产最新在线| 99久久国产综合精品色伊| 国产精品旅馆在线| 精品少妇一二三区| 日韩a一区二区| 亚洲国产精久久久久久| 中文字幕22页| xx欧美xxx| 一个色妞综合视频在线观看| 日韩欧美精品久久| 好吊视频一二三区| 久久99久久99| 国产91精品最新在线播放| 麻豆国产尤物av尤物在线观看 | 日韩视频在线观看视频| 丰满人妻av一区二区三区| 麻豆国产欧美日韩综合精品二区| 8050国产精品久久久久久| 亚洲伦理一区二区三区| 精品国产成人| 亚洲韩国欧洲国产日产av| 一级片黄色免费| 99精品在免费线偷拍| 欧美日韩激情小视频| 日日噜噜夜夜狠狠久久丁香五月| 国产鲁鲁视频在线观看免费| 成人综合在线视频| 亚洲a区在线视频| 怡红院男人天堂| 久久国产日本精品| 1769国内精品视频在线播放| 免费在线观看黄色av| 999久久久91| 亚洲美女精品成人在线视频| 国内精品免费视频| 欧美专区视频| 日韩一区二区视频在线观看| 性猛交ⅹ×××乱大交| 惠美惠精品网| 色综合天天综合色综合av| 国产在线播放观看| 国产美女一区视频| 亚洲国产综合人成综合网站| 国产精品videossex国产高清 | 亚洲日本三级| 亚洲欧美精品一区| 97人妻精品一区二区免费| 日韩精品免费一区二区夜夜嗨| 精品999在线播放| 亚洲一区二区三区黄色| 国内露脸中年夫妇交换精品| 精品国产乱码久久久久久久| 催眠调教后宫乱淫校园| 国产毛片久久久| 亚洲福利在线播放| 在线免费观看黄色小视频| 亚洲丁香日韩| 中文字幕在线观看日韩| 波多野结衣喷潮| 欧美一区久久| 97色伦亚洲国产| 午夜一区二区三区四区| 日本伊人色综合网| 成人在线激情视频| 六月丁香综合网| 久久色.com| 亚洲精品国产系列| 免费av在线播放| 亚洲一区二区在线观看视频| 99热在线这里只有精品| 精品欧美一区二区三区在线观看| 欧美日韩一区久久| 日本黄色一级网站| 久久影院资源站| 亚洲天堂开心观看| 黑鬼狂亚洲人videos| 亚洲激情专区| 国产精品精品国产| 国内精品偷拍视频| 99精品视频一区二区| 日韩精品久久久免费观看| 毛片在线播放a| 亚洲国产欧美在线| 男女啪啪网站视频| 视频免费一区二区| 亚洲人av在线影院| 中文字幕在线有码| 亚洲精品1234| 国产成人涩涩涩视频在线观看| 中文字幕一区二区人妻痴汉电车| 国产成人av网站| 日本视频一区二区在线观看| av免费在线观看网址| 欧美日韩中文字幕在线| 热久久久久久久久| 亚洲人成精品久久久| 久久亚洲私人国产精品va| 男人的天堂一区| 精品写真视频在线观看| 欧美不卡在线一区二区三区| 尤物yw193can在线观看| 欧美亚洲一区三区| 亚洲一区二区在线免费| 日韩欧美视频| 啪一啪鲁一鲁2019在线视频| 国产高清在线观看视频| 日本一区二区免费在线观看视频| 日韩 欧美 视频| 99久热在线精品视频观看| 国产视频精品va久久久久久| 欧美久久久久久久久久久久| 免费成人在线网站| 狼狼综合久久久久综合网| www在线免费观看视频| 欧美在线观看视频一区二区| 成人免费无码大片a毛片| 欧美xxx在线观看| 国产有码一区二区| www.亚洲视频| 色网综合在线观看| 人妻精品久久久久中文字幕| 在线欧美三区| 波多野结衣一区二区三区在线观看| 99reav在线| 在线观看亚洲精品| 亚洲自拍偷拍一区二区| 狠狠色丁香久久综合频道| 91精品视频在线免费观看| h视频在线免费| 欧美影视一区二区三区| 无码国产69精品久久久久同性| 在线视频精品| 久久久久久久免费| 亚洲精品日产| 国产视频综合在线| aaa人片在线| 91在线视频播放地址| 婷婷五月综合缴情在线视频| 成人激情自拍| 97精品一区二区视频在线观看| 好男人在线视频www| 亚洲综合男人的天堂| 亚洲成人激情小说| 欧美日韩精品| 国产日韩一区欧美| 欧美xxxhd| 亚洲欧美一区二区三区四区| 久草手机在线视频| 久久精品欧美一区二区三区不卡| 免费男同深夜夜行网站 | 中文字幕一区二区三区四区五区六区| 国产欧美自拍| 久久视频国产精品免费视频在线| 波多野结衣高清视频| 国产精品久久久久四虎| 中文国产在线观看| 国产主播一区| 久久国产精品-国产精品| 午夜激情电影在线播放| 亚洲一区www| 国产精品久久777777换脸| 亚洲女同ⅹxx女同tv| 欧美图片自拍偷拍| 久久久一二三| 免费看av软件| 黄色美女久久久| 国产成人高清激情视频在线观看| 91涩漫在线观看| 日韩欧美在线观看一区二区三区| 国产午夜福利一区二区| 久久久久久免费毛片精品| 999在线观看| 亚洲精品男同| 少妇特黄a一区二区三区| 玖玖精品一区| 全亚洲最色的网站在线观看| 欧美日韩xx| 日韩精品一区国产麻豆| 成年人视频免费| 亚洲欧美成aⅴ人在线观看| 在线天堂www在线国语对白| 日本女优在线视频一区二区| 白白操在线视频| 国产伦精品一区二区三区视频 | 日本中文字幕在线一区| 国产精品老女人视频| 色女人在线视频| 国产一区二区三区直播精品电影| 99热精品在线播放| 色婷婷一区二区三区四区| 亚洲色图综合区| 国产清纯美女被跳蛋高潮一区二区久久w | 久久久噜噜噜| 8x8x华人在线| 国产一区毛片| 国产精品一 二 三| 国产精品伦一区二区| 97久久超碰福利国产精品…| 免费黄网在线观看| 亚洲人成在线电影| 嫩草影院一区二区| 制服.丝袜.亚洲.另类.中文| 欧美亚洲另类小说| 亚洲成av人片一区二区三区| 亚洲怡红院在线观看| 国产日韩精品一区| 污片免费在线观看| 国产精品一区二区三区乱码| 日韩精品免费播放| 99精品视频免费观看视频| 国产成年人在线观看| 国语产色综合| 蜜桃91精品入口| 国产乱人伦丫前精品视频| 91免费版网站入口| 午夜精品久久久久久毛片| 日韩**中文字幕毛片| 天堂av在线网| 欧美精品激情视频| 最新国产在线拍揄自揄视频| 自拍偷拍免费精品| lutube成人福利在线观看| 亚洲欧美日韩中文视频| 日韩av免费观影| 日韩经典中文字幕| 五月婷婷伊人网| 亚洲第一天堂av| 内射无码专区久久亚洲| 精品国产不卡一区二区三区| 亚洲国产成人在线观看| 欧美一区二区三区思思人| 国产又粗又黄视频| 在线成人高清不卡| 99国产精品99| 日韩欧美黄色影院| 精品人妻伦一区二区三区久久 | 久久久久久国产精品日本| 免费高清不卡av| 亚洲免费av一区| 精品在线你懂的| 日韩欧美中文视频| 国产成人av自拍| www.555国产精品免费| 粉嫩aⅴ一区二区三区四区五区| 亚洲午夜精品在线观看| 国产伦精品一区二区三区免费 | 国产三级伦理片| 91精品国产福利| 亚洲精品97久久中文字幕无码| 日韩欧美中文字幕精品| 丰满肥臀噗嗤啊x99av| 亚洲成人精品视频在线观看| 亚洲欧美日韩动漫| 亚洲无限av看| 日韩av中文| 欧美成人午夜激情在线| 国产探花在线观看| 日本sm极度另类视频| 成人在线视频播放| 国产日韩在线视频| 成人自拍在线| 欧美日韩国产不卡在线看| av资源久久| 精品少妇人妻av一区二区| 欧美激情自拍| 337p粉嫩大胆噜噜噜鲁| 免费在线观看精品| 香蕉视频在线观看黄| 91社区在线播放| 特级西西人体高清大胆| 亚洲精品videosex极品| 二区视频在线观看| 欧美精品精品一区| 欧美一级片免费| 一区二区亚洲精品国产| 91网址在线观看| 欧洲成人午夜免费大片| 自拍偷拍亚洲图片| 激情一区二区三区| 欧美电影免费播放| 丁香六月激情婷婷| 日韩不卡一区二区三区| 特黄特色免费视频| 国产日本欧美一区二区| 久视频在线观看| 欧美调教femdomvk| 日韩一区免费视频| y97精品国产97久久久久久| 黄色aa久久| 96pao国产成视频永久免费| 网曝91综合精品门事件在线| 日韩video| 日韩av电影一区| 波多野结衣视频播放| 亚洲欧美日韩中文字幕一区二区三区 | 一级欧美一级日韩片| 国产精品卡一卡二卡三| 五月婷婷激情网| 欧美一区二区性放荡片| 好男人免费精品视频| 国内免费精品永久在线视频| 国产精品诱惑| 欧美日本韩国国产| 国产综合精品| 天堂av.com| 国产精品剧情在线亚洲| 中文在线第一页| 亚洲精品在线观| 91麻豆免费在线视频| 国产区精品视频| 欧美日韩伦理在线免费| 1024av视频| 成人美女在线观看| 视频这里只有精品| 这里是久久伊人| 69久久精品| 国产精品成熟老女人| 日韩美脚连裤袜丝袜在线| 中文精品无码中文字幕无码专区| 久久99深爱久久99精品| 亚洲高潮女人毛茸茸| 色狠狠综合天天综合综合| 五月婷婷激情在线| 91国内揄拍国内精品对白| 51亚洲精品| 日韩专区第三页| 国产成人精品亚洲日本在线桃色 | 美女露出粉嫩尿囗让男人桶| 亚洲欧美综合另类在线卡通| 中文字幕永久在线观看| 色偷偷综合社区| 91大神在线观看线路一区| 水蜜桃一区二区| 蜜臀精品一区二区三区在线观看 | 欧美在线观看天堂一区二区三区| 九一精品久久久| 亚洲男人的天堂网| 精品国产一级片| 欧美精品18videosex性欧美| eeuss国产一区二区三区四区| 日本a级片在线播放| 国产成人精品在线看| 国产一级片播放| 亚洲电影中文字幕| 国产色播av在线| 日本不卡高清视频一区| 免费的成人av| 成年人午夜剧场| 亚洲成在人线av| 欧美xxxxxx| 一级做a爰片久久| 国产乱妇无码大片在线观看| 麻豆视频在线观看| 亚洲精品国产精品久久清纯直播| 92国产精品| 亚洲精品永久www嫩草| 激情综合色丁香一区二区| 日本a级片视频| 亚洲国产美女久久久久| 丝袜美腿诱惑一区二区三区| 亚洲精品乱码视频| 国产精品1024久久| 国产 欧美 日韩 在线| 亚洲天堂视频在线观看| 日韩一区二区三免费高清在线观看| 亚洲国产精品女人| 99久久久无码国产精品| 自拍偷拍色综合| 欧美乱大交xxxxx另类电影| 精品国产一区二区三区成人影院| 亚洲国产精品久久久久爰色欲| 国产精品污网站| 亚洲国产一二三区| 日韩av免费一区| 欧美精品97| 一区二区精品免费| 日韩欧美一区在线观看| 亚洲承认视频| 日本福利视频网站| 国产三级精品在线| 亚洲精选一区二区三区| 国产精品久久久久久久久久ktv| 欧美在线影院| 性猛交娇小69hd| 亚洲成人免费在线视频| av在线播放一区二区| 激情五月开心婷婷| 亚洲另类中文字| 成年人在线观看视频| 国产精品视频免费一区| 久久99久久久久| 欧美亚洲另类小说| 久久久久久亚洲精品中文字幕| 日韩久久视频|