ARM基礎(chǔ)知識(shí) -- ELF映像文件
1.ARM映像文件(axf和bin文件)的組成。
本文引用地址:http://2s4d.com/article/201611/322691.htmARM是32位處理器,地址位寬也是32位,因此其存儲(chǔ)器的映射范圍可以達(dá)到4GB空間。基本上對(duì)于ARM處理器,上電或復(fù)位時(shí)都會(huì)從0x00000000出開始執(zhí)行指令,因此必須保證映像文件的起始位置放置在0x00000000處,無(wú)論是采用NAND或NOR flash,這一點(diǎn)都無(wú)法改變。正確放置之后,處理器會(huì)獲取到正確的指令從而順序執(zhí)行。
ARM的映像文件(即可執(zhí)行文件)。生成的ARM映像文件有分為axf和bin兩種。bin文件時(shí)真正的可執(zhí)行文件,而axf文件是ARM特有的調(diào)試文件,除了包含了bin文件的內(nèi)容外還包含了很多其他的調(diào)試信息。在axf的文件頭和文件尾部都包含了可以用在ADW或AXF的load image的調(diào)試中。
2.ARM的映像文件的加載域和運(yùn)行域的不同
加載域映像文件。盡量簡(jiǎn)單地說(shuō),即那些可執(zhí)行文件例如bin文件,一般由域組成。而域由最多的三個(gè)輸出段組成即(RO、RW、ZI),RO是只讀的代碼段,RW是可讀寫的數(shù)據(jù)段和ZI未初始化的數(shù)據(jù)段。分析bin映像文件的具體內(nèi)容,也可以印證上面的內(nèi)容,基本上在bin的前半部分是RO的內(nèi)容而后半部分是RW的內(nèi)容,ZI由于是為初始化數(shù)據(jù),因此不需要保存在bin文件中。即bin文件時(shí)RO+RW的內(nèi)容的集合。而這三個(gè)輸出段又是可以由多個(gè)輸入段組成的,因?yàn)樵趨R編文件中,可以設(shè)置多個(gè)段名稱,只需要在鏈接的時(shí)候鏈接到相應(yīng)的位置即可,因此多個(gè)輸入段可以對(duì)應(yīng)到一個(gè)輸出段上。上面所說(shuō)的bin文件都是指的是加載域的情況,因?yàn)檫@都是可執(zhí)行文件被初始放置在flash中時(shí)各個(gè)部分的分布情況,即是加載到系統(tǒng)時(shí)的情況,所以叫加載域。但系統(tǒng)此時(shí)是并不能運(yùn)行的。
加載域的映像文件必須順利地過(guò)渡到運(yùn)行時(shí)域,這時(shí)系統(tǒng)才能夠正確地被執(zhí)行。因?yàn)橛袀€(gè)很明顯的一點(diǎn),程序一般都固化在flash中。而flash是只讀的,上面也說(shuō)到可讀寫的RW數(shù)據(jù)段的內(nèi)容是跟在RO段后面(即bin文件中),被放置在了flash上,RW段要求可讀寫,flash顯然不滿足要求,因此加載域必須過(guò)渡到運(yùn)行時(shí)域。最直觀的理解就是,我們必須把RW段的內(nèi)容轉(zhuǎn)移到可讀寫的SDRAM或SRAM上去,因此就引發(fā)了運(yùn)行域的問(wèn)題。
如何轉(zhuǎn)換,如何保證前面RO段的程序的內(nèi)容能夠正確地尋址到被轉(zhuǎn)移了的RW段的內(nèi)容。因?yàn)榇蟛糠謪R編程序的轉(zhuǎn)移指令都是絕對(duì)尋址的,比較少的偽指令能提供相對(duì)尋址,絕對(duì)尋址的效率顯然比較高。因此我們必須在代碼中就必須知道將來(lái)運(yùn)行時(shí)RW段被放置在了什么一個(gè)地方。在程序鏈接之后,所有的代碼中的地址都將固定。解決這樣的問(wèn)題也并不復(fù)雜,需要鏈接器確保RO段的運(yùn)行時(shí)起始地址和RW段的運(yùn)行時(shí)起始地址,這就是為什么我們要在ADS設(shè)置連接選項(xiàng)ro_base和rw_base的目的了。所有的RO段的地址都是基于ro_base指定的內(nèi)容,而所有代碼段的內(nèi)容也是基于rw_base上的,這樣程序在鏈接后就已經(jīng)確定了所有的相對(duì)地址,剩下的事就是將相應(yīng)的段的內(nèi)容從加載域的位置搬移到運(yùn)行時(shí)域的位置。
這樣的代碼搬移的工作如果是在調(diào)試狀態(tài)的話,一般調(diào)試器就會(huì)幫我們做好所有事情了,而如果是在非調(diào)試狀態(tài),就需要我們自己復(fù)制代碼段的搬移工作,有趣的是,不少ARM都支持從NAND flash中啟動(dòng),而NAND flash本身就是不能直接執(zhí)行的,需要將代碼搬移到SDRAM中,因此這里的運(yùn)行時(shí)域和加載域的區(qū)別被屏蔽掉了。一般我們做代碼搬移這樣的工作的時(shí)候,采用的跳轉(zhuǎn)地址都要用相對(duì)跳轉(zhuǎn)指令。這樣的好處是,無(wú)論用戶將程序加載到什么地址,代碼搬移指令都能正確地將程序從加載域轉(zhuǎn)換到運(yùn)行時(shí)域,從而保證程序順利執(zhí)行。
1.ELF格式文件的結(jié)構(gòu) 1.1 映像文件組成部分 1.2 ARM映像文件各組成部分的地址影射 2.arm映像文件的入口點(diǎn) 2.1 arm映像文件的入口點(diǎn)有兩種類型:一種是映像文件運(yùn)行時(shí)的入口點(diǎn),稱為初始入口點(diǎn)(initial entry point),另一種是普通入口點(diǎn)(entry point). 2.2定義初始入口點(diǎn) 2.3普通入口點(diǎn)的用法 3 輸入段的排序規(guī)則 ARM連接器介紹 |
評(píng)論