天天看點

嵌入式系統可執行檔案格式

                                                         嵌入式系統可執行檔案格式

     在一個完好的硬體裝置中,必須要有相應的程式才能使整個系統運作起來,我們一般所說的程式,實際上就是存儲在硬體裝置中的一些可執行代碼。 在嵌入式作業系統中,執行代碼主要包括以下幾部分: 1、 嵌入式作業系統 2、 系統軟體 3、 應用軟體 通用計算機系統的應用軟體與作業系統可以分離的,也就說:我們可以單獨采購應用軟體與作業系統軟體,也可以根據不同的需要,在同一作業系統上安裝不同的應用軟體以實作不同的功能。在嵌入式系統中,其執行代碼大多數時候是與硬體緊密聯系在一起的,特定的功能使用不同的作業系統與不同的系統軟體與應用軟體,在其産品化以後,一般不能在做改變。而且所有這些可執行代碼一般都比較小,統一存儲于嵌入式儲存設備中,最常用的就是FLASH。 由于不同的開發環境與不同的硬體架構,存儲于嵌入式儲存設備中的可執行檔案格式也不盡相同,但它們基本上包含以下一些典型的特征: 可執行檔案的一般資訊,如:檔案大小、建立時間,檔案名,檔案權限等。 與硬體處理器架構相關的二進制代碼和資料。 符号表與符号重定位表。 調試器需要的調試資訊與一些下載下傳時需要的一些資訊。不同的嵌入式環境中,其組織可執行檔案的格式也不相同,主要有以下幾種: ELF檔案格式 S-record檔案格式 HEX檔案格式 bin檔案格式 1、ELF檔案格式(Executable and linking format) Executable and linking format(ELF)檔案是Linux系統 下的一種常用、可移植目标檔案(object file)格式,它有三種主要類型: 可重定位檔案(Relocatable File):包含适合于與其他目标檔案連結來建立可執行檔案或者共享目标檔案的代碼和資料。 可執行檔案(Executable File):包含适合于執行的一個程式,此檔案規定了exec() 如何建立一個程式的程序映像。 共享目标檔案(Shared Object File):包含可在兩種上下文中連結的代碼和資料。首先連結編輯器可以将它和其它可重定位檔案和共享目标檔案一起處理,生成另外一個目标檔案。其次,動态連結器(Dynamic Linker)可能将它與某個可執行檔案以及其它共享目标一起組合,建立程序映像。詳細資訊可以閱讀[參考2]。 2、S-record檔案格式 S-Record檔案遵循Motorola制定的格式規範,是一種标準的、可列印格式的檔案。S-Record檔案是通過對連結器生成的目标程式或資料進行編碼生成的,适用于在計算機平台間傳送,也可以在編輯後用于交叉平台間的傳送。S-Record檔案編碼簡單,可以通過IDE下載下傳,但無法線上實時調試。S-Record檔案是由多條記錄組成的,每條記錄都是由5個字段組成的ASCII字元串,格式如下圖所示。 l 記錄類型:由兩個字元組成,描述了該條記錄的可能類型(S0, S1, S2, S3, S5, S7, S8, or S9)。 l 資料長度:是對應于2 byte十六進制數的一對字元,表示該條記錄後續字元對的個數; l 位址:由4,6或者8個字元組成,也是由十六進制值翻譯得到的字元,給出資料字段将存放在存儲器中的位址; l 資料:由每2 byte十六進制值翻譯得到的成對的字元,大小為0-64,這些十六進制數值可能是存放在存儲器中的資料,或者是描述資訊; l 校驗和:它們所對應的十六進制數值是根據除記錄類型之外的其他字段字元成對累加之和求反所得; l 換行符:每條記錄都由換行符終止。針對不同的目标器件,可能每條記錄的結束符不盡相同,設計中用傳輸程式來提供一緻的換行符。 所有的S-Record檔案都是以類型為S0的記錄作為首條記錄,這條記錄在資料字段中給出檔案的資訊,包括路徑、版本号等,這些資訊是供閱讀的,将不被存放到存儲器中。S-Record檔案的中間記錄可能是類型為S1、S2或S3的記錄,其位址字段分别對應2、3、4 byte位址,因而主要差別在于尋址空間的不同。S-Record檔案以S7、S8或S9類型的記錄作為末條記錄,除了位址字段長度不同外,它們都給出了程式執行的起始位址,并都不含資料字段。詳細的資訊可以閱讀[參考1] 3、bin檔案格式 bin檔案就是直接的二進制檔案,内部沒有位址标記。一般用程式設計器燒寫時,從00開始,而如果下載下傳運作,則下載下傳到編譯時的位址即可。 4、HEX檔案格式 Intel HEX檔案是記錄文本行的ASCII文本檔案,在Intel HEX檔案中,每一行是一個HEX記錄,由十六進制數組成的機器碼或者資料常量。Intel HEX檔案經常被用于将程式或資料傳輸 存儲到ROM、EPROM。大多數程式設計器和模拟器使用Intel HEX檔案。 一個Intel HEX檔案可以包含任意多的十六進制記錄,每條記錄有五個域,下面是一個記錄的格式, :LLaaaatt[dd...]cc 每一組字母是獨立的一域,每一個字母是一個十六進制數字,每一域至少由兩個十六進制數字組成,下面是位元組的描述: :冒号:它是每一條Intel HEX記錄的開始。 LL是這條記錄的長度域,他表示資料(dd)的位元組數目。 aaaa是位址域:他表示資料的起始位址。 如果是資料記錄,這表示将要燒錄的這條記錄中的資料在EPROM/FLASH中的偏移位址,對于不支援擴充段位址和擴充線性位址的,如89C51,這就是此條記錄的起始位址。 tt這個域表示這條HEX記錄的類型,他有可能是下面這幾種類型: 00:資料記錄 01:檔案結束記錄 02:擴充段位址記錄 04:擴充線性位址記錄 dd是資料域:表示一個位元組的資料。一個記錄可能有多個資料位元組,位元組數目可以檢視LL域的說明。 cc是效驗和域:表示記錄的效驗和,計算方法是将本條記錄冒号開始的所有字母對(不包括本效驗字和冒号)所表示的十六進制數字都加起來,然後模除256得到的餘數,最後求出餘數的補碼即是本效驗位元組cc。 Intel HEX檔案由若幹個資料記錄組成,一個資料記錄以一個回車和一個換行結束,(回車為0x0d換行為0x0a)。 擴充線性位址記錄(HEX386) : 擴充線性位址記錄也可稱為32位位址記錄和HEX386記錄,這個紀錄包含高16(16-31位)位資料位址,這種擴充的線性記錄總是有兩個位元組資料。當一個擴充線性位址記錄被讀到後,擴充線性位址記錄的資料區域将被儲存并應用到後面從Intel HEX檔案中讀出的記錄,這個擴充線性記錄一直有效, 直到讀到下一個擴充線性記錄。 檔案結束記錄(EOF) : 一個Intel HEX檔案必須有一個檔案結束記錄,這個記錄的類型域必須是01,一個EOF記錄總是這樣: :00000001FF,其中:00是記錄中資料位元組的數目,0000這個位址對于EOF記錄來說無任何意義,01記錄類型是01(檔案結束記錄标示),FF是效驗和。計算如下01h + NOT(00h + 00h + 00h + 01h)。 5、 可執行檔案格式的差别: a) HEX檔案是包括位址資訊的,而BIN檔案格式隻包括了資料本身,在燒寫或下載下傳HEX檔案的時候,一般都不需要使用者指定位址,因為HEX檔案内部的資訊已經包括了位址。而燒寫BIN檔案的時候,使用者是一定需要指定位址資訊的。 b) BIN檔案格式 對二進制檔案而言,其實沒有”格式”。檔案隻是包括了純粹的二進制資料。 c) HEX檔案格式 HEX檔案都是由記錄(RECORD)組成的。在HEX檔案裡面,每一行代表一個記錄。記錄類型包括:記錄資料域,檔案結束域,擴充線性位址的記錄,擴充段位址的記錄。在上面的後2種記錄,都是用來提供位址資訊的。每次碰到這2個記錄的時候,都可以根據記錄計算出一個“基”位址。對于後面的資料記錄,計算位址的時候,都是以這些“基”位址為基礎的。 d) AXF是Arm特有的檔案格式,它除了包含bin檔案外,還額外包括了許多其他調試資訊。在下載下傳到目标闆的時候,燒入ROM還是bin檔案,額外的調試資訊會被去掉 一般來說,可以由elf檔案轉化為其它兩種檔案,hex也可以直接轉換為bin檔案,但是bin要轉化為hex檔案必須要給定一個基位址。而hex和bin不能轉化為elf檔案,因為elf的資訊量要大。另外還有一種ads的調試檔案axf,它可以用以下指令fromelf -nodebug xx.axf -bin xx.bin轉化為bin檔案。 參考: 1、 http://www.amelek.gda.pl/avr/uisp/srecord.htm 2、 Tool Interface Standard (TIS)-Executable and Linking Format (ELF) Specification version 1.2 本文來自CSDN部落格,轉載請标明出處:file:///E:/網頁資料/嵌入式系統可執行檔案格式%20-%20gogofly的專欄%20-%20CSDN部落格.mht

繼續閱讀