標籤:style io os ar 檔案 資料 sp on cti
低端控制器對執行效率要求很高,成本敏感,因而SoC內建SRAM是緊缺資源。代碼分塊管理就是為了充分利用記憶體,提高記憶體的複用效率而提出的一種設計方法。代碼分塊管理不僅涉及到硬體,同樣對作業系統和應用、驅動的設計都有要求,這些模組共同努力以使執行效率達到最高。
本節講述代碼分塊(Bank)管理思想下可執行檔的重構,即對程式編譯後的可執行檔進行重新組織、打包,以在載入階段獲得最高的執行效率,減少記憶體佔用。要使執行效率高,意味著可執行檔的格式儘可能簡單,解析執行檔案的流程簡單,相應地,解析過程代碼量少,即能夠減少記憶體的佔用。
keil產生的Hex或者Bin,其實也是keil對axf調試檔案進行抽取,重新打包產生。Hex和Bin可以通過燒寫器下載到flash。GCC工具鏈會產生可執行格式ELF,也可以離線對ELF格式內容進行抽取,重新打包生產Hex格式,並燒寫到flash中。本次講述的是可執行檔儲存在外存放裝置(card,nand flash,硬碟)中,在運行前由作業系統將其載入到記憶體再執行這種情況。
要對工具鏈產生的可執行檔(如ELF)進行重構,自然需要熟悉該執行檔案的格式,如ELF,裡面會包括檔案頭,SECTION節,符號段,程式碼片段,資料區段,還有調試資訊等等。而程式的運行往往只需要其中較少的段資訊。可執行檔就是要得到必要的段的資訊和資料,將不必要的通通刪除,並且根據代碼分塊管理的特點進行自訂格式的編製。這裡不再對ELF等標準執行檔案進行分析(以後可能另寫文章),只描述重構後的目標格式,看看什麼段資訊和資料是作業系統必要要知道和擷取的。
1. 檔案頭
1)格式標識符,如應用,驅動等
2)版本號碼
3)常駐程式碼片段在檔案中位移
4)常駐代碼長度
5)常駐程式碼片段在記憶體中的起始地址
6)常駐資料(.DATA)段在檔案中位移
7)常駐資料(.DATA)長度
8)常駐資料區段(.DATA)在記憶體中的起始地址
9).bss段長度
10).bss段在記憶體中的起始地址
11)程式入口地址ENTRY:第一行代碼的地址,不是main哦,是執行階段程式庫的一行代碼地址
12)reserved,對齊到扇區或者1024位元組。如果是驅動類型,則會增加兩個欄位:驅動入口地址和驅動退出地址。
2. 代碼塊頭
1)第一個Bank組的頭,按順序是第一個Bank的塊資訊、第二個Bank的塊資訊、。。。第N個Bank的塊資訊。一個Bank組最大含有N個Bank,不夠的填0.
2)第二個Bank組的頭,按順序是第一個Bank的塊資訊、第二個Bank的塊資訊、。。。第N個Bank的塊資訊。一個Bank組最大含有N個Bank,不夠的填0.
.....
有幾個Bank組由檔案頭的格式標識符來判定,由架構師事先約定。
每個Bank塊的塊資訊包括:bank塊資料(代碼和資料)在檔案中的位移,Bank長度,BAnk對應的記憶體位址。
3.常駐程式碼片段資料,對齊扇區
4.常駐資料區段資料,對齊扇區
5.第一組Bank的資料,對齊扇區,只記錄真實的Bank資料,一個Bank組不夠N個bank時不需補0.
6. 第二組Bank的資料,對齊扇區,只記錄真實的Bank資料,一個Bank組不夠N個bank時不需補0.
7. 最後一個組的Bank資料。
載入時解析該檔案頭,獲得常駐程式碼片段和資料區段的資訊,將兩者載入到記憶體,對Bss段清0,然後讀取到程式的ENTRY入口,跳到該地址執行即可,簡單高效!
Bank切換時,根據Bank組號和Bank號即快速定位到Bank的段資訊地址,讀出該Bank在檔案中的位移和Bank長度,進而讀取並載入到複用的記憶體空間。
SoC嵌入式軟體架構設計之五 :可執行程式的重構