精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产桃色电影在线播放| 中国a一片一级一片| 亚洲免费不卡视频| 欧美1区2区| 欧美成人乱码一区二区三区| 成人午夜视频免费观看| 亚洲精品97久久中文字幕无码| 黄色亚洲免费| 91福利国产精品| 亚洲一区二区三区加勒比| 91黄色在线视频| 国产精品国码视频| 亚洲精品黄网在线观看| 美女喷白浆视频| av网站在线免费| 91小视频在线| 国产女精品视频网站免费| 丝袜美腿小色网| 精品国产导航| 欧美日韩精品综合在线| 国产片侵犯亲女视频播放| 亚洲色偷精品一区二区三区| 免费日本视频一区| 欧美国产视频一区二区| 中文字幕5566| 国精产品一区一区三区四川| 亚洲欧美福利一区二区| 久久久久se| 中文字幕制服诱惑| 最新国产拍偷乱拍精品| 国产一区二区三区日韩欧美| 在线观看免费看片| 国产第一亚洲| 欧美日韩免费观看中文| 一区二区三区四区视频在线 | 嫩草研究院在线| 老汉av免费一区二区三区| 午夜精品蜜臀一区二区三区免费| wwwxx日本| 久久爱.com| 午夜成人免费视频| 在线观看视频黄色| 久久久久久女乱国产| 国产1区2区3区精品美女| 国产精品视频免费在线| 1级黄色大片儿| 91精品国产自产在线观看永久∴| 亚洲美女又黄又爽在线观看| 一区二区三区四区毛片| 欧美成人精品三级网站| 亚洲高清免费在线| 国产女主播av| 91社区在线| 久久嫩草精品久久久精品一| 999视频在线观看| 亚洲视屏在线观看| 亚洲欧美视频一区二区三区| 久久99久久99精品免观看粉嫩| 黄色片网站免费| 亚洲午夜久久| 欧美不卡在线视频| 午夜精品久久久久久久99热影院| 成人激情综合| 91福利视频久久久久| 欧美变态另类刺激| jizzjizz中国精品麻豆| 一区二区三区色| 日韩激情久久| 日日摸天天添天天添破| 中文在线播放一区二区 | 欧美丰满熟妇bbb久久久| 影视一区二区三区| 色婷婷香蕉在线一区二区| ww国产内射精品后入国产| 欧美寡妇性猛交xxx免费| 亚洲精品国产高清久久伦理二区| 亚洲一区在线直播| 一广人看www在线观看免费视频| 99re视频这里只有精品| 国产在线一区二| 五月天婷婷激情网| 91丨porny丨户外露出| 久久婷婷开心| 深夜福利视频在线观看| 久久蜜桃香蕉精品一区二区三区| 精品欧美日韩在线| 水莓100在线视频| 久久―日本道色综合久久| 欧美污视频久久久| 国产中文在线观看| 国产精品久久国产精麻豆99网站| 中文字幕一区二区三区四区五区| 高清美女视频一区| 国产精品毛片久久久久久久| 中文字幕99| 另类视频在线| 精品日本高清在线播放 | 亚洲精品成人无码| 欧美色女视频| 毛片精品免费在线观看| 永久久久久久久| 极品日韩av| 国产成人综合精品在线| 一区二区日韩在线观看| 国产激情一区二区三区四区| 成人激情视频在线播放| 国产精品乱码一区二区| av不卡一区二区三区| 日本在线视频不卡| 黄色网页在线观看| 亚洲va韩国va欧美va| 污污视频网站免费观看| 国产不卡精品| 亚洲欧美国产一区二区三区| 黄色av片三级三级三级免费看| 91成人国产| 奇门遁甲1982国语版免费观看高清| 欧美在线视频精品| 国产成人免费视频网站 | 久久久久97| 日韩精品高清在线观看| 特黄一区二区三区| 亚洲激情亚洲| 成人黄色大片在线免费观看| 五月激情婷婷综合| 亚洲免费观看高清完整版在线观看熊 | 欧美第一黄色网| 欧产日产国产69| 国产麻豆精品久久一二三| 久久精品国产美女| 爆操欧美美女| 欧美在线不卡视频| 中文视频在线观看| 亚洲第一偷拍| 国产精品男人的天堂| 欧美视频一二区| 亚洲人午夜精品天堂一二香蕉| 欧美aⅴ在线观看| 给我免费播放日韩视频| www.国产精品一二区| 国产精品久免费的黄网站| 国产精品亚洲成人| 亚洲精品成人a8198a| 国产一二三在线| 欧美欧美欧美欧美首页| 一级片手机在线观看| 亚洲久久视频| 99久久久精品免费观看国产| 精品孕妇一区二区三区| 欧美艳星brazzers| 扒开jk护士狂揉免费| 亚洲第一毛片| av一区二区三区在线观看| 婷婷免费在线视频| 在线观看日韩一区| wwwwww日本| 在线综合视频| 精品国产一二| h片精品在线观看| 911精品国产一区二区在线| 精品无码在线观看| 日韩国产精品久久久| 热舞福利精品大尺度视频| 欧亚在线中文字幕免费| 亚洲高清久久网| 亚洲精品在线观看av| 国产精品一区二区久激情瑜伽 | 国产精品高潮久久久久无| 丰满少妇在线观看| 精品久久久久久久久久久下田| 欧美专区中文字幕| 三级视频网站在线| 色偷偷成人一区二区三区91| 受虐m奴xxx在线观看| 欧美一级久久| 日韩和欧美的一区二区| 成人自拍视频网| 最新国产精品拍自在线播放 | 日韩国产欧美一区二区三区| 天堂社区 天堂综合网 天堂资源最新版| 成人性生活视频| 在线播放日韩专区| 91精品视频免费在线观看| 国产精品久久久久久久久动漫 | www.一区| 亚洲视频在线播放| 亚洲视频一区二区三区四区| 日本中文字幕一区| 精品在线不卡| 91av亚洲| 视频一区视频二区国产精品 | 欧美日韩一区二区区别是什么 | 久久99久久精品欧美| 一区二区视频在线观看| 精品一区视频| 亚洲男人天堂2023| 成人午夜视频在线播放| 欧美国产日韩a欧美在线观看| 福利视频999| 亚洲电影成人| 日本精品视频一区| 国产一区二区av在线| 97超碰国产精品女人人人爽| 九色在线播放| 制服丝袜亚洲色图| 久草福利资源在线观看| 26uuu亚洲综合色欧美| 欧美一级特黄a| 欧美私人啪啪vps| 欧美日韩在线观看一区| 国产精品国产亚洲精品| 57pao精品| 国模吧精品人体gogo| 制服丝袜av成人在线看| 久久黄色精品视频| 日本一区二区动态图| 最新版天堂资源在线| 免费观看在线色综合| 中文字幕无码精品亚洲资源网久久| 久久99性xxx老妇胖精品| 成人免费视频a| 中国色在线日|韩| 久久五月情影视| 四虎精品在线| 欧美大胆一级视频| 无码久久精品国产亚洲av影片| 一区二区三区日本| 91无套直看片红桃在线观看| www.色综合.com| 国产永久免费网站| 日韩精品成人一区二区三区| 最新中文字幕久久| 国产精品一国产精品| 国产成人精品日本亚洲11 | 黑人粗进入欧美aaaaa| 好吊日精品视频| 亚洲图片都市激情| 五月国产精品| 国内一区在线| 久久精品一级| 国产日韩欧美自拍| 少妇精品视频一区二区免费看| 久久人人看视频| 爆操欧美美女| 中文字幕亚洲欧美一区二区三区| 婷婷在线免费观看| 日韩亚洲欧美综合| aaa毛片在线观看| 亚洲精品偷拍| 亚洲熟妇av日韩熟妇在线| 最新亚洲一区| 日本福利视频在线| 久久久久国产精品午夜一区| 亚洲乱码国产一区三区| 日韩高清一区在线| gogogo高清免费观看在线视频| 久久99这里只有精品| 中文字幕一二三| 岛国av在线一区| 成人免费无码大片a毛片| 久久久久国产精品麻豆ai换脸| 国产人妻大战黑人20p| 中文字幕在线一区免费| 农村黄色一级片| 亚洲大片在线观看| www五月天com| 欧美精选午夜久久久乱码6080| 国产青青草视频| 日韩av在线电影网| www.亚洲视频| 操日韩av在线电影| aa国产成人| 国产男人精品视频| 2021年精品国产福利在线| 久久综合久久久| 久久美女精品| 亚洲国产精品成人天堂| 日韩综合小视频| 深夜做爰性大片蜜桃| 不卡的av在线| 国产精品久久久久久成人| 一区二区三区**美女毛片| 婷婷激情五月网| 9191成人精品久久| 三级视频在线| 久久午夜a级毛片| 三妻四妾完整版在线观看电视剧| 国产精品一区二区三区成人| 国产精品久av福利在线观看| 日韩av高清在线播放| 欧美日韩一区二区三区四区在线观看 | 深爱五月激情网| 亚洲美女免费视频| 亚洲欧美偷拍一区| 日韩免费看网站| 懂色av中文在线| 国语自产在线不卡| 亚洲欧美久久精品| 欧美高清视频一区| 女人色偷偷aa久久天堂| 少妇人妻互换不带套| 国产精品一区二区在线播放| 黄色片在线观看免费| 亚洲电影中文字幕在线观看| 在线中文字幕网站| 亚洲视频第一页| a在线视频v视频| 91传媒视频免费| 日本不卡高清| 人妻少妇被粗大爽9797pw| 国产成人免费xxxxxxxx| 懂色av粉嫩av浪潮av| 欧美日韩一区二区三区| 国产sm主人调教女m视频| 国产一区二区日韩| 性国裸体高清亚洲| 国产二区不卡| 91tv精品福利国产在线观看| 毛片毛片毛片毛片毛片毛片毛片毛片毛片| 国产a久久麻豆| 极品盗摄国产盗摄合集| 欧美人妖巨大在线| 9i精品一二三区| 国产91露脸中文字幕在线| silk一区二区三区精品视频| 咪咪色在线视频| 久久电影网站中文字幕| 美女久久久久久久久久| 第一福利永久视频精品| 亚洲欧美国产高清va在线播放| xxxxxxxxx欧美| 亚洲网站三级| 在线电影看在线一区二区三区| 日韩福利视频导航| 永久免费av无码网站性色av| 日韩欧美国产激情| 亚洲区小说区图片区| 69av成年福利视频| 少妇高潮一区二区三区| 男女啪啪免费视频网站| 成人性视频网站| 激情综合网五月婷婷| 精品国产欧美一区二区| 免费av不卡在线观看| aa成人免费视频| 亚洲精品欧美| 中文字幕影片免费在线观看| 午夜激情一区二区| 亚洲三级中文字幕| 日本久久久久久久久| 欧美日韩在线二区| 日韩av片专区| 亚洲精品乱码久久久久| xxxx国产精品| 97人人做人人爱| 亚洲区小说区| 人人爽人人av| 亚洲丝袜制服诱惑| 国产高潮在线观看| 久久久在线视频| 国产精选一区| 日本人69视频| 亚洲成人精品影院| 日本免费一区二区三区最新| 国产精品高清在线| 香蕉综合视频| 亚洲自拍偷拍精品| 色女孩综合影院| 国产日产一区二区| www.久久久| 久久高清免费观看| 91ts人妖另类精品系列| 精品久久一二三区| 松下纱荣子在线观看| 午夜精品一区二区三区在线观看| 激情小说亚洲一区| 欧美亚韩一区二区三区| 亚洲欧洲xxxx| 日本免费一区二区视频| 国产特级淫片高清视频| 中文字幕不卡在线| 日本xxxxwww| 国产精品网址在线| 极品av少妇一区二区| 精品无码在线观看| 日韩精品专区在线| 日韩美女在线看免费观看| 中文字幕精品在线播放| 亚洲午夜黄色| 精品人妻无码一区二区三区| 9191久久久久久久久久久| 日本不卡免费高清视频在线| 一本一道久久久a久久久精品91| 丁香一区二区三区| 中文字幕久久网| 午夜精品久久久久久99热软件| 97精品国产一区二区三区| 三级视频网站在线观看| 51午夜精品国产| 日韩精品专区|