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