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