




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、ARM映象文件及執(zhí)行機(jī)理學(xué)習(xí)報(bào)告這幾天為了弄清楚系統(tǒng)是如何運(yùn)行相應(yīng)的可執(zhí)行程序可謂費(fèi)盡心機(jī),整個(gè)五一假期都沒有休息,其中由于燒寫的軟件出了些問題,使得理解映象文件及執(zhí)行機(jī)理更加曲折,不過還好在自己的努力和論壇上兄弟的幫助下,終于還是成功了。作為進(jìn)入系統(tǒng)設(shè)計(jì)的重要一步,我覺得這個(gè)過程是應(yīng)該寫下來的,既是為了自己的總結(jié),也為了后來進(jìn)入的人可以少走些彎路。我的開發(fā)板配置如下:l :芯片(核)l :1片16×1M位數(shù)據(jù)寬度的FLASH,共2M 字節(jié)Flash(MX29LV160BTC),速度70/90ns;位模式。l 內(nèi)存:片4M ×16位數(shù)據(jù)寬度的SDRAM(HY57V65162
2、0B TC-10S)構(gòu)成,共16M 字節(jié)SDRAM。2片16位拼做32位使用,共用一個(gè)片選。l 簡易調(diào)試,兩個(gè)串口,一個(gè)以太網(wǎng)口從我個(gè)人的學(xué)習(xí)經(jīng)過認(rèn)為,初學(xué)者最難突破的應(yīng)該是以下三個(gè)方面。所以,本文基本上從這三個(gè)方面來闡述。l 映象文件(包括文件和文件)的生成和組成l 映象文件下在中的狀態(tài)和運(yùn)行時(shí)的狀態(tài)(加載域和運(yùn)行時(shí)域)l 地址重映射本文基本圍繞附錄給出的那個(gè)串口發(fā)送程序而展開的。這個(gè)程序的初始化和地址重映射部分參考了的程序(:?),串口發(fā)送部分參考了的程序(那我自己寫了什么呢?J)。首先我們應(yīng)該建立這樣一種概念,對于一個(gè)裸機(jī)(里什么都沒有)來說,所有的細(xì)節(jié)都得自己設(shè)置,不要指望芯片或開發(fā)工
3、具可以為你做些什么!所以從第一條指令開始,你就必須負(fù)責(zé)所有的工作。對于,上電或復(fù)位后從開始執(zhí)行指令,而硬件上我們把接在了的處,所以就是從的處開始取指令,那么我們就必須保證一開始可以取到正確的指令。小插曲:我前幾天就是被我的下載程序害死了,由于下載程序的時(shí)序問題,開始的多個(gè)字節(jié)里不能正常燒寫,結(jié)果老是為,而我剛剛開始也不懂得映象文件的內(nèi)涵,結(jié)果以為文件就是可執(zhí)行文件,將其燒入,所以程序真正的第一條指令在開始,不能正確燒寫的部分正好是文件的頭,沒有影響到真正的指令。程序有時(shí)也可以執(zhí)行(因?yàn)橄喈?dāng)于空指令一樣,程序也可以執(zhí)行到真正的第一條指令),所以串口輸出的都是不對的亂碼或字母。一的映象文件初步認(rèn)識
4、和文件這里我先談?wù)劦挠诚笪募纯蓤?zhí)行文件)的概念。我們生成的的映象文件有格式和格式兩種,有時(shí)容易被二者混淆。其實(shí)文件是真正的可執(zhí)行文件,而文件是特有的調(diào)試文件,里面除了包含文件的內(nèi)容之外,還附加了許多其他調(diào)試信息。首先讓我們來看看和的區(qū)別,圖圖是用打開的文件和文件的頭部和尾部。這兩個(gè)文件都是用生成的(選中中的:和中的:這兩個(gè)選項(xiàng),就可以同時(shí)生成相應(yīng)的和文件)。在生成這兩個(gè)映象文件時(shí),請?jiān)O(shè)置的選項(xiàng):設(shè)為,設(shè)為,作用將在本文后面解釋。圖是文件,其中反顯處才是真正的第一條指令,開始的個(gè)字節(jié)都是文件頭,而圖的文件從就是真正的第一條指令(所以為什么說文件才是真正的可執(zhí)行文件)。關(guān)鍵是從第一條指令開始的
5、二個(gè)文件的比較了,哦,竟然是完全相同的,一直到文件的尾部,見圖和圖。即文件就是文件的。不過,二者的相應(yīng)指令或數(shù)據(jù)的地址就不一樣了,先記住這一點(diǎn)伏筆。文件結(jié)束(圖反顯處),但文件還沒有結(jié)束(圖中反顯指示文件相應(yīng)結(jié)束部分),其后還有很多相關(guān)的調(diào)試信息,這些調(diào)試信息可以用在或的的調(diào)試中。由于我們的燒寫工具是原封不動(dòng)地將映象文件燒入中,所以,文件是不可以燒入的,否則的處就不是真正的第一條指令,而是頭部分。我們應(yīng)該將文件燒入,保證的處是第一條指令。我個(gè)人猜測,文件應(yīng)該可以通過“中的下載功能”下載到中運(yùn)行,在下載的過程中可能經(jīng)過相應(yīng)的內(nèi)部處理而導(dǎo)致真正燒入中的還是文件。到現(xiàn)在為止,我們只能感性認(rèn)識一下映象
6、文件:文件和文件的不同,也就是說,文件是文件的一部分,最精華的一部分,那么到底哪部分是最精華的呢?文件中包含了哪些內(nèi)容呢?指令和數(shù)據(jù)到底放在映象文件的什么地方呢?下面接著分析。圖中打開的文件二進(jìn)制形式(頭部部分)圖中打開的文件二進(jìn)制形式(頭部部分)圖中打開的文件二進(jìn)制形式(中間部分)圖中打開的文件二進(jìn)制形式(尾部部分)映象文件的內(nèi)容討論到映象文件的內(nèi)容,就應(yīng)該打開源程序并理解源程序的內(nèi)容了,這個(gè)程序比較簡單,我們這里講解的都是初級知識,給大家一個(gè)入門的啟示,復(fù)雜的以后可以再慢慢學(xué)。所以大家看到這篇文章不要老是想到復(fù)雜的情況,那樣本文有些闡述可能就不太對頭了:)首先我們可以先不看程序具體做了什么
7、,我們總應(yīng)該可以看出這個(gè)簡單程序分為兩個(gè)部分,一個(gè)是部分,即指令代碼部分;另一部分是部分,即數(shù)據(jù)部分。,(代碼部分),(數(shù)據(jù)部分),書上說,映象文件一般由域組成,域由最多三個(gè)輸出段(,)組成,輸出段又由輸入段組成。那么我們來看看生成的映象文件到底怎么符合書上的概念,又怎么和上面源程序的代碼和數(shù)據(jù)部分對應(yīng)起來的。先來看看圖吧,我覺得實(shí)物最可以給人以說服力。圖中打開的格式映象文件二進(jìn)制形式(大部分)大家看到了吧,藍(lán)色反顯的前部其實(shí)就是源程序?qū)?yīng)的指令代碼部分,反顯后對應(yīng)的就是源程序的數(shù)據(jù)部分。反顯處就是指令部分和數(shù)據(jù)部分的分界處。大家仔細(xì)看看,反顯開始的地方往后其實(shí)就是要從串口輸出的字符數(shù)據(jù)(由于
8、屏幕關(guān)系,沒有完全顯示出,大家可以自己用打開看看);而從開始至處是程序中的指令編碼(編譯好的二進(jìn)制編碼)。所以,可以這么說,l 域:整個(gè)映象文件,也就是說這個(gè)簡單程序的映象文件只有一個(gè)域(加載域),其實(shí)大部分程序都是只有一個(gè)加載域l 輸出段:有兩個(gè)輸出段,和,沒有。這個(gè)我們從源程序和圖也可以看出。l 輸入段:兩個(gè)輸入段,即源程序的部分和部分。部分是,屬于輸出段,部分是,屬于輸出段。所以,域、輸出段和輸入段的關(guān)系如下圖:圖例子程序的域、輸出段和輸入段的關(guān)系在加載域中,直接跟在后面,那我們剛剛設(shè)置的連接選項(xiàng):,有什么用呢?的確是從開始,可是卻從開始,和不同阿?到底這是怎么回事呢?二的映象文件的加載
9、域和運(yùn)行時(shí)域所有這些,都是“連接”和“系統(tǒng)存儲(chǔ)器多樣化”惹的禍!連接器一個(gè)很重要的工作就是要解析目標(biāo)文件中各種符號,也就是得到各符號的值。還是先來看看圖吧圖例子程序編譯連接的符號映射圖(一部分)這張圖是例子程序在中編譯連接后顯示出的符號映射的一部分(選中ARM學(xué)習(xí)報(bào)告001 杜云海 duyunhai 中選項(xiàng)卡的和即可),其中設(shè)置了,可以看到象,等符號的值都是相對于而定位的(在段中),而、和卻是相對于而定位的(在段中)。這些符號值是在映象文件開始運(yùn)行時(shí)才起作用。如果僅僅是放在中或僅僅運(yùn)行前面幾條初始化指令(加載域狀態(tài)),那么這些值還暫時(shí)不起作用,否則問題就麻煩了。所以真正運(yùn)行時(shí),就必須保證這些值
10、是對的!于是引出了“數(shù)據(jù)移動(dòng)”。概念什么是加載域和運(yùn)行時(shí)域呢?我個(gè)人認(rèn)為用“域”這個(gè)詞實(shí)在很容易混淆。其實(shí)簡單明了的說,加載域就是最原始的文件,就是映象文件燒入時(shí)的狀態(tài),如圖所示,跟在后面;而運(yùn)行時(shí)域就是經(jīng)過了改頭換面的映象文件,即由于運(yùn)行了相應(yīng)的初始化程序而把或拷貝到相應(yīng)的地方,這是映象文件已經(jīng)四分五裂成至多三個(gè)部分,圖示意例子程序映象文件的兩個(gè)不同狀態(tài)。當(dāng)然運(yùn)行時(shí)域也可以和加載域相同,就是不設(shè)置,那么運(yùn)行時(shí)不需要移動(dòng),依然跟在后面。0x01200000 0x00200000 0x00a000000x000002280x00000000 0x00000000 加載域運(yùn)行時(shí)域圖例子程序加載域和
11、運(yùn)行時(shí)域比較示意圖在加載域狀態(tài),地址是正確的,意味著指令可以正確執(zhí)行;但是不正確的(從圖可知),但是暫時(shí)的錯(cuò)誤不影響程序初始化,源程序的都暫時(shí)沒有用到,所以程序還是可以正確運(yùn)行,即使在處。程序終究是要用到的,那么怎么辦?其實(shí)只要來個(gè)“乾坤大挪移”就好了,在用到之前將移動(dòng)到正確的位置即可。完成了這個(gè)“挪移”過程。當(dāng)然移動(dòng)前進(jìn)行了地址重映射,不過,地址重映射和的數(shù)據(jù)移動(dòng)其實(shí)是兩回事!在的中(即例子程序的),在映射前,將的備份拷到中,然后將重映射為,非常巧,指令運(yùn)行不受任何影響!重映射后的地址為,此時(shí)主動(dòng)權(quán)已經(jīng)到中的手上了!然后再將移動(dòng)到相應(yīng)的位置。哪里才是相應(yīng)的正確位置呢?的數(shù)據(jù)移動(dòng)有一個(gè)概念很重
12、要:“加載域狀態(tài)”的映象文件中、和的所在地址都是臨時(shí)的,他們所在的真正位置(即連接時(shí)設(shè)置的地址值)都必須在程序初始化時(shí)由相應(yīng)程序,將他們ARM學(xué)習(xí)報(bào)告001 杜云海 duyunhai 移動(dòng)到相應(yīng)的地方。這個(gè)數(shù)據(jù)移動(dòng)過程由完成!源程序由個(gè)部分組成:主要是執(zhí)行的初始化和內(nèi)存重映射,相關(guān)資料可以參考文章(:?)。主要是通過串口發(fā)送幾行字符,這里主要解釋一下和。;¥這六個(gè)全局變量分別是輸出段運(yùn)行時(shí)起始地址,運(yùn)行時(shí)存儲(chǔ)區(qū)域界限,輸出段運(yùn)行時(shí)起始地址,運(yùn)行時(shí)存儲(chǔ)區(qū)域界限,輸出段運(yùn)行時(shí)起始地址,運(yùn)行時(shí)存儲(chǔ)區(qū)域界限。引入的這六個(gè)變量可說是在映象文件編譯連接中起到至關(guān)重要的作用,這里我們就不說得非常復(fù)雜了,就簡
13、單用例子程序來舉例說明?,F(xiàn)在再讓我們回頭看看前面編譯連接時(shí)中的及圖的另外一部分。如圖。圖編譯連接后的映射表一部分其中:l ¥l ¥l ¥l ¥l ¥(其實(shí)是不存在的)l ¥大家把這些地址再和圖的文件(映象文件)對照看看,有哪些相似之處嗎?的和和在中打開的映象文件一樣,也就是說和燒在中的一樣了?。ず停っ黠@不對,不過,仔細(xì)看看,除了地址不對外,其實(shí)相對值還是一樣的,也就是說,只要把中的移到¥所指示的位置即可。¥是的存儲(chǔ)地址界限,其實(shí)是中的開始地址(加載域狀態(tài)時(shí)),因?yàn)榧虞d域狀態(tài)時(shí)就是緊跟在后面!而¥是運(yùn)行時(shí)的開始地址,二者是不同的。中正是通過判斷¥和¥是否相等來決定程序運(yùn)行時(shí)是否需要“搬遷”,這個(gè)
14、例子中,二者是不等的,就是說,“程序運(yùn)行時(shí)”不應(yīng)該在中的這個(gè)位置的后面,那么初始化程序就必須在未使用前將移到正確的位置,例子程序中則將移到了處。從而使得編譯連接時(shí)和相關(guān)的標(biāo)號值都正確。,¥,¥,¥,;,一旦被移動(dòng)到處,那么圖中的、和等段的符號值都是正確的了!在生成加載域也就是映象文件(文件)時(shí),是把緊接在后面,這并不是的實(shí)際地址,而僅僅是加載時(shí),也就是燒寫到時(shí)的代碼和數(shù)據(jù)的臨時(shí)地址。而程序真正開始運(yùn)行起來時(shí)也就是運(yùn)行時(shí)域,一切情況又都發(fā)生了變化,該到什么地方的,就應(yīng)該去什么地方,所以應(yīng)該拷到處,以保證連接時(shí)的符號值都是正確的。三系統(tǒng)的地址重映射其實(shí)如果真正懂了上面兩個(gè)原理,那么理解地址重映射就
15、很容易了,雖然他們之間沒有什么聯(lián)系,但是,很多人不能理解地址重映射就是因?yàn)楹陀诚笪募木幾g連接地址搞得一團(tuán)糊!地址重映射就是通過系統(tǒng)的存儲(chǔ)管理部件改變系統(tǒng)中各個(gè)存儲(chǔ)器的映射地址,在ARM學(xué)習(xí)報(bào)告001 杜云海 duyunhai 中,通過改變系統(tǒng)控制寄存器組來改變存儲(chǔ)器的映射地址。如果你對芯片的存儲(chǔ)管理部件還不是很熟的話,應(yīng)該先把芯片資料再看看。一般的開發(fā)板都是將連接到處,這樣上電復(fù)位時(shí)讀的第一條指令是的處的值。例子程序中程序在運(yùn)行時(shí)都沒有映射,在為了的的復(fù)制,特意初始化了和,具體設(shè)置如圖的加載域所示,為,從;為,從,其他系統(tǒng)控制寄存器則設(shè)置為(這個(gè)由設(shè)置)。;:;,;,;,;,;,;,;,;,;,;,;,;,地址重映射先來看看例子程序:;,;,;,;,;,;ARM學(xué)習(xí)報(bào)告0
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- DB31/T 639-2021電動(dòng)輪胎式集裝箱門式起重機(jī)能源消耗指標(biāo)和計(jì)算方法
- DB31/T 567-2011商業(yè)辦公樓宇用水定額及其計(jì)算方法
- DB31/T 329.25-2022重點(diǎn)單位重要部位安全技術(shù)防范系統(tǒng)要求第25部分:化工企業(yè)
- DB31/T 329.14-2019重點(diǎn)單位重要部位安全技術(shù)防范系統(tǒng)要求第14部分:燃?xì)庀到y(tǒng)
- DB31/T 305-2014孵化場生產(chǎn)技術(shù)規(guī)范
- DB31/T 1138-2019水鳥同步調(diào)查技術(shù)規(guī)范
- DB31/T 1058-2017燃?xì)庥镁垡蚁?PE)管道焊接接頭相控陣超聲檢測
- DB31/ 734-2020淀粉糖單位產(chǎn)品能源消耗限額
- 聚噻吩纖維單體合成與性能考核試卷
- 絹紡和絲織的環(huán)保生產(chǎn)考核試卷
- 2025年上海市高考語文9道模擬作文題:含范文+詳細(xì)解析+參考立意
- 護(hù)理學(xué)基礎(chǔ)試題庫+答案
- 重慶2020-2024年中考英語5年真題回-學(xué)生版-專題04 完成句子
- 2024工業(yè)互聯(lián)網(wǎng)邊緣計(jì)算邊緣網(wǎng)關(guān)技術(shù)要求及測試方法標(biāo)準(zhǔn)
- 學(xué)校特色課程實(shí)施方案
- 【MOOC】創(chuàng)新思維與創(chuàng)業(yè)實(shí)驗(yàn)-東南大學(xué) 中國大學(xué)慕課MOOC答案
- 企業(yè)環(huán)境信息披露評價(jià)研究的國內(nèi)外文獻(xiàn)綜述6400字
- 2024年秋兒童發(fā)展問題的咨詢與輔導(dǎo)終考期末大作業(yè)案例分析1-5答案
- 創(chuàng)新思維及設(shè)計(jì)方法學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 湖南省建筑工程消耗量標(biāo)準(zhǔn)裝飾定額
- 肺栓塞的診斷和治療 課件
評論
0/150
提交評論