ARM Linux 的XIP還是挺好用的

    MergeFile下載(微軟SkyDrive):http://cid-a0a942ebd8c6c3b5.office.live.com/self.aspx/.Documents/MergeFiles.rar

     一般來說,現在的ARM Linux嵌入式系統都是將Image拷貝到SDRAM中進行運行的標準方式,尤其是像S3C6410和S3C2410這些支持NAND Flash的處理器,一般硬件設計直接把NOR Flash都省了,更是必須在SDRAM中運行。

      可是存在就是合理的,XIP作爲一項古老的技術,還是有一定的用處的,比如可以減少開機等待時間,也可能可以增加電池壽命,當然這個都是有條件的,在Intel的《creating  optimized XIP systems》elinux.org/upload/d/dd/CELF-XIP_Linux.pdf 這個pdf上有詳細的介紹。

      不過在我這個EVB板子上,最現實的原因就是RAM太少了,總共只有8M,而我編譯的內核就有2.5M左右,加上系統運行駐留的Init等進程已經動態庫,內存所剩無幾。

      打開XIP還是很簡單的,Linux 2.6.32.15在這上面做的還是相當好的,只需要打開內核編譯的XIP選項,填入內核在NOR Flash中的地址即可,比如我的0x80000,編譯以後就會在arch/arm/boot下面生成一個叫xipImage的文件,將這個文件燒錄到Flash中的對應位置就OK了。

      在我的系統中,由於要使用現有的EVB的bootloader,並且只燒錄在CP段,因此就必須自己做一個bootloader來引導Linux,系統啓動時先運行EVB自己的bootloader,然後跳到這個Linux Bootloader,copy文件系統(目前是RAMDISK),設置TAG,命令行,啓動的寄存器等,跳到Flash中相應位置開跑。

      爲了將Linux bootloader, xipImage和RAMDISK整到一個Image中以便使用ETS燒寫,在Cygwin下面寫了一個小程序mergefile來完成合並的工作。mergefile使用一個配置文件進行配置,配置文件類似於Windows的.ini 文件,

     [OUTPUT]
     #The number of file to be merged.Example, if FileCount=10 you should have sections INPUT0....INPUT10
     FileCount=3
     FileName=cp.rom
     #total size is 10M bytes.
     TotalSize=10485760
     [INPUT0]
     FileName=lboot.rom
     BaseAddress=0
     [INPUT1]
     FileName=xipImage
     BaseAddress=0x40000
     [INPUT2]
     FileName=mmufs.cramfs
     BaseAddress=0x3C0000

     其中OUTPUT段是控制輸出的,FileCount表示要合併的文件數量,比如例子中是3,就對應3個Input段,然後是輸出文件名和總的大小。後面輸入段包括每段的文件名和在輸出文件中的基址。

     解析這個配置文件使用的是MiniGUI裏面的讀取MiniGUI.cfg的函數GetIntValueFromEtcFile和GetValueFromEtcFile及其子函數。想想也是蠻有意思的,2003年第一次接觸MiniGUI的時候就把這兩個函數移植來讀取我們的工控設備的配置參數,7年過去了,再次用起了這兩個函數。不過那當時的Feyman還在創始人魏永明先生的家裏上班,而且還只支持帶MMU的Linux,現在都做了這麼多年了,還做得不錯,絕大部分操作系統都支持。因此堅持並精益求精的做一件事是多麼的重要!

      mergefile的處理過程是:先讀取配置文件,知道了輸入和輸出的信息,開一個輸出文件大小的outputbuffer(比如10M),然後把輸入文件通過mmap都map到內存中,用memcpy拷貝到outputbuffer中對應的基址開始的位置上,所有輸入文件都拷貝完畢後,把outputbuffer寫到輸出文件即可。這樣做的目的,一方面是輸出文件大小不會太大,現在計算機內存都1G以上,所以開個大buffer也無所謂了,而且mmap把文件映射成內存後,都是內存操作,代碼寫起來相當的快捷。

      由於MiniGui的配置參數是以Linux的標準0x0A結束行的,而Windows上是以0x0D0A結束的,因此MiniGUI那兩個函數的底層還要修改一下,以便同時支持在Linux和Windows上修改配置文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章