<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>
作者:刘洪涛,华清远见嵌入式学院金牌讲师,ARM公司授权ATC讲师。
JFFS2是Flash上应用最广的一个日志结构文件系统。它提供的垃圾回收机制,不需要马上对擦写越界的块进行擦写,而只需要将其设置一个标志,标明为脏块,当可用的块数不足时,垃圾回收机制才开始回收这些节点。同时,由于JFFS2基于日志结构,在意外掉电后仍然可以保持数据的完整性,而不会丢失数据。
本文阐述如何在nand flash上实现JFFS2根文件文件系统。实验环境是:FS2410开发平台及ubantu7.04主机环境。
由于使用的ubantu7.04的环境没有安装制作JFFS2文件系统镜像的工具mkfs.jffs2,所以首先在Linux系统中安装mkfs.jffs2工具,安装的过程如下:
1.下载MTD工具包
本处使用的是mtd-snapshot-20050519.tar.bz2:
farsight#tar –jxvf mtd-snapshot-20050519.tar.bz2
farsight#cd mtd
farsight#./configure
farsight#make
farsight#make install
如果系统中没有安装ZLIB库,那么首先安装ZLIB库。具体的安装过程如下:
farsight#tar –zxvf zlib-1.2.3.tar.gz
farsight#cd zlib-1.2.3
farsight#./configure
farsight#make
farsight#make install
完成此步骤后,系统中就有了mkfs.jffs2的工具。注意:这个工具不同于mkfs.ext2工具,它只能制作相应的JFFS2文件系统的镜像,而不具有进行格式化的功能,而mkfs.ext2具备这以上两种功能。然后用这个工具就可以制作JFFS2文件系统的镜像了。
2、制作JFFS2文件镜像
实验平台用到的nand flash 是K9F1208,在制作镜像过程添加的参数需要和它对应。
farsight#mkfs.jffs2 -r /source/rootfs -o rootfs.jffs2 -e 0x4000 --pad=0x800000 -n
这样就会生成一个8M大小的rootfs.jffs2的镜像,它也正是JFFS2文件系统的镜像,关于这个命令行里的选项的内容,可以用man a mkfs.jffs2命令来查看内容。
JFFS2 维护了几个链表来管理擦写块,根据擦写块上的内容,一个擦写块会在不同的链表上。具体来说,当一个擦写块上都是合法(valid)的节点时,它会在 clean_list 上;当一个擦写块包含至少一个过时(obsolete)的节点时,它会在 dirty_list 上;当一个擦写块被擦写完毕,并被写入 CLEANMARKER 节点后,它会在 free_list 上。而当你在挂载这个文件系统的时候,如果出现CLEANMARKER node found at 0x0042c000 has totlen 0xc != normal 0x0的警告的时候,可以加一个“-n”的选项,这个主要是由于针对Nand Flash不需要在每个擦除块的开始写入CLEANMARKER 节点。
3、设置内核启动参数
本处用的bootloader是U-BOOT.所以在U-BOOT的命令终端设置如下:
FS2410#setenv bootargs root=/dev/mtdblock/2 rootfstype=jffs2 rw console=ttySAC0,115200 init=/linuxrc mem=64M
4、配置内核支持JFFS2文件系统
File systems ---> Miscellaneous filesystems --->
<*>JournallingFlash File System v2 (JFFS2) support
[*]JFFS2write-bufferingsupport
[*]AdvancedcompressionoptionsforJFFS2
[*]JFFS2ZLIBcompressionsupport
[*]JFFS2RTIMEcompressionsupport
[*] JFFS2 RUBIN compression support
5、下载rootfs.jffs2镜像
下载到Nand Flash第二个分区。
FS2410#nand erase 200000 800000
FS2410#nand write.jffs2 300008000 200000 800000
这里说明下关于nand flash操作的几个常用命令的含义
nand write:向Nand Flash写入数据,如果NandFlash相应的区域有坏块,则直接报错。
nand write.jffs2:向Nand Flash写入数据,如果NandFlash相应的区域有坏块,可以跳过坏块。
nand read:读取Nand Flash相应区域的数据,如果NandFlash相应的区域有坏块,则直接报错。
nand read.jffs2s:读取Nand Flash相应区域的数据,如果NandFlash相应的区域有坏块,将对应坏块区域的缓冲填充0xff,然后跳过此坏块继续读取。
nand read.jffs2:读取Nand Flash相应区域的数据,如果NandFlash相应的区域有坏块,直接跳过坏块。
具体的参考代码参看U-BOOT源码:common/cmd_nand.c文件。
下载完JFFS2文件系统镜像后,需要把Linux内核NandFlash的驱动关于第二个分区的大小改为8M(和镜像一样大),否则会出现类似如下错误:
Freeing init memory: 124K
Warning: unable to open an initial console.
Argh. Special inode #171 with mode 0xa1ff had more than one node
Kernel panic: No init found. Try passing init= option to kernel.
Argh. Special inode #63 with mode 0xa1ff had more than one node
Returned error for crccheck of ino #63. Expect badness...
Argh. Special inode #67 with mode 0xa1ff had more than one node
Returned error for crccheck of ino #67. Expect badness...
Argh. Special inode #68 with mode 0xa1ff had more than one node
到此,一个JFFS2文件系统的镜像制作成功。可以启动系统并测试JFFS2的性能了
还有一种制作JFFS2文件系统镜像的方法,在制作镜像的参数中可以不加—pad选项,过程如下:
farsight#mkfs.jffs2 -r /source/rootfs -o rootfs.jffs2 -e 0x4000 -n
启动开发板烧写rootfs.jffs2镜像
FS2410#nand erase 200000 800000//(注意把整个存放文件系统的分区全部给擦除)。
FS2410#nand write.jffs2 30008000 200000 31a28c//(必须是rootfs.jffs2的实际大小。如果是你写成了4M,那么分区的其余部分JFFS2文件系统将无法识别)。
分享到:
相关推荐
在NAND Flash上实现JFFS2根文件系统是一个关键的操作,这涉及到嵌入式设备的数据存储和系统稳定性。JFFS2(Journaling Flash File System version 2)是一种广泛应用于闪存设备的日志文件系统,特别适用于NAND Flash...
在进行AT91SAM9G45开发板的系统移植过程中,如果仅仅完成了内核的移植而未制作好根文件系统并将其烧写进NAND FLASH,那么系统启动后会出现以下错误信息: ``` VFS:Mounted root (jffs2 filesystem). Freeing init ...
支持 NAND flash 的 JFFS2 文件系统已经发布,但是在测试过程中发现,在 nand flash 上挂接的 JFFS2 文件系统很不稳定,经常有 CRC 错误产生。特别是在进行写操作的时候,每次复位都会产生 CRC 错误,可以说支持 ...
在嵌入式Linux系统中,jffs2(Journaling Flash File System 2)文件系统扮演着至关重要的角色,它专为闪存设备设计,提供了日志功能以确保数据完整性。本文将详细探讨如何对jffs2格式的bin文件进行打包和解压,同时...
本文将更进一步,指导读者了解并实践如何在NAND Flash上制作根文件系统。 #### 2. 环境搭建 ##### 2.1 硬件环境 - **平台**: NUC972开发板 - **屏幕**: 建议选择4.3寸电阻屏 - **配件**: 摄像头、Wi-Fi模块(用于...
JFFS (Journalling Flash File System) 和 JFFS2 是专为嵌入式系统设计的日志型文件系统,它们主要用于基于闪存(Flash Memory)的嵌入式设备中。由于闪存具有读写次数限制的特点,为了最大化利用存储空间并提高数据...
在小型 NAND Flash 中,JFFS 文件系统可能是一个不错的选择,而在大型 NAND Flash 中,YAFFS 文件系统可能是一个更好的选择。 5. 结语 JFFS 和 YAFFS 文件系统都是嵌入式 Linux 平台上常用的文件系统,它们都有其...
完成编译和安装后,你就可以在目标系统上使用mtd-utils工具,例如创建jffs2文件系统、擦除NAND Flash分区,以及将根文件系统映像烧录到NAND Flash上。 总之,mtd-utils与jffs2的结合使用是嵌入式Linux系统开发中...
在Linux系统中,JFFS2(Journaling Flash File System Version 2)是为闪存设备量身定制的一种日志结构化文件系统,由瑞典的Axis Communications AB设计,旨在解决传统文件系统在闪存介质上运行时遇到的效率和寿命...
在嵌入式系统开发过程中,为了实现高效稳定的数据存储与读取功能,经常会用到JFFS2(Journaling Flash File System 2)这种专为闪存设计的文件系统。本文将详细介绍如何使用jffs2制作工具`mkfs.jffs2`来创建JFFS2...
在深入探讨如何在LINUX环境下使用NAND FLASH实现YAFFS文件系统之前,我们先来了解几个关键概念:MTD(Memory Technology Devices)系统、NAND FLASH、YAFFS文件系统以及它们之间的交互机制。 ### MTD系统组织 MTD...
### JFFS2文件系统在uC Linux上的实现 #### 一、引言 随着Linux操作系统在嵌入式领域的广泛...通过这种方式,可以有效地在uC Linux平台上构建和实现JFFS2文件系统,进而解决嵌入式系统中对Flash存储器支持的问题。
- 启动U-Boot环境,使用TFTP协议将`rootfs.jffs2`文件下载到RAM中,然后将其烧写到NAND Flash的指定分区上。假设NAND Flash的分区结构如下: ``` Creating 6 MTD partitions on "NAND 64MiB 3,3V 8-bit": 0x...
YAFFS与JFFS/JFFS2文件系统有所不同,后者最初是为NOR FLASH设计的,尽管也可以应用于NAND FLASH,但在性能和效率方面不如专门为NAND设计的YAFFS。 ##### 1.2 NAND与NOR闪存的区别 NAND和NOR闪存虽然都是非易失性...
- 随机读写性能上,jffs2由于采用了数据压缩技术,在读取时性能略低于其他两种文件系统;但在写入时,得益于其优化的磨损均衡算法,表现最好。 - 连续读写性能方面,ubifs凭借其高效的内存管理和先进的算法,性能...
例如,YAFFS和JFFS2是为NAND Flash而设计的文件系统。 烧录NAND Flash通常需要使用特定的编程器。ELNEC编程器是一种广泛使用的编程器品牌,它支持多种Flash芯片的烧录,包括NAND Flash。烧录过程中通常会涉及到...
### 嵌入式Linux的JFFS2文件...通过上述步骤,我们不仅能够成功地在S3C2410平台上移植JFFS2文件系统,还能够深入了解嵌入式系统中文件系统的工作原理和技术细节。这对于进一步优化系统性能和提升开发效率具有重要意义。
MTD提供了基础的读写和管理功能,而JFFS2在此基础上构建了一个适合于Flash特性的高级文件系统层。通过MTD,JFFS2可以有效地管理Flash的块级操作,包括擦除、写入和读取,同时实现其独特的日志功能和故障恢复机制。 ...
在实现NAND Flash文件系统时,通常包括以下步骤: 1. **硬件抽象层(HAL)**:提供与特定NAND Flash芯片交互的接口,处理I/O操作。 2. **坏块管理模块**:检测和标记坏块,确保数据不会被写入这些区域。 3. **磨损...