新聞中心

EEPW首頁 > 學習方法與實踐 > ARM基礎知識連載(6)

ARM基礎知識連載(6)

——
作者: 時間:2007-08-03 來源: 收藏

*****************************************************

映像文件

*****************************************************

1.ELF格式文件的結構


1.1映像文件組成部分


**一個映像文件有一個或多個域組成
**每個域包含一個或多個輸出段
**每個輸出段包含一個或多個輸入段
**各輸入段中包含了目標文件中的代碼和數(shù)據(jù)

輸入段中包含了四類內(nèi)容:代碼、已經(jīng)初始化的數(shù)據(jù)、未經(jīng)初始化的存儲區(qū)域、內(nèi)容初始化成0的存儲區(qū)域。每個輸入段有相應的屬性,可以為只讀的(RO)、可讀寫的(RW)以及初始化成0的(ZI)。連接器根據(jù)個輸入段的屬性將這些輸入段分組,再組成不同的輸出段及域。
一個輸出段中包含了一系列的具有相同的RO、RW和ZI屬性的輸入段。輸出段的屬性與其中包含的輸入段的屬性相同。在一個輸出段的內(nèi)部,各輸入段是按照一定的規(guī)則排序的,這將在1.3節(jié)油詳細地介紹。
一個域中包含1-3個輸出段,其中個輸出段的屬性各不相同。各輸出段的排列順序是由其屬性決定的。其中RO屬性的輸出段排在最前面,其次是RW屬性的輸出段,最后是ZI屬性的輸出段。一個域通常映射到一個物理存儲器上,如ROM或RAM。


1.2映像文件各組成部分的地址影射


ARM映像文件各組成部分在存儲系統(tǒng)中的地址有兩種:一種是映像文件位于存儲器中時(也就是該映像文件運行之前)的地址,稱之為加載地址;一種是映像文件運行時的地址,稱之為運行時地址。之所以有這兩種地址,是因為映像文件在運行時,其中的有些域是可以移動的新的存儲區(qū)域。比如,已經(jīng)初始化的RW屬性的數(shù)據(jù)所在的段運行之前可能保存系統(tǒng)的ROM中,在運行時,他被移動至RAM中。
通常,一個映像文件包含若干個域,各域又包含若干的輸出段。ARM連接器需要知道如下的信息,已決定如何生成相應的映像文件。
**分組信息          決定如何將個輸入段組織成相應的輸出段和域。
**定位信息          決定個域在存儲空間地址中的起始地址。
根據(jù)映像文件中地址映射的復雜程度,有兩種方法來告訴arm連接器這些相關信息。對于映像文件中地址映射關系比較簡單的情況,可以使用命令行選項;對于映像文件中地址映射關系比較復雜的情況,可以使用一個配置文件。

 

2.arm映像文件的入口點


2.1arm映像文件的入口點有兩種類型:一種是映像文件運行時的入口點,稱為初始入口點(initial entry point),另一種是普通入口點(entry point).
初始入口點是映像文件運行時的入口點,每個映像文件只有一個唯一的初始入口點,它保存在ELF頭文件中。如果映像文件是被操作系統(tǒng)加載的,操作系統(tǒng)是通過跳轉(zhuǎn)到該初始入口點處來加載該映像文件。
普通的入口點是在匯編中用ENTRY偽操作定義。他通常用于標志該段代碼是通過異常中斷處理程序進入的。這樣連接器刪除無用的段時不會將該段代碼刪除。一個映像文件中可以定義多個普通入口點。
應該注意的是,初始入口點可以使普通入口點,但也可以不是普通入口點。


2.2定義初始入口點


初始入口點必須滿足下面兩個條件:
**初始入口點必須位于映像文件的運行時域內(nèi)。
**飽含初始入口點的運行時域不能被覆蓋,他的加載地址和運行地址必須是相同的。
可以使用連接選項-entry address來指定映像文件的初始入口點。這時,address指定了映像文件的初始入口點的地址值。
對于地址0x0處為rom的嵌入式應用系統(tǒng),可以使用-entry 0x0來指定映像文件的初始入口點。這樣當系統(tǒng)復位后,自動跳轉(zhuǎn)到該入口開始執(zhí)行。
如果映像文件是被一個加載器加載的,該映像文件該映像文件必須包含一個初始化入口點。這種映像文件通常還包含了其他普通入口點,這些普通入口點一般為異常中斷處理程序的入口地址。
當用戶沒有指定-entry address時,連接器根據(jù)下面的規(guī)則決定映像文件的初始入口點。
**如果輸入的目標文件中只有一個普通入口點,該普通入口點被連接器當成映像文件的初始入口點。
**如果輸入的目標文件中沒有一個普通入口點,或者其中的普通入口點多于一個,則連接器生成的映像文件中不包含初始入口點,并產(chǎn)生警告信息。

2.3普通入口點的用法


普通入口點是在匯編中用ENTRY 偽操作定義。在嵌入式應用中,各異常中斷的處理程序入口使用普通入口點標示。這樣連接器在刪除無用段時不會將該段代碼刪除。
一個映像文件中可以定義多個普通入口點。沒有指定連接選項-entry addres時,如果輸入的目標文件中只有一個普通入口點,該入口點被連接器當成映像文件的初始入口點。

*****************************************************

ARM映像文件——2

*****************************************************

3輸入段的排序規(guī)則
連接器根據(jù)輸入段的屬性來組織這些輸入段,具有相同屬性的輸入段被放到域中一段連續(xù)的空間中,組成一個輸出段。在一個輸出段中,各輸入段的起始地址與

輸出段的起始地址和該輸出段中個輸入段的排列順序有關。
通常情況下,一個輸出段中個輸入段的排列順序由下面幾個因素決定的。用戶可以通過連接選項-first和-last來改變這些規(guī)則。
**輸入段的屬性。
**輸入段的名稱
**各輸入段在連接命令行的輸入段列表中的排列順序
按照輸入段的屬性,其排列順序如下所示:
**只讀的代碼段
**只讀的數(shù)據(jù)段
**可讀寫的代碼段
**其他已經(jīng)初始化的數(shù)據(jù)段
**未出世化的數(shù)據(jù)
對于具有相同屬性的輸入段,按照其名稱來排序。這是輸入段名稱是區(qū)分大小寫的,按照其ASCII碼順序進行排序。
對于具有相同屬性和名城的輸入段,按照其在輸入段列表中的順序進行排序。也就是說,幾十個輸入段的屬性和名稱保持不變,如果其在編譯時,各輸入段在輸

入段列表中的排列順序不同,生成的映像文件也將不同。
可以通過連接選項-first和-last來改變這些規(guī)則。如果連接時使用了配置文件,可以在配置文件中通過偽屬性FIRST和LAST達到相同的效果。
連接選項-first和-last不能改變根據(jù)輸入段進行排序的規(guī)則,它只能改變根據(jù)輸入段名稱和其在輸入列表中的順序的排序規(guī)則。也就是說,如果使用-first指定

一個輸入段,只有該輸入段所在的輸出段位于運行時域的開始位置時,該輸入段才能位于整個運行時域的開始位置。
各個輸入段排好順序后,在確定各個輸入段的起始地址之前,何以通過填充補丁是個輸入段滿足地址對齊的要求



關鍵詞: ARM

評論


相關推薦

技術專區(qū)

關閉