uClinux下Nor Flash的JFFS2文件系统构建

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

uClinux 下 Nor Flash 的 JFFS2 文件系统构建 摘要目前的嵌入式系统多使用作为主存,因此,如何有效管理上的数 据非常重要。 文章以 39160 芯片为例, 讨论了在上建立u的 2 文件系统的一般步骤, 从而为上的数据管理提供了理想的选择方式。 关键词u;;;2;文件系统嵌入式系统正随着Internet的 发展而在各个领域得到广泛的应用,作为嵌入式应用的核心,嵌入式Li nux以其自由软件特性正日益被人们看好。 Linux具有内核小、效率高、源代码开放等优点,还内涵了完整 的TCP/IP网络协议,因此非常适于嵌入式系统的应用。 而作为专门运行于没有MMU的微处理器的嵌入式操作系统,uCl inux更是得到广泛应用。 当前的嵌入式系统开发,需要方便灵活的使用Flash。 NOR和NAND是现在市场上两种主要的非易失闪存技术。 Intel于1988年首先开发出NORflash技术,彻底改 变了原先由EPROM和EEPROM一统天下的局面。 NOR的特点是芯片内执行 XIP eXe-cuteInPla
ce ,这样应用程序可以直接在flash闪存内运行,不必再把代码 读到系统RAM中。

NOR的传输效率很高,在1~4MB的小容量时具有很高的成本效 益,因此在嵌入式系统得到广泛的应用。 1JFFS2文件系统简介uClinux通常默认ROMFS作 为根文件系统,它相对于一般的EXT2文件系统具有节约空间的优点。 但是ROMFS是一种只读的文件系统,不支持动态擦写保存。 虽然对于需要动态保存的数据可以采用虚拟ram盘的方法来保存, 但当系统掉电后,ram盘的内容将全部丢失,而不能永久保存,因此需 要实现一个可读写的文件系统。 JFFS2文件系统便是一个很好的选择。 JFFS文件系统是瑞典Axis通信公司开发的一种基于Fla sh的日志文件系统,它在设计时充分考虑了Flash的读写特性和用 电池供电的嵌入式系统的特点,在这类系统中必需确保在读取文件时,如 果系统突然掉电,其文件的可靠性不受到影响。 对RedHat的DavidWoodhouse进行改进后,形成 了JFFS2。 主要改善了存取策略以提高FLASH的抗疲劳性,同时也优化了碎 片整理性能,增加了数据压缩功能。 需要注意的是,当文件系统已满或接近满时,JFFS2会大大放慢 运行速度。 这是因为垃圾收集的问题。 范文先生网收集整理JFFS2的底层驱动主要完成文件系统对F lash芯片的访问控制,如读、写、擦除操作。

在Linux中这部分功能是通过调用MTDmemorytec hnologydevice内存技术设备驱动实现的。 相对于常规块设备驱动程序,使用MTD驱动程序的主要优点在于M TD驱动程序是专门为基于闪存的设备所设计的,所以它们通常有更好的 支持、更好的管理和更好的基于扇区的擦除和读写操作的接口。 MTD相当于在硬件和上层之间提供了一个抽象的接口,可以把它理 解为FLASH的设备驱动程序,它主要向上提供两个接口MTD字符设 备和MTD块设备。 通过这两个接口,就可以象读写普通文件一样对FLASH设备进行 读写操作。 经过简单的配置后,MTD在系统启动以后可以自动识别支持CFI 或JEDEC接口的FLASH芯片,并自动采用适当的命令参数对FL ASH进行读写或擦除。 JFFS2在uClinux中有两种使用方式,一种是作为根文件 系统,另一种是作为普通文件系统在系统启动后被挂载。 考虑到实际应用中需要动态保存的数据并不多,且在Linux系统 目录树中,根目录和/usr等目录主要是读操作,只有少量的写操作, 但是大量的读写操作又发生在/var和/tmp目录这是因为在系统 运行过程中产生大量log文件和临时文件都放在这两个目录中,因此, 通常选用后一种方式。 根文件指的是Romfs、 var和/tmp, 目录采用Ramfs, 当系统断电后,该目录所有的数据都会丢失。

综上所述,通常在uClinux下采用的文件系统构成如图1所示。 对于本文来说,图中Romfs和Ramfs两个文件系统的实现是 很方便的,主要需要实现的是NorFlash的底层MTD驱动,下面 就以SST39VF160芯片为例来介绍MTD的驱动设计方法。 2 JFFS2底层MTD驱动设计本文采用的系统以三星公司的SN D-100为母板,CPU为ARM7TDMI芯片S3C4510B, 16M的SDRAM,NorFlash为SST39VF160,容量 为1M×16bit,速度为70ns,通过16位数据总线与CPU交 换数据,擦写次数典型值为10万次。 在\linux-2.4.x\drivers\mtd\maps 目录下,每一个文件都是一个具体的MTD原始设备的相关信息,包括该 MT D原始设备的起始物理地址、大小、分区情况、读写函数、初始化和 清除程序。 设计时,需要对SST39VF160编写相关的程序,假设为S3 C4510B.C。 则需要进行以下几点操作1定义SST39VF160在系统中的 起始地址、大小、总线宽度#defineWINDODDR0x100 0000|0x04000000//注意FLASH分区地址必须是 non-cacheble#defineWINDOWSIZE0x 200000#defineBUSWIDTH22定义SST39V

F160分区典型的内存分区应包括内核引导区、Linux内核区、应 用区。 其中内核引导区用来保存内核加载程序,Linux内核区存放的是 经过压缩的uClinux内核,应用区则用来保存用户的数据和应用程 序,该区设为我们要采用的JFFS2文件系统。 具体如下staticstructmtd _partitions 3c4510_ partitions []={{name″bootload er128K″, size0x20000,offset0x0000,m ask_flagsMTD_WRITEABLE//设置成只读区域},{n ame″uClinux_kernel832K″,size0xd000 0 , offset0x20000 name ″ jffs21088K 3定义
size0x110000,offset0xf0000 SST39VF160字节、半字、字的读写操作函数。
4初始化SST39VF160函数int _initinit _s 3c4510b。 该操作主要包括两个方面第一是调用domapprobe检测搜 索MTD设备。 通常检测方式有两种cfiprobe和jedecprobe,这 里采用后一种,该方法在jedec_probe.c文件中定义。 另外,jedecprobe.c中定义了各种jedecprob e类型芯片的信息,有些linux版本没有包含SST39VF160, 需要手动添加;而操作的第二方面则是调用add_mtd_partit

相关文档
最新文档