arm映像檔案

2021-05-10 22:02:24 字數 2499 閱讀 8767

程式映像檔案的基本概念

(2009-02-04 16:30:01)

標籤:雜談

分類:arm

一、基本概念

什麼是arm的映像檔案,arm映像檔案其實就是可執行檔案,包括bin或hex兩種格式,可以直接燒到rom裡執行。

映像檔案一般由域組成,域最多由三個輸出段組成(ro,rw,zi)組成,輸出段又由輸入段組成。在scatterfile中可以為每乙個**或資料區在裝載和執行時指定不同的儲存區域位址,所謂域,指的就是整個bin映像檔案所處在的區域。

scatlerloading的儲存區塊可以分成二種型別:裝載域:當系統啟動或載入時應用程式的存放區。執行域:系統啟動後,應用程式進行執行和資料訪問的儲存器區域,系統在實時執行時可以有乙個或多個執行塊。映像中所有的**和資料都有乙個裝載位址和執行位址(二者可能相同也可能不同,視具體情況而定)。在系統啟動時,c函式庫中的__main初始化**會執行必要的複製及清零操作,使應用程式的相應**和資料段從裝載狀態轉入執行狀態。

我們輸入的**,一般有**部分和資料部分,這就是所謂的輸入段,經過編譯後就變成了bin檔案中ro段和rw段,還有所謂的zi段,這就是輸出段。對於載入域中的輸出段,一般來說ro段後面緊跟著rw段,rw段後面緊跟著zi段。在執行域中這些輸出段並不連續,但rw和zi一定是連著的。zi段和rw段中的資料其實可以是rw屬性。

二、基本語法

1.scatter檔案語法

scatter檔案是乙個簡單的文字檔案,包含一些簡單的語法。

rom 0x0800_0000 0x00e0_0000     ;定義載入域

................

...............

rom3 +0x0 0x00400000

rom4 +0x0 0x00400000

rom5 +0x0

................

................ }

每個塊由乙個頭標題開始定義,頭中至少包含塊的名字和起始位址,另外還有最大長度和其他一些屬性選項。塊定義的內容包括在緊接的一對花括號內,依賴於具體的系統情況。乙個載入塊必須至少含有乙個執行塊;實踐中通常有多個執行塊。乙個執行塊必須至少含有乙個**或資料段;這些通常來自原始檔或庫函式等的目標檔案;萬用字元號*可以匹配指定屬性項中所有沒有在檔案中定義的餘下部分。注釋部分使用分號作為開頭,到當前行的行尾為止。

三、系統分析

一般而言,乙個程式包括唯讀的**段和可讀寫的資料段。在arm的整合開發環境中,唯讀的**段和常量被稱作ro段(readonly);可讀寫的全域性變數和靜態變數被稱作rw段(readwrite);rw段中要被初始化為零的變數被稱為zi段(zeroinit)。

對於嵌入式系統而言,程式映象都是儲存在flash儲存器等一些非易失性器件中的,而在執行時,程式中的rw段必須重新裝載到可讀寫的ram中。這就涉及到程式的載入時域和執行時域。簡單來說,程式的載入時域就是指程式燒入flash中的狀態,執行時域是指程式執行時的狀態。對於比較簡單的情況,可以在ads整合開發環境的arm linker選項中指定ro base和rw base,告知聯結器ro和rw的連線基位址。對於複雜情況,如ro段被分成幾部分並對映到儲存空間的多個地方時,需要建立scatterfile文字檔案,通知聯結器把程式的某一部分連線在儲存器的某個位址空間。需要指出的是,scatterfile中的定義要按照系統重定向後的儲存器分布情況進行。在引導程式完成初始化的任務後,應該把主程式轉移到ram中去執行,以加快系統的執行速度。

下面我們來解析附件中的scatterfile.

首先,6223平台的專案使用的是norflashrom(16m)+sdram(4m)+internalram(48k),裝載域全部在 flashrom中,也就是整個bin的大小,最大不超過12m。而執行域則分散在flashrom,sdram和internalram中,其中 flashrom中的第乙個執行域是從位址0x08000000開始,最大為0x00400000,也就是4m,其中包括了bootarm.obj (c$$code,+first)等目標檔案,第二個執行域為從第乙個執行域的末尾開始,最大為0x00400000,也是4m,而第三四五個執行域為剩餘的所有norflash空間,在flashrom,sdram和internalram中沒有指定執行域的**段在此處執行。而外部ram,也就是 sdram中的執行域是從位址0x00008000開始到0x00400000的部分,共4m,包括了我們增加的第三方軟體在內的部分讀寫資料段,堆疊和將要被初始化為零的變數(也就是zi段)。內部ram,也就是internalram則從位址0x40000000開始,最大為0xc000,也就是 48k,裡面執行的是我們的3gp模組需要維護的一些資料段和一些bootloader等資料段。

當前專案軟體執行時會感覺比以前專案軟體執行速度要慢一些,此處不排除我們使用了gif格式的動畫代替bmp格式的帶來的解析的時間變長,但可以肯定的是,我們將3gp功能的一些資料段放到內部ram中執行,肯定會減少系統空閒記憶體的使用,使系統需要更多地使用外部ram,從而降低了系統執行的速度。

因此,我們可以適當地更改scatterfile,將一些不常使用的資料放到外部ram中執行,可以大大地提高軟體的速度,給使用者乙個更好的使用體驗。

ARM映像檔案

2010 03 22 13 53 41 分類 arm 字型大小訂閱 arm映像檔案 arm中的各種原始檔 包括彙編檔案,c語言程式及c 程式等 經過arm編譯器編譯後生成elf executable and linking format 格式的目標檔案。這些目標檔案和相應的c c 執行 時用到的庫經...

ARM映像檔案格式

學習ads工具編寫arm程式,整理一些關於檔案格式的說明。arm中的各種原始檔 包括彙編檔案,c語言程式及c 程式等 經過arm編譯器編譯後生成elf格式的目標檔案。這些目標檔案和相應的c c 執行時用到的庫經過arm聯結器處理後,生成elf格式的映像檔案,這種格式的elf格式的映像檔案是一種可執行...

pe檔案of映像檔案頭

typedef struct image file header image file header,pimage file header 結構體的第乙個成員說明cpu的型別。需要了解的話看win32 sdk的巨集定義。結構體的第三個成員使用的是格林尼治時間 gmt 計算的秒數。結構體最後乙個成員說...