一种在NandFlash存储器中直接建立只读文件系统的方法

文档序号:7615227阅读:369来源:国知局
专利名称:一种在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日
发明者赵玉峰 申请人:海信集团有限公司, 青岛海信移动通信技术股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1