專利名稱:一種在Nand Flash存儲器中直接建立只讀文件系統的方法
技術領域:
本發明屬于移動通信終端技術領域,更具體地說是涉及到移動通信終端中的Nand_Flash存儲器中直接建立只讀文件系統的實現方法。
背景技術:
目前CDMA(碼分多址)制式手機的應用技術開發,是建立在ARM嵌入式處理器地體系基礎之上。CDMA手機的軟件是由實時內核直接控制運行的,并沒有操作系統的支持,所運行的軟件代碼需要能直接讀取,因此如果CDMA手機中的代碼存儲在Nand_Flash存儲器中時,則無法直接運行,必須需要從Nand_Flash存儲器拷貝到SDRAM同步動態隨機存儲器中再運行,其拷貝是完全拷貝,占用了大量的SDRAM空間,隨著現在百萬像素手機、MP3音樂手機的廣泛應用,需要SDRAM存儲器提供更大的容量空間,因此目前SDRAM存儲器難以滿足需要。
發明內容
本發明的目的,就在于克服目前手機中讀取軟件代碼時,需要把代碼從Nand_Flash存儲器拷貝到SDRAM,占用大量的SDRAM存儲器空間的缺點和不足,提供一種在Nand_Flash存儲器中直接建立只讀文件系統的方法,在現在的軟件結構中只讀的數據占用了大量空間,其中大多數的數據采用只讀文件系統的方式讀取,因此可以建立一個在Nand_Flash中的RomFs(Read_only_memory_File_system)只讀文件系統,RomFs讀取操作時直接從Nand_Flash中讀取,不需要拷貝到SDRAM中。本發明解決了SDRAM中的空間大量被占用的問題,RomFs原來在SDRAM中的映射空間可以被隨機分配使用,擴大了SDRAM的應用空間。
為了達到上述目的,本發明提供了在Nand_flash存儲器中直接建立只讀文件系統的方法,包括微處理器,SDRAM,Nand_flash存儲器,還包括下述步驟通過編譯系統的定位文件,把保存RomFs數據的文件在編譯時,放置到軟件系統各功能塊列表的最高地址位置;Nand_Flash存儲器初始化,進行壞塊檢測并保存記錄;計算RomFs數據在Nand中的存儲地址與SDRAM中的映射的運行地址的偏移量;計算Nand頁地址,通過Nand_Flash頁讀取函數,得到RomFs數據。
其中RomFs數據在Nand中位置與SDRAM中位置偏移共有三部分組成,第一部分是拷貝起始塊,第二部分是壞塊的偏移,第三部分是RomFs數據存儲地址與運行地址的差值。
對于壞塊的偏移可以采用順推法規避壞塊,拷貝起始塊與壞塊偏移在Nand_Flash存儲器初始化,壞塊檢測步驟時,記錄了拷貝起始塊和壞塊的序號并存在保存區中。
第三部分RomFs數據存儲地址與運行地址的差值可以由編譯系統中的存儲地址和運行地址這兩個值相減得到。
應用ARM編譯系統,RomFs數據存儲地址是RomFs在存儲中的起始地址,具體值是Load$$ROMFS_DATA$$Base。運行地址是RomFs在運行空間中的起始地址,具體值是Image$$ROMFS_DATA$$Base。
其中的讀取RomFs數據的步驟,首先根據RomFs數據在Nand中位置與SDRAM中位置偏移的結果計算Nand_Flash的頁地址,讀取此Nand頁,根據頁中的偏移量拷貝數據,得到RomFs數據,如果數據長度大于此頁中讀取的有效數據的長度,則頁地址加頁長度,指向下一頁,對比頁地址與壞塊記錄中壞塊地址,重新計算偏移量,繼續進行數據拷貝。
把SDRAM存儲器中的堆(Heap)空間起始設置為ZI數據區的結束位置,覆蓋RomFs的運行地址空間,增大了堆空間。可以在應用手機編輯高質量圖片和音樂的時候,申請大的SDRAM空間。
下面結合附圖和實施例對本發明作進一步的描述。
圖1為本發明的方法流程圖;圖2為本發明中的Nand_Flash存儲器壞塊檢測示意圖;圖3為本發明中的手機初始化流程圖;圖4為本發明中軟件系統在二進制文件中的存儲排列方式示意圖;圖5為本發明中軟件系統運行時在SDRAM中的排列方式示意圖;圖6為本發明在Nand_Flash中的RomFs讀取數據的流程圖;圖7為本發明的SDRAM中軟件系統各部分運行地址列表的示意圖。
具體實施例方式
如圖1所示,通過編譯系統的定位文件,把保存RomFs數據的文件在編譯時,放置到軟件系統各功能塊列表的最高地址位置,然后Nand_Flash存儲器初始化,進行壞塊檢測并保存記錄,計算RomFs數據在Nand中位置與SDRAM中位置的偏移量,最后通過Nand_Flash頁讀取函數,計算頁地址,得到RomFs數據。
由于嵌入式軟件需要在電腦中編譯,然后在嵌入式系統中運行,所以其運行模式是在電腦編譯時生成二進制文件,這個二進制文件是嵌入式系統的指令集合,然后通過專用工具下載到嵌入式系統的Flash閃存存儲器或SDRAM中執行。
首先對源代碼和ARM編譯系統的定位文件進行修改。把RomFs的數據放置到專用的保存此數據的文件中,在編譯時把此文件通過ARM編譯系統的定位文件(Scatter_Location_file)放置在到整個軟件系統的最后位置,也就是軟件系統各功能塊列表的最高地址的位置。
實施例1,對于只讀數據文件ui_data.c和ui_ringer_data.c,在編譯時,通過ARM編譯系統的定位文件,放在軟件系統各功能塊列表的最高地址的位置上。
____SOFT_0x0_0x2000000____{______.......................
______ROMFS_DATA+0______{________ui_data.o(+RO-DATA)________ui_ringer_data.o(+RO-DATA)________}____}可以看到,把只讀數據文件ui_data.c和ui_ringer_data.c放置在程序區ROMFS_DATA中,此程序區位于整個軟件系統的最高地址的位置。
由于程序不能在Nand_Flash存儲器中直接運行,手機程序初始化時執行Nand_Flash到SDRAM的拷貝程序,包括主程序區和可讀寫數據區,拷貝軟件系統數據至SDRAM中,在拷貝時需要檢測由Nand_Flash特性所決定的無法避免的壞塊,記錄所有壞塊信息。RomFs的數據保存在軟件系統的數據的最后位置,可以不拷貝RomFs只記錄壞塊信息,但是此段Nand區域的壞塊信息必須記錄。
如圖2所示,對Nand_Flash存儲器進行壞塊檢測,記錄壞塊的信息和程序拷貝的起始塊。
如圖3所示,手機初始化時,Nand_Flash和SDRAM存儲器均進行初始化,然后對Nand_Flash存儲器進行壞塊檢測,如果檢測該塊不是壞塊,則讀取數據并拷貝到SDRAM中,如果檢測該塊是壞塊,則記錄這個壞塊的序號并存在保存區內,數據讀取完畢,拷貝結束。
由于RomFs數據是以數組的形式存儲的,軟件系統執行時讀取數據時是以RomFs的運行地址為基礎的,而本發明中RomFs的操作程序讀取則是從Nand_Flash中讀取數據,這兩個位置之間存在偏移,讀取RomFs數據時,必須計算兩者之間的偏移。因此需要對RomFs數據在Nand中的存儲地址與SDRAM中的映射的運行地址的偏移進行計算。
位置偏移共有三部分組成,第一部分是拷貝起始塊,第二部分是壞塊的偏移,對于壞塊的偏移可以采用的是順推法規避壞塊,拷貝起始塊與壞塊偏移在壞塊檢測步驟時保存區中記錄了拷貝起始塊和壞塊的序號,因此可以得到這兩部分的數值。
第三部分是RomFs數據存儲地址與運行地址的差值。第三個值可以通過ARM編譯系統找到具體的地址,在所給出的的存儲地址,即RomFs在存儲中的起始地址,在實施例1中的通過ARM編譯系統找到存儲地址具體值是Load$$ROMFS_DATA$$Base。運行地址是RomFs在運行空間中的起始地址,在實施例1中運行地址的具體值是Image$$ROMFS_DATA$$Base。存儲地址和運行地址這兩個值相減得到可以得到第三部分中的差值。
如圖4,圖5所示,可以很明顯的看出存儲地址與運行地址的位置不同,圖4是二進制文件中的存儲排列方式,圖5是軟件系統運行時在SDRAM中的排列方式。而指針地址是按照運行地址來操作的,要得到存儲地址,就需要得到這兩個地址之間的差值。
上述的三個部分的值經過計算,就可以得到Nand中所保存的RomFs的數據的準確位置。
如圖6所示,RomFs讀取函數,其中的參數包含運行空間讀取位置,長度和數據返回指針。計算頁地址,采用Nand_Flash頁讀取函數,得到RomFs數據,直到判斷數據讀取完畢。
在Nand_Flash中的RomFs讀取數據。首先需要修改RomFs軟件中的讀取函數,其讀取數據的函數從直接拷貝SDRAM數據修改為Nand_Flash頁讀取函數。
根據RomFs數據在Nand中位置與SDRAM中位置偏移的結果計算Nand_Flash的頁地址,計算方式為
頁地址=(Nand中的實際存儲地址/Nand頁長度)*Nand頁長度由于是整數操作,這樣就可以得到頁地址,保留頁內偏移地址。
頁內偏移地址=Nand中的實際存儲地址-頁地址讀取此Nand頁,根據頁中的偏移量拷貝數據,得到RomFs數據。如果數據長度大于此頁中讀取的有效數據的長度,則頁地址加頁長度,指向下一頁,對比頁地址與壞塊記錄中壞塊地址,重新計算偏移量,繼續進行拷貝。
如圖7所示,是SDRAM中軟件系統各部分運行地址列表,包括程序區,RW數據區(初始值為非0的全局變量區),ZI數據區(初始值為0的全局變量區),RomFs數據區和剩余的RAM空間,其中剩余的空間即堆中的存儲空間的使用是隨機分配的,和軟件系統編譯時規定的運行地址無關。把堆(Heap)空間起始設置為ZI區的結束位置而不是整個程序結束位置,則可以覆蓋RomFs的運行地址空間,增大了SDRAM中的堆空間容量。
由于高像素拍照手機支持百萬像素的攝像,編輯圖片需要申請大空間,所以使用了此發明可以增大SDRAM的堆空間使用容量。
權利要求
1.一種在Nand_flash存儲器中直接建立只讀文件系統的方法,包括微處理器,SDRAM,Nand_flash存儲器,其特征在于包括下述步驟通過編譯系統的定位文件,把保存RomFs數據的文件在編譯時,放置到軟件系統各功能塊列表的最高地址位置;Nand_Flash存儲器初始化,進行壞塊檢測并保存記錄;計算RomFs數據在Nand中的存儲地址與SDRAM中的映射的運行地址的偏移量;計算Nand頁地址,通過Nand_Flash頁讀取函數,得到RomFs數據。
2.根據權利要求1所述的在Nand_flash存儲器中直接建立只讀文件系統的方法,其特征在于位置偏移共有三部分組成,第一部分是拷貝起始塊,第二部分是壞塊的偏移,第三部分是RomFs數據存儲地址與運行地址的差值。
3.根據權利要求1或2所述的在Nand_flash存儲器中直接建立只讀文件系統的方法,其特征在于對于壞塊的偏移可以采用順推法規避壞塊,拷貝起始塊與壞塊偏移在壞塊檢測步驟時,記錄了拷貝起始塊和壞塊的序號并存在保存區中。
4.根據權利要求1或2所述的在Nand_flash存儲器中直接建立只讀文件系統的方法,其特征在于第三部分RomFs數據存儲地址與運行地址的差值可以由編譯系統中的存儲地址和運行地址這兩個值相減得到。
5.根據權利要求4所述的在Nand_flash存儲器中直接建立只讀文件系統的方法,其特征在于ARM編譯系統中RomFs數據存儲地址具體值是Load$$ROMFS_DATA$$Base,運行地址是RomFs在運行空間中的起始地址,具體值是Image$$ROMFS_DATA$$Base。
6.根據權利要求1所述的在Nand_flash存儲器中直接建立只讀文件系統的方法,其特征在于首先根據RomFs數據在Nand中的存儲地址與SDRAM中的映射的運行地址偏移的結果,計算Nand_Flash的頁地址,應用Nand_Flash頁讀取函數,讀取此Nand頁,根據頁中的偏移量拷貝數據,得到RomFs數據,如果數據長度大于此頁中讀取的有效數據的長度,則頁地址加頁長度,指向下一頁,對比頁地址與壞塊記錄中壞塊地址,重新計算偏移量,繼續進行數據拷貝。
7.根據權利要求1所述的在Nand_flash存儲器中直接建立只讀文件系統的方法,其特征在于把SDRAM存儲器中堆(Heap)空間起始設置為ZI數據區的結束位置,覆蓋RomFs的運行地址空間。
全文摘要
本發明提供了在Nand flash存儲器中直接建立只讀文件系統的方法,包括微處理器,SDRAM,Nand flash存儲器,通過編譯系統的定位文件,把保存RomFs數據的文件在編譯時,放置到軟件系統各功能塊列表的最高地址位置;Nand Flash存儲器初始化,進行壞塊檢測并保存記錄;計算RomFs數據在Nand中位置與SDRAM中位置的偏移量;通過Nand Flash頁讀取函數,計算頁地址,得到RomFs數據,本發明解決了SDRAM中的空間大量被占用的問題,RomFs原來在SDRAM中的映射空間可以被隨機分配使用,擴大了SDRAM的應用空間。
文檔編號H04Q7/32GK1737759SQ200510044478
公開日2006年2月22日 申請日期2005年8月27日 優先權日2005年8月27日
發明者趙玉峰 申請人:海信集團有限公司, 青島海信移動通信技術股份有限公司