创建yaffs2文件系统

合集下载

Linux内核移植和yaffs2根文件系统制作

Linux内核移植和yaffs2根文件系统制作

Linux内核移植和yaffs2根文件系统制作V1.21.1Linux内核基础知识在动手进行Linux内核移植之前,非常有必要对Linux内核进行一定的了解,下面从Linux内核的版本和分类说起。

1.1.1 Linux版本Linux内核的版本号可以从源代码的顶层目录下的Makefile中看到,比如2.6.29.1内核的Makefile中:VERSION = 2PA TCHLEVEL = 6SUBLEVEL = 29EXTRAVERSION = .1其中的“VERSION”和“PA TCHLEVEL”组成主版本号,比如2.4、2.5、2.6等,稳定版本的德主版本号用偶数表示(比如2.6的内核),开发中的版本号用奇数表示(比如2.5),它是下一个稳定版本内核的前身。

“SUBLEVEL”称为次版本号,它不分奇偶,顺序递增,每隔1~2个月发布一个稳定版本。

“EXTRAVERSION”称为扩展版本号,它不分奇偶,顺序递增,每周发布几次扩展本版号。

1.1.2什么是标准内核按照资料上的习惯说法,标准内核(或称基础内核)就是指主要在/维护和获取的内核,实际上它也有平台属性的。

这些linux内核并不总是适用于所有linux支持的体系结构。

实际上,这些内核版本很多时候并不是为一些流行的嵌入式linux系统开发的,也很少运行于这些嵌入式linux系统上,这个站点上的内核首先确保的是在Intel X86体系结构上可以正常运行,它是基于X86处理器的内核,如对linux-2.4.18.tar.bz2的配置make menuconfig时就可以看到,Processor type and features--->中只有386、486、586/K5/5x86/6x86/6x86MX、Pentium-Classic、Pentium-MMX、Pentium-Pro/Celeron/Pentium-II、Pentium-III/Celeron(Coppermine)、Pentium-4、K6/K6-II/K6-III 、Athlon/Duron/K7 、Elan 、Crusoe、Winchip-C6 、Winchip-2 、Winchip-2A/Winchip-3 、CyrixIII/C3 选项,而没有类似Samsun 2410等其他芯片的选择。

深入理解yaffs2文件系统(一)

深入理解yaffs2文件系统(一)

深⼊理解yaffs2⽂件系统(⼀)深⼊理解yaffs2⽂件系统(⼀)1、Flash⽂件系统1.1、背景已经有多种flash⽂件系统(FFSs)或flash块驱动(在之上运⾏⼀个常规的FS),同时都有优点或缺点。

Flash存储器有⾮常多的限制,这⾥就不⼀⼀列举了。

已经有各种⽅法解决这些限制,以提供⼀个⽂件系统。

必须认识到,“flash”,包括NOR和NAND,各⾃有不同的限制。

很容易被专业术语“flash”误导,误以为⽤于NorFlash的⽅法也⽴即适⽤于NandFlash。

Nand块驱动⼀般采⽤FAT16作为⽂件系统,但不够健壮,也不够贴近Flash的特性。

这些块驱动通过⼀个“本地--物理”的映射层来仿真可写的、类似于磁盘扇区的块。

当使⽤FAT16时,这些⽂件系统⼯作的相当好,它们内存消耗⼩,代码尺⼨也很⼩。

但就像所有基于FAT 的系统⼀样,它们很容易损坏(如,丢失簇)。

其他的途径则是设计整个⽂件系统,不是基于块驱动,⽽且是flash友好的,这允许更多的余地来解决上述所提到的问题。

当前有两个linux⽂件系统能⾮常好的⽀持NorFLash,那就是JFFS以及它的升级版本JFFS2。

这两者都提供⽇志机制,⼤⼤的提升了健壮性,这也是嵌⼊式系统特别重要的⼀个特性。

不幸的是,它们在RAM消耗和启动时间⽅⾯都不是很好。

JFFS在flash中的每⼀个journalling⽇志节点,需要⼀个基于RAM的jffs_node结构,每⼀个节点为48字节。

JFFS2做了⼀个⼤改进,通过剪裁相关的结构体(jffs2_raw_node_ref)⽽减少到16字节。

即使如此,在512字节页⼤⼩128M的NandFlash,按平均节点⼤⼩来算,也需要250000字节约4M⼤⼩。

JFFS和JFFS2在启动时,需要扫描整个flash阵列来查找journaling节点,并决定⽂件结构。

由于NAND容量⼤、慢、连续访问、需要ECC校验,这些特性将导致不可接受的、很长的启动时间。

yaffs2文件系统实现原理分析

yaffs2文件系统实现原理分析

1 概述YAFFS (Yet Another Flash File System )文件系统是专门针对NAND flash 设计的嵌入式文件系统,目前有YAFFS 和Y AFFS2两个版本,两个版本的主要区别之一在于Y AFFS2 能够更好的支持大容量的NAND flash 芯片。

YAFFS 文件系统有些类似于JFFS/JFFS2文件系统,与之不同的是JFFS/JFFS2文件系统最初是针对NOR flash 的应用场合设计的,而NORflash 和NAND flash 本质上有较大的区别,尽管JFFS/JFFS2文件系统也能应用于NANDflash ,但由于它在内存占用和启动时间方面针对NOR 的特性做了一些取舍,所以YAFFS2对NAND flash 来说通常才是最优的选择方案。

2 相关概念分析YAFFS2之前,把NAND flash 相关概念介绍下:NAND flash 由块(block)组成,块又由页(page)构成,擦除时以块为单位,读写时以页为单位,页又包含数据区和空闲区(OOB,Out-Of-Band),而Page 在YAFFS2中被称为Chunk ,其中的数据区用来存放实际的数据,OOB 用来存放附加信息实现NAND flash 的管理。

以T8000 AXMPFUA 单板使用的NANDflash 为例,每块Block: 128 pages ,每页Page: (8K + 448) bytes ,数据区为8K ,OOB 为448bytes ,如图1所示:Plane :4096blocks128 pages(8K+448)bytes图1 NAND flash 物理结构3 数据结构struct yaffs_dev 是YAFFS2文件系统最核心的数据结构,表示Y AFFS2文件系统的超级块,它建立了整个文件系统的层次结构,并衔接VFS 层和MTD 层,与struct super_block 、struct mtd_info 的关系如图2所示:图2 yaffs_dev与super_block、mtd_info层次关系下面围绕struct yaffs_dev这个最核心的数据结构开始,分段介绍它的含义,进而引出其他重要的数据结构:■param:存储文件系统重要的一些参数,以及与MTD层的接口函数□inband_tags:标志位,默认为0,即采用OOB(out of band)方式存储tags,可以通过挂载时指定inband-tags选项改变默认值□total_bytes_per_chunk:每个chunk总的字节数□chunks_per_block:每个block总的chunk数□spare_bytes_per_chunk:每个chunk包含OOB块的字节数□start_block:第一个可以使用的block□end_block:最后一个可以使用的block□n_reserved_blocks:为GC保留的block阈值□n_caches:缓冲区的个数,YAFFS2为减少数据的碎片以及提高性能为每个文件的写入提供了cache□no_tags_ecc:标志位,默认为0,即tags中包括ECC纠错信息,可以通过内核配置改变默认值,CONFIG_YAFFS_DISABLE_TAGS_ECC□is_yaffs2:标志位,默认为0,即Y AFFS,在挂载的过程中会根据识别的mtd->writesize自动转换成YAFFS2□refresh_period:刷新周期,刷新目的主要找出最旧的处于YAFFS_BLOCK_STATE_FULL状态的block,供GC作为gc_block使用□skip_checkpt_rd:标志位,默认为0,支持读取checkpoint,提高挂载速度的一个功能可以通过挂载时指定挂载选项no-checkpoint-read、no-checkpoint修改默认值□skip_checkpt_wr:标志位,默认为0,支持写入checkpoint,提高挂载速度的一个功能可以通过挂载时指定挂载选项no-checkpoint-write、no-checkpoint修改默认值□write_chunk_tags_fn:函数指针,在挂载的文件系统的时候会被初始,NANDflash写入接口函数:param->write_chunk_tags_fn = nandmtd2_write_chunk_tags;□read_chunk_tags_fn:函数指针,在挂载的文件系统的时候会被初始,NANDflash读取接口函数:param->write_chunk_tags_fn = nandmtd2_write_chunk_tags;□erase_fn:函数指针,在挂载的文件系统的时候会被初始,NAND flash擦除block接口函数:param->erase_fn = nandmtd_erase_block;□wide_tnodes_disabled:标志位,默认值为0,采用动态位宽,通过内核配置修改可采用静态位宽CONFIG_YAFFS_DISABLE_WIDE_TNODES■os_context:指向yaffs_linux_context结构指针,该结构存储Y AFFS2运行环境,如下:□context_list:通过该字段加入到yaffs_context_list全局链表中□dev:指向Y AFFS2文件系统超级块的指针□super:指向VFS层超级块的指针□bg_thread:Y AFFS2后台垃圾回收线程的指针□bg_running:启动和停止垃圾回收线程的标志位,1:启动,0:停止□gross_lock:互斥锁,保护整个超级块关键字段的互斥访问,粒度比较大□spare_buffer:OOB块的缓冲区□search_contexts:通过该字段把所有Directory Search Context组成链表□yaffs_mtd_put_super:卸载文件系统时被调用来清理super_block□readdir_process:解决使用NFS死锁问题加入的□mount_id:每个NAND flash分区挂载YAFFS2都分配不同的ID号■driver_context:指向mtd_info结构指针,mtd_info是MTD子系统核心的数据结构,主要是对底层硬件驱动进行封装,这里不再介绍■data_bytes_per_chunk:每个chunk总的字节数,和前面提到的total_bytes_per_chunk一样■chunk_grp_bits :采用静态位宽时超过tnode_width宽度之后的位数,采用动态位宽值恒为0■chunk_grp_size:由chunk_grp_bits转化而来的大小■tnode_width:采用静态位宽默认是16,采用动态位宽是由整个NAND flash中chunk数目计算得到■tnode_mask:位宽的mask,主要用于快速获取chunk id号■tnode_size:YAFFS_NTNODES_LEVEL0节点所占用的内存大小,单位:byte■chunk_shift:主要用来计算logical chunk index以及logical chunk offset■chunk_div:作用同chunk_shift,主要用于chunk大小不是2次幂的情况■chunk_mask:作用同chunk_shift,组合起来计算logical chunk offset■is_mounted:标志位,文件系统挂载时被置位Checkpoint是为提高挂载速度而引入的功能,作用同JFFS2的EBS,以空间来换取时间,卸载时通过在NAND flash上保存文件系统超级块快照,挂载时获取快照信息可以快速还原系统的状态。

yaffs2

yaffs2
dev->allocationPage = 0;
}
函数有三个参数,dev是yaffs_Device结构的指针,yaffs2用这个结构来记录一个NAND器件的属性(如block和page的大小)和系统运行过程中的一些统计值(如器件中可用chunk的总数),还用这个结构维护着一组NAND操作函数(如读、写、删除)的指针。整个结构体比较大,我们会按情景的不同分别分析。useReserve表示是否使用保留空间。yaffs2文件系统并不会将所有的存储空间全部用于存储文件系统数据,而要空出部分block用于垃圾收集时使用。一般情况下这个参数都是0,只有在垃圾收集时需要分配存储空间的情况下将该参数置1。yaffs_BlockInfo是描述block属性的结构,主要由一些统计变量组成,比如该block内还剩多少空闲page等。我们同样在具体情景中再分析这个结构中的字段含义。
dev->allocationPage++;
dev->nFreeChunks--;
/* If the block is full set the state to full */
if (dev->allocationPage >= dev->nChunksPerBlock) {
bi->blockState = YAFFS_BLOCK_STATE_FULL;
internalStartBlock和internalEndBlock分别是yaffs2使用的block的起始序号和结束序号。也就是说yaffs2文件系统不一定要占据整个Flash,可以只占用其中的一部分。
dev->allocationBlockFinder记录着上次分配的块的序号。如果已经分配到系统尾部,就从头重新开始搜索可用块。

YAFFS2文件系统的加载过程

YAFFS2文件系统的加载过程

YAFFS2 在 VxWorks 下的移植实现YAFFS2与上下层的关系:第一步:yaffscfg2k.c更名为yaffslib.c第二步:YAFFS 向VxWorks I/O 系统集成实现,在yaffslib.c中实现首先在I/O 系统库的设备列表中创建一个新的系统设备,为用户提供操作对象。

创建之前,须向驱动表中注册文件系统的I/O 驱动入口地址。

这部分工作在yaffslib.c 中实现。

1)YAFFS 文件系统驱动注册实现:文件系统驱动注册的核心是调用iosDrvInstall()函数返回驱动索引号;STATUS yaffsLibInit( ){if(yaffsDrvNum != ERROR) return OK;//yaffsDrvNum 设备驱动的编号是全局变量yaffsDrvNum = iosDrvInstall((FUNCPTR) yaffscreat,(FUNCPTR) yaffsopen(FUNCPTR) yaffsRead(FUNCPTR) yaffsWrite(FUNCPTR) yaffsdelete(FUNCPTR) yaffsclose(FUNCPTR) yaffsIoctl //注册七个I/O 驱动函数指针,在设备(FUNCPTR) yaffsWrite, //读写时被系统调用(FUNCPTR) yaffsreaddir);return (yaffsDrvNum==ERROR?ERROR:OK);}2)设备创建编程实现:STATUS yaffsDevCreate(char *pDevName ) //参数为欲创建的设备卷标名{……iosDevAdd();……}YAFFS 设备描述符结构及其成员描述如下:typedef struct YAFFS_VOLUME_DESC{DEV_HDR devHdr; /*用于I/O 设备表中的设备头结构*/unsigned magic; /*魔数是用来标识文件系统的类型,表明是否是一个有效的文件系统。

yaffs2根文件系统的制作

yaffs2根文件系统的制作

Yaffs2文件系统移植到mini2440现在大部分开发板都可以支持yaffs2 文件系统,它是专门针对嵌入式设备,特别是使用nand flash作为存储器的嵌入式设备而创建的一种文件系统,早先的yaffs仅支持小页(512byte/page)的nand flash,使用yaffs2 就可以支持大页的nand flash。

所谓的根文件系统,就是创建各个目录,并且在里面创建各种文件,比如在/bin,/sbin/目录下存放各种可执行的程序,在/etc目录下存放配置文件,在/lib目录下存放库文件,下面就开始文件系统的移植。

一、准备工作1.Yaffs2源代码的获取在bbb:///node/346可以下载到最新的yaffs2 源代码,如果使用git工具,在命令行输入:就可以下载到yaffs2的源代码,到当前目录下。

2.下载Busybox-1.13.3可以从bbb:///downloads/下载Busybox-1.13.3。

3.下载Yaffs2的整理工具可以到友善之臂的网站下载,mkyaffs2image.tgz,其中解压出来有两个可执行的文件,一个是针对小页的,一个是针对NandFlash大页的,其名字为mkyaffs2image-128M,一开始在这里犯了错误,我的NandFlash是128MB的,可以按照网上用的是mkyaffs2image文件,所以老是出来假坏块的提示,仔细一分析,NandFlash不可能一下子出来这么多的坏块,而且我用他们公司提供的根文件系统却没有任何的问题,所以问题处在了整理Yaffs2的工具上面。

因为这两种大小NandFlash的ECC校验是不一样的,也就是spare区的大小是不一样的,造成了ECC校验出错。

4.链接库整理根文件系统时,要使用到链接库,这里直接使用友善之臂根文件系统中的链接库。

从网站下载root_qtopia.tgz。

使用lib目录下的链接库。

5.给内核打上YAffs2补丁然后进入yaffs2源代码目录执行:#cd yaffs2#./patch-ker.sh c /opt/mini2440/linux-2.6.33.3此时进入linux-2.6.32.2/fs目录,可以看到已经多了一个yaffs2目录。

yaffs2制作教程

yaffs2制作教程

Yaffs2根文件系统制作环境:交叉编译环境:4.3.3 (天嵌科技提供,存放路径/opt/EmbedSky/4.3.3)开发平台:TQ24401,编译busybox获取busybox源码busybox-1.17.2.tar (/downloads/)置于目录/opt/embed下#tar jxvf busybox-1.17.2.tar.bz2#cd busybox-1.17.2#vim Makefile将164行改为CROSS_COMPILE = arm-linux- 将190行改为ARCH = arm 保存推出进入配置菜单#make menuconfig 采用默认配置保存推出#make#make install在busybox-1.17.2的根目录下出现了一个_install目录在该目录下又有三个目录文件bin sbin usr 和一个链接文件 linuxrc 。

2,创建根文件系统必要的目录回到/opt/embed目录下创建根文件系统必要的目录#mkdir root_fs#cd root_fs将刚才生成的三个目录bin sbin usr和一个链接文件linuxrc考到目录root_fs下#cp -rf ../busybox-1.17.2/_install/* ./#mkdir dev etc home lib mnt opt proc root sys tmp var创建几个必要的二级目录#mkdir usr/lib usr/share#mkdir etc/rc.d#mkdir var/lib var/lock var/run var/tmp3,创建必要文件(1), 获取库文件 (我的交叉编译工具链放在目录 /opt/EmbedSky/下的)#cp -rf /opt/EmbedSky/4.3.3/arm-none-linux-gn?i/libc/armv4t/lib/* so* lib -a(2),将主机 etc 目录下的passwd、group、shadow文件拷贝到 root_fs/etc 目录下#cp -f /etc/passwd /etc/group /etc/shadow etc将目录/opt/embed/busybox-1.17.2/examples/bootfloppy/etc下的所有文件拷贝到root_fs/etc下。

yaffs2文件系统工具mkyaffs2image

yaffs2文件系统工具mkyaffs2image

yaffs2⽂件系统⼯具mkyaffs2imageyaffs2⽂件系统是针对nandflash的⽂件系统,其制作⼯具为mkyaffs2image。

⼀、差异不同nand容量,⼯具不⼀样。

⾸先使⽤的是mkyaffs2image,编译⽣成根⽂件系统的镜像之后,下载到板⼦上,启动的时候报错,错误代码这⾥没有上传。

问题出在⼯具使⽤的不正确,查看⼯具⽬录下,发现有mkyaffs2image-128M⼯具,于是在⽹上查阅了⾸先采⽤的mkyaffs2image和mkyaffs2image-128M的区别,发现这对不同的板载nand flash容量,使⽤不同的⼯具制作根⽂件系统。

查看了⾃⼰使⽤的友善之臂板⼦上使⽤的nand flash是256M的,于是果断使⽤mkyaffs2image-128M⼯具制作根⽂件系统。

因为mkyaffs2image-128M针对128M或者更⼤的容量。

⼆、编译If you want to use GIT directly from the command line then public read-only access is available, using the (bash) command:git clone git:///yaffs2mkyaffs2image是在yaffs⽂件系统的utils⽬录下,只把其中的chunkSize spareSize 与 pagesPerBlock⼏个变量,按照nand_flash中的改⼀下就可以⽤。

// Adjust these to match your NAND LAYOUT://#define chunkSize 8192//#define spareSize 232#define chunkSize 4096//#define spareSize 218#define spareSize 128#define pagesPerBlock 128三、使⽤1、验证是否成功可直接在终端下输⼊:mkyaffs2imagemkyaffs2image: image building tool for YAFFS2 built Jul 92009usage: mkyaffs2image dir image_file [convert]dir the directory tree to be convertedimage_file the output file to hold the image'convert' produce a big-endian image from a little-endian machine注意核对convert的⼤⼩端。

yaffs2分析(原)

yaffs2分析(原)

yaffs2分析(原)文件系统的重要作用就是对文件或者文件夹的数据进行相应的管理,无论是文件数据还是文件夹里面的内容数据在文件系统看来就是一个个元数据(metadata)。

文件系统就是实现这些元数据的相应管理。

由于yaffs2 是一个相对比较简单的文件系统,下面通过yaffs的启动过程看看yaffs文件元数据的组织。

由于Yaffs是基于nand flash 的,由于nand所特有的一些特性,所以yaffs就有了一些自身文件系统所特有的一些特性。

如文件的结构信息是保存在spare 里面的,无论是文件夹数据还是文件数据,都是保存到spare数据的。

typedef struct {unsigned sequenceNumber;unsigned objectId;unsigned chunkId;unsigned byteCount;} yaffs_PackedTags2TagsPart;保存在spare 里面的yaffs2结构如上。

在yaffs启动时候,如果checkpoint没有响应的保存掉电时的结构的话,就需要进行一下全盘的扫描,其中的扫描主要是在yaffs_scan里面完成的,文件系统结构的创建就是主要在这个scan的过程中实现的。

static int yaffs_Scan(yaffs_Device *dev){1 首先就是要对全盘的block 块进行相应的扫描,主要就是扫描出坏的块/* Scan all the blocks to determine their state */bi = dev->blockInfo;for (blk = dev->internalStartBlock; blk <= dev->internalEndBlock; blk++) {}2 对于坏的块进行相应的标记玩之后,就是逐个对block 里面每一个page进行扫描,并建立相应的结构/* For each chunk in each block that needs scanning....*/for (c = 0; !alloc_failed && c < dev->param.nChunksPerBlock &&state == YAFFS_BLOCK_STATE_NEEDS_SCANNING; c++) {if (!tags.chunkUsed) {如果是一个未被使用的page的话由系统进行回收。

NUC97XLinuxyaffs2根文件系统制作

NUC97XLinuxyaffs2根文件系统制作

NUC97XLinuxyaffs2根文件系统制作NUC97X Linux yaffs2 根文件系统制作ARM kernrl文件系统中只有一个根文件系统,根文件系统被加载后,还可以再挂载其它文件系统,互不影响。

比如可以在Nandflash,SPI, EMMC,SD,U盘等每个存储模块上挂载不同的文件系统。

每个存储部件又可以具体分为许多块,就像电脑里分成许多盘。

不同部件甚至不同的块也可以有不同的文件系统。

挂载根文件系统后,如果要继续在其它存储部件或不同的块上挂载其它文件系统,可以使用mount命令来实现。

不同的块要被文件系统识别,可以要么在kernel环境下,使用命令把它变成所需要的某种文件格式的块。

也可以使用工具把你要烧录的文件夹,其中可以为空文件做成文件系统可识别的镜像烧到存储区域。

Kernel中默认就有根文件系统,但该文件系统操作的区域为RAM 中,如创建或修改文件,掉电或复位后文件和数据即丢失。

因此要制作能挂载在flash等存储部件的根文件系统,指定具体存储部件和存储位置,以便在ARM平台上运行的kernel能识别系统文件,同事能够保存和同步文件和数据。

制作根文件系统是制作ARM平台的文件系统,而不是制作PC端linux平台的根文件系统。

根文件系统制作过程,参考:Linux BSP\nuc970bsp-release-20161108\Documents\ChineseNUC970 Linux 快速入门.pdf 3.8章节,5.3.1 基本系統設置章节,5.3.4 文件系統設置章节。

開機命令設置–以RAM為根文件系統的設定開機命令設置–以SPI Flash JFFS2文件系統為根文件系統的設定開機命令設置–以NAND Flash YAFFS2文件系統為根文件系統的設定開機命令設置–以NAND Flash UBIFS文件系統為根文件系統的設定開機命令設置–以NFS文件系統為根文件系統的設定開機命令設置–以NAND Flash YAFFS2文件系統為根文件系統的設定介绍一.1.NAND flash的设置使能MTD 的“Caching block device access to MTD devices Device drivers”驅動中的基本設置如果需要由U-boot環境變數傳入就必須將”Command line partition table parsing”選上, 否則會使用驅動程式裡的默認配置, 这里要把该项禁止。

YAFFS2文件系统

YAFFS2文件系统

1 Yaffs文件系统结构1.1 简介1.1.1应用场合Yaffs(Yet Another Flash File System)文件系统是专门针对NAND闪存设计的嵌入式文件系统,目前有YAFFS和YAFFS2两个版本,两个版本的主要区别之一在于YAFFS2能够更好的支持大容量的NAND FLASH芯片。

Yaffs文件系统有些类似于JFFS/JFFS2文件系统,与之不同的是JFFS1/2文件系统最初是针对NOR FLASH的应用场合设计的,而NOR FLASH和NAND FLASH本质上有较大的区别,所以尽管JFFS1/2 文件系统也能应用于NAND FLASH,但由于它在内存占用和启动时间方面针对NOR的特性做了一些取舍,所以对NAND来说通常并不是最优的方案。

1.1.2NOR和NAND的比较基本上NOR比较适合存储程序代码,其容量一般较小(比如小于32MB),价格较高,而NAND容量可达1GB以上,价格也相对便宜,适合存储数据。

一般来说,128MB以下容量NAND FLASH 芯片的一页大小为528字节,用来存放数据,另外每一页还有16字节的备用空间(SpareData,OOB),用来存储ECC校验/坏块标志等信息,再由若干页组成一个块,通常一块为32页16K。

与NOR相比,NAND不是完全可靠的,每块芯片出厂时都有一定比例的坏块存在,对数据的存取不是使用地址映射而是通过寄存器的操作,串行存取数据。

1.2 Yaffs文件系统数据在NAND上的存储方式Yaffs对文件系统上的所有内容(比如正常文件,目录,链接,设备文件等等)都统一当作文件来处理,每个文件都有一个页面专门存放文件头,文件头保存了文件的模式、所有者id、组id、长度、文件名、Parent Object ID等信息。

因为需要在一页内放下这些内容,所以对文件名的长度,符号链接对象的路径名等长度都有限制。

前面说到对于NAND FLASH上的每一页数据,都有额外的空间用来存储附加信息,通常NAND驱动只使用了这些空间的一部分,Yaffs正是利用了这部分空间中剩余的部分来存储文件系统相关的内容。

在S3C2410上移植yaffs2文件系统

在S3C2410上移植yaffs2文件系统

在S3C2410上移植yaffs2文件系统在S3C2410上移植yaffs2文件系统当然如果你的NAND FLASH只是512+16B的,可以只移植yaffs,因为即使你移植了yaffs2,它也会自动选择挂载yaffs1的。

#cd/public#tar zxf yaffs2.tar.gz则/public/yaff2/目录之下即是yaffs2的源码。

(2)在要移植的内核目录下建立yaffs2文件夹,并将需要的文件拷贝过来:#cd/public/linux-2.6.11.7-2410/#cd fs#mkdir yaffs2#cd yaffs2#cp/public/yaffs2/*.h.#cp/public/yaffs2/*.c.#cp/public/yaffs2/Makefile-kernel Makefile#cp/public/yaffs2/Kconfig.(3)修改/public/linux-2.6.11.7-2410/fs/Makefile和Kconfig文件。

#cd/public/linux-2.6.11.7-2410/fs/#vi Makefile(将下面一行添加到Makefile中)obj-$(CONFIG_YAFFS_FS)+=yaffs2/#vi Kconfig(将下面一行添加到Kconfig中)source&quot;fs/yaffs2/Kconfig(4)cd/public/linux-2.6.11.7-2410/make menuconfig在编译内核时选择:&lt;*&gt;YAFFS2file system support&lt;*&gt;512byte/page devices&lt;*&gt;Lets Yaffs do its own ECC&lt;*&gt;2048byte(or larger)/page devices&lt;*&gt;Autoselect yaffs2format&lt;*&gt;Disable lazy loading&lt;*&gt;Turn off wide tnodes&lt;*&gt;Turn off debug chunk erase check(5)编译内核make zImage看网上有人编译过程中出现了问题,我没有碰到任何问题,很顺利。

深入理解yaffs2文件系统(一)

深入理解yaffs2文件系统(一)

深入理解yaffs2文件系统(一)1、Flash文件系统1.1、背景已经有多种flash文件系统(FFSs)或flash块驱动(在之上运行一个常规的FS),同时都有优点或缺点。

Flash存储器有非常多的限制,这里就不一一列举了。

已经有各种方法解决这些限制,以提供一个文件系统。

必须认识到,“flash”,包括NOR和NAND,各自有不同的限制。

很容易被专业术语“flash”误导,误以为用于NorFlash的方法也立即适用于NandFlash。

Nand块驱动一般采用FAT16作为文件系统,但不够健壮,也不够贴近Flash的特性。

这些块驱动通过一个“本地--物理”的映射层来仿真可写的、类似于磁盘扇区的块。

当使用FAT16时,这些文件系统工作的相当好,它们内存消耗小,代码尺寸也很小。

但就像所有基于FAT 的系统一样,它们很容易损坏(如,丢失簇)。

其他的途径则是设计整个文件系统,不是基于块驱动,而且是flash友好的,这允许更多的余地来解决上述所提到的问题。

当前有两个linux文件系统能非常好的支持NorFLash,那就是JFFS以及它的升级版本JFFS2。

这两者都提供日志机制,大大的提升了健壮性,这也是嵌入式系统特别重要的一个特性。

不幸的是,它们在RAM消耗和启动时间方面都不是很好。

JFFS在flash中的每一个journalling日志节点,需要一个基于RAM的jffs_node结构,每一个节点为48字节。

JFFS2做了一个大改进,通过剪裁相关的结构体(jffs2_raw_node_ref)而减少到16字节。

即使如此,在512字节页大小128M的NandFlash,按平均节点大小来算,也需要250000字节约4M大小。

JFFS和JFFS2在启动时,需要扫描整个flash阵列来查找journaling节点,并决定文件结构。

由于NAND容量大、慢、连续访问、需要ECC校验,这些特性将导致不可接受的、很长的启动时间。

yaffs2 结构 -回复

yaffs2 结构 -回复

yaffs2 结构-回复YAFFS2 结构YAFFS2(Yet Another Flash File System 2)是一种用于嵌入式系统的文件系统,特别适用于闪存设备。

它的灵感来自于早期的YAFFS文件系统,但在架构和功能上有所改进。

YAFFS2提供了高效的数据存储和管理方式,使闪存设备在读写操作方面更加稳定和可靠。

YAFFS2的主要结构包括:块(Block)、页(Page)、幸存页(Spare Page)和节点(Node)。

首先,让我们从块开始。

块是YAFFS2中最小的存储单元,它由连续的页组成。

每个块的大小通常为128KB或256KB。

闪存设备的数据存储是以块为单位进行的,这意味着当我们需要存储一个文件或一个数据块时,实际上是将其存储到一个或多个连续的块中。

在每个块中,数据被分为多个页。

每个页的大小通常为2KB或4KB。

这样的设计使得YAFFS2能够更高效地进行读写操作,因为闪存设备的读写速度是以页为单位的。

幸存页是指在每个块中用于存储元数据的页。

元数据包括节点、标志位、CRC等信息。

幸存页的存在使得YAFFS2能够更好地管理闪存设备的使用情况,并使得数据的读写更加可靠。

最后,我们来看一下节点。

节点对于YAFFS2来说非常重要,它是文件系统中的基本单位。

每个节点对应着一个文件或目录。

节点存储了文件的元数据,如文件名、文件大小、文件权限等。

除此之外,节点还存储了指向文件数据在闪存设备上位置的指针。

通过以上的结构,YAFFS2实现了对闪存设备的高效管理和读写。

当我们在闪存设备上创建一个文件时,YAFFS2会为该文件创建一个对应的节点,并将其相关信息存储在该节点中。

当我们写入数据时,YAFFS2将数据分为页,并将这些页存储在连续的块中。

为了保证数据的完整性,YAFFS2还会计算并存储CRC等校验信息。

在读取数据时,YAFFS2会通过节点找到数据的位置,并将其读取到应用程序中。

此外,YAFFS2还具备一些高级功能,如快照(Snapshot)和压缩(Compression)。

yaffs2文件系统实现原理分析_带书签

yaffs2文件系统实现原理分析_带书签

1 概述YAFFS (Yet Another Flash File System )文件系统是专门针对NAND flash 设计的嵌入式文件系统,目前有YAFFS 和Y AFFS2两个版本,两个版本的主要区别之一在于Y AFFS2 能够更好的支持大容量的NAND flash 芯片。

YAFFS 文件系统有些类似于JFFS/JFFS2文件系统,与之不同的是JFFS/JFFS2文件系统最初是针对NOR flash 的应用场合设计的,而NORflash 和NAND flash 本质上有较大的区别,尽管JFFS/JFFS2文件系统也能应用于NANDflash ,但由于它在内存占用和启动时间方面针对NOR 的特性做了一些取舍,所以YAFFS2对NAND flash 来说通常才是最优的选择方案。

2 相关概念分析YAFFS2之前,把NAND flash 相关概念介绍下:NAND flash 由块(block)组成,块又由页(page)构成,擦除时以块为单位,读写时以页为单位,页又包含数据区和空闲区(OOB,Out-Of-Band),而Page 在YAFFS2中被称为Chunk ,其中的数据区用来存放实际的数据,OOB 用来存放附加信息实现NAND flash 的管理。

以T8000 AXMPFUA 单板使用的NANDflash 为例,每块Block: 128 pages ,每页Page: (8K + 448) bytes ,数据区为8K ,OOB 为448bytes ,如图1所示:Plane :4096blocks128 pages(8K+448)bytes图1 NAND flash 物理结构3 数据结构struct yaffs_dev 是YAFFS2文件系统最核心的数据结构,表示Y AFFS2文件系统的超级块,它建立了整个文件系统的层次结构,并衔接VFS 层和MTD 层,与struct super_block 、struct mtd_info 的关系如图2所示:图2 yaffs_dev与super_block、mtd_info层次关系下面围绕struct yaffs_dev这个最核心的数据结构开始,分段介绍它的含义,进而引出其他重要的数据结构:■param:存储文件系统重要的一些参数,以及与MTD层的接口函数□inband_tags:标志位,默认为0,即采用OOB(out of band)方式存储tags,可以通过挂载时指定inband-tags选项改变默认值□total_bytes_per_chunk:每个chunk总的字节数□chunks_per_block:每个block总的chunk数□spare_bytes_per_chunk:每个chunk包含OOB块的字节数□start_block:第一个可以使用的block□end_block:最后一个可以使用的block□n_reserved_blocks:为GC保留的block阈值□n_caches:缓冲区的个数,YAFFS2为减少数据的碎片以及提高性能为每个文件的写入提供了cache□no_tags_ecc:标志位,默认为0,即tags中包括ECC纠错信息,可以通过内核配置改变默认值,CONFIG_YAFFS_DISABLE_TAGS_ECC□is_yaffs2:标志位,默认为0,即Y AFFS,在挂载的过程中会根据识别的mtd->writesize自动转换成YAFFS2□refresh_period:刷新周期,刷新目的主要找出最旧的处于YAFFS_BLOCK_STATE_FULL状态的block,供GC作为gc_block使用□skip_checkpt_rd:标志位,默认为0,支持读取checkpoint,提高挂载速度的一个功能可以通过挂载时指定挂载选项no-checkpoint-read、no-checkpoint修改默认值□skip_checkpt_wr:标志位,默认为0,支持写入checkpoint,提高挂载速度的一个功能可以通过挂载时指定挂载选项no-checkpoint-write、no-checkpoint修改默认值□write_chunk_tags_fn:函数指针,在挂载的文件系统的时候会被初始,NANDflash写入接口函数:param->write_chunk_tags_fn = nandmtd2_write_chunk_tags;□read_chunk_tags_fn:函数指针,在挂载的文件系统的时候会被初始,NANDflash读取接口函数:param->write_chunk_tags_fn = nandmtd2_write_chunk_tags;□erase_fn:函数指针,在挂载的文件系统的时候会被初始,NAND flash擦除block接口函数:param->erase_fn = nandmtd_erase_block;□wide_tnodes_disabled:标志位,默认值为0,采用动态位宽,通过内核配置修改可采用静态位宽CONFIG_YAFFS_DISABLE_WIDE_TNODES■os_context:指向yaffs_linux_context结构指针,该结构存储Y AFFS2运行环境,如下:□context_list:通过该字段加入到yaffs_context_list全局链表中□dev:指向Y AFFS2文件系统超级块的指针□super:指向VFS层超级块的指针□bg_thread:Y AFFS2后台垃圾回收线程的指针□bg_running:启动和停止垃圾回收线程的标志位,1:启动,0:停止□gross_lock:互斥锁,保护整个超级块关键字段的互斥访问,粒度比较大□spare_buffer:OOB块的缓冲区□search_contexts:通过该字段把所有Directory Search Context组成链表□yaffs_mtd_put_super:卸载文件系统时被调用来清理super_block□readdir_process:解决使用NFS死锁问题加入的□mount_id:每个NAND flash分区挂载YAFFS2都分配不同的ID号■driver_context:指向mtd_info结构指针,mtd_info是MTD子系统核心的数据结构,主要是对底层硬件驱动进行封装,这里不再介绍■data_bytes_per_chunk:每个chunk总的字节数,和前面提到的total_bytes_per_chunk一样■chunk_grp_bits :采用静态位宽时超过tnode_width宽度之后的位数,采用动态位宽值恒为0■chunk_grp_size:由chunk_grp_bits转化而来的大小■tnode_width:采用静态位宽默认是16,采用动态位宽是由整个NAND flash中chunk数目计算得到■tnode_mask:位宽的mask,主要用于快速获取chunk id号■tnode_size:YAFFS_NTNODES_LEVEL0节点所占用的内存大小,单位:byte■chunk_shift:主要用来计算logical chunk index以及logical chunk offset■chunk_div:作用同chunk_shift,主要用于chunk大小不是2次幂的情况■chunk_mask:作用同chunk_shift,组合起来计算logical chunk offset■is_mounted:标志位,文件系统挂载时被置位Checkpoint是为提高挂载速度而引入的功能,作用同JFFS2的EBS,以空间来换取时间,卸载时通过在NAND flash上保存文件系统超级块快照,挂载时获取快照信息可以快速还原系统的状态。

在Linux中实现大容量 NAND Flash的YAFFS2文件系统.

在Linux中实现大容量 NAND Flash的YAFFS2文件系统.

在Linux中实现大容量 NAND Flash的YAFFS2文件系统作者:展中华杜刚分类:自动化/计算机技术上传者:ZCOM网友摘要分析了嵌入式环境中YAFFS/YAFFS2文件系统的优点,提出YAFFS2不仅支持小容量的NAND flash,对大容量NAND flash更具有优势。

并介绍了YAFFS/YAFFS2文件系统结构。

着重将YAFFS2文件系统在嵌入式Linux系统中的实现过程包括配置、编译以及测试整个完整过程作了详细的论述。

关键词 NAND flash,YAFFS/YAFFS2,嵌入式Linux系统随着嵌入式系统在消费电子、航空航天、汽车电子、医疗保健、网络通信、工业控制等各个领域的广泛应用,嵌入式系统中的数据存储和管理已经成为一个重要的研究课题。

Flash存储器具有存取速度快、容量大、成本低等很多优点,广泛用在嵌入式系统中做存储器件。

目前,市场上Flash存储器主要有NOR(或非)和NAND(与非)两种类型。

针对NOR Flash专门设计的文件系统JFFS/JFFS2(Journaling Flash File System)在嵌入式系统中已得到广泛的应用;随着NAND作为大容量存储介质的广泛应用,专门针对NAND flash特点编写的日志文件系统YAFFS/YAFFS2(Yet Another Flash File System)正逐渐被应用到嵌入式系统中。

一、NAND Flash简介NOR 和NAND是现在市场上两种主要的非易失性闪存技术。

Intel 公司于1988年首先开发出NOR Flash技术,NOR的传输效率较高,在1~4MB的小容量时有明显的成本优势,主要应用在代码存储介质中;NAND则是高密度数据存储的理想解决方案,其容量可达1GB以上,并且写入和擦除速度很快,更适合于数据存储。

NAND Flash的存储单元为页和块,一般来说,该芯片的一页大小为512字节(简称小页),依次分为2个256字节的主数据区,最后是16字节的备用空间;而128MB以上的的芯片使用大小为2K的页(即大页)。

Busybox编译及其yaffs2文件系统制作

Busybox编译及其yaffs2文件系统制作

一、Busybox编译(版本busybox-1.13.0)1、在环境变量中设置交叉编译器的路径(版本cross-4.3.3)2、[*] Build Busybox as a static binary (no shared libs)3、busybox settings->busybox library tuning->username completion、fancy shell prompts4、make menuconfig设置CROSS COMPILE为arm-linux-5、install optin-->[*] Don't use /usr 防止编译后生成的文件安装到主机的/usr 目录下,改变了主机的系统6、make install即可在_install目录下生成bin sbin usr(bin,sbin)及其linuxrc文件(该文件链接到/bin/busybox)二、yaffs2文件系统制作将_install目录下的文件拷贝至~/myroot文件夹下,按如下结构创建目录,并在相应目录下添加如下内容:目录结构/|-- bin (busybox产生)|-- dev (设备名由mknod创建)|-- etc| |-- init.d| `-- sysconfig|-- home (手工创建用户)| |-- san (空)与passwd文件对应| `-- sky (空)与passwd文件对应|-- lib (从交叉编译工具路径拷贝cp -r 4.3.3/arm-none-linux-gnueabi/libc/armv4t/lib/*so* lib -a) |-- mnt (空)|-- proc (空)|-- root (空)|-- sbin (busybox产生)|-- sys (空)|-- tmp (空)|-- usr (busybox产生)| |-- bin (busybox产生)| |-- lib (busybox产生?)| `-- sbin (busybox产生)`-- var (空)dev目录分析dev|-- cp -a /dev/console devcp -a /dev/null devcp -a /dev/ttyS0 devcp -a /dev/ttyS1 dev(mknod -m 600 console c 5 1,这一个没有试过)can't open /dev/s3c2410_serial: No such file or director/dev目录下的console没有弄好就会出现这个问题,最简单的办法就是直接复制过来,具体的机理有待进一步研究etc目录分析etc|-- fstab (指明需挂载的文件系统)|-- group (用户组)|-- init.d (启动文件目录)| `-- rcS (存放系统启动时配置以及自启动加载的进程等)|-- inittab (init进程的配置文件)|-- passwd (密码文件)|-- profile (用户环境配置文件)`-- sysconfig`-- HOSTNAME (存放主机名)【fstab】#device mount-point type options dump fsck orderproc /proc proc defaults 0 0tmpfs /tmp tmpfs defaults 0 0sysfs /sys sysfs defaults 0 0tmpfs /dev tmpfs defaults 0 0var /dev tmpfs defaults 0 0【group】root:*:0:daemon:*:1:bin:*:2:sys:*:3:adm:*:4:tty:*5:disk:*:6:lp:*:7:mail:*:8:news:*:9:uucp:*:10:proxy:*:13:kmem:*:15:dialout:*:20:fax:*:21:voice:*:22:cdrom:*:24:floopy:*:25:tape:*:26:audio:*:29:ppp:x:99:500:x:500:sky501:x:501:sky【init.d/rcS】#!/bin/shPA TH=/sbin:/bin:/usr/sbin:/usr/binrunlevel=Sprevlevel=Numask 022export PATH runlevel prevlevel## Trap CTRL-C &c only in this shell so we can interrupt subprocesse.mount -amkdir /dev/ptsmount -t devpts devpts /dev/ptsecho /sbin/mdev > /proc/sys/kernel/hotplugmdev -smkdir -p /var/lock/bin/hostname -F /etc/sysconfig/HOSTNAME【inittab】#/etc/inittab::sysinit:/etc/init.d/rcSconsole ::askfirst:-/bin/sh(s3c2410_serial0 ::askfirst:-/bin/sh)::ctrlaltdel:/sbin/reboot::shutdown:/bin/umount -a -rs3c2410_serial为串口设备号,名称必须与drivers/serial/samsung.c一致,或则,系统启动时无法找到串口!!/*注意s3c2410上串口的设备名称是/dev/s3c2410_serial[0..3]*/$vim drivers/serial/samsung.c879 static struct uart_driver s3c24xx_uart_drv = {880 .owner = THIS_MODULE,881 .dev_name = "s3c2410_serial",882 .nr = CONFIG_SERIAL_SAMSUNG_UARTS,883 .cons = S3C24XX_SERIAL_CONSOLE,884 .driver_name = S3C24XX_SERIAL_NAME,885 .major = S3C24XX_SERIAL_MAJOR,886 .minor = S3C24XX_SERIAL_MINOR,887 };[root@Sanux /]#ls dev/s3c2410_serial*dev/s3c2410_serial0 dev/s3c2410_serial1 dev/s3c2410_serial2 【passwd】root::0:0:root:/:/bin/shftp::14:50:FTP User:/var/ftp:bin:*:1:1:bin:/bindaemon:*:2:2:daemon:/sbin:nobody:*:99:99:Nobody:/:sky::520:502:Linux User,,,,:/home/sky:/bin/shsan::530:503:san user,,,,:/home/san:/bin/sh【profile】#Ash profile#vim:syntax=sh#No core files by default#ulimit -S -c 0>/dev/null 2>&1USER="`id -un`"LOGNAME=$USERPS1='[\u@\h \W]#'(PS1='[$USER@$HOSTNAME $PWD]#') PATH=$PATHHOSTNAME=`/bin/hostname`export USER LOGNAME PS1 PATH【sysconfig/HOSTNAME】yournamelib目录lib (cp -r 4.3.3/arm-none-linux-gnueabi/libc/armv4t/lib/*so* lib -a) |-- ld-2.8.so|-- ld-linux.so.3 -> ld-2.8.so|-- libBrokenLocale-2.8.so|-- libBrokenLocale.so.1 -> libBrokenLocale-2.8.so|-- libSDL-1.2.so.0 -> libSDL-1.2.so.0.11.0|-- libSDL-1.2.so.0.11.0|-- libSDL-1.2.so.0.11.2|-- libSDL.so -> libSDL-1.2.so.0.11.0|-- libSegFault.so|-- libanl-2.8.so|-- libanl.so.1 -> libanl-2.8.so|-- libc-2.8.so|-- libc.so.6 -> libc-2.8.so|-- libcidn-2.8.so|-- libcidn.so.1 -> libcidn-2.8.so|-- libcrypt-2.8.so|-- libcrypt.so.1 -> libcrypt-2.8.so|-- libdl-2.8.so|-- libdl.so.2 -> libdl-2.8.so|-- libgcc_s.so -> libgcc_s.so.1|-- libgcc_s.so.1|-- libm-2.8.so|-- libm.so.6 -> libm-2.8.so|-- libmemusage.so|-- libnsl-2.8.so|-- libnsl.so.1 -> libnsl-2.8.so|-- libnss_compat-2.8.so|-- libnss_compat.so.2 -> libnss_compat-2.8.so|-- libnss_dns-2.8.so|-- libnss_dns.so.2 -> libnss_dns-2.8.so|-- libnss_files-2.8.so|-- libnss_files.so.2 -> libnss_files-2.8.so|-- libnss_hesiod-2.8.so|-- libnss_hesiod.so.2 -> libnss_hesiod-2.8.so|-- libnss_nis-2.8.so|-- libnss_nis.so.2 -> libnss_nis-2.8.so|-- libnss_nisplus-2.8.so|-- libnss_nisplus.so.2 -> libnss_nisplus-2.8.so|-- libpcprofile.so|-- libpthread-2.8.so|-- libpthread.so.0 -> libpthread-2.8.so|-- libresolv-2.8.so|-- libresolv.so.2 -> libresolv-2.8.so|-- librt-2.8.so|-- librt.so.1 -> librt-2.8.so|-- libsqlite3.so -> libsqlite3.so.0.8.6|-- libsqlite3.so.0 -> libsqlite3.so.0.8.6|-- libsqlite3.so.0.8.6|-- libthread_db-1.0.so|-- libthread_db.so.1 -> libthread_db-1.0.so|-- libutil-2.8.so`-- libutil.so.1 -> libutil-2.8.so说明:linuxrc执行时会依赖lib库文件1)、如果将busybox编译成动态链接的形式,没有lib动态库或者缺少相应的库文件,那么linux会提示无法执行或者找不到相应的库。

YAFFS2文件系统在嵌入式LINUX系统中的应用

YAFFS2文件系统在嵌入式LINUX系统中的应用

1.文件系统简述随着32位CPU价格不断下跌,片上存储设备的容量相比越来越大,越来越多的嵌入式系统开始应用各种嵌入式操作系统。

一般在嵌入式领域,只要应用到操作系统的必然会需要一个,甚至是多个文件系统。

所谓文件系统,实际上就是在一个具体的存储设备上任何文件的组织和目录。

这个设备可能是各种RAM、NAND FLASH、NOR FLASH等DOC设备,还有以NAND FLASH 为基础的各种存储卡等[1]。

目前,针对不同的设备和应用有很多文件系统可供选择,例如EXT2、TEMPFS、RAMDISK、CRAMFS、JFFS1/2、YAFFS1/2、XFS等。

除此之外,还有很多供应商提供的商用文件系统。

选择文件系统,要根据具体应用的需求。

一般,首先要考虑的就是可靠性,健壮性和增强的需求。

如果是像工控这样的不需经常更新控制程序的应用来说,我们选择CARAMFS这样的只读文件系统已经足够了,而且它还可以带来的另外一个好处就是CRAMFS的压缩率高达50%,可以大大节省我们的存储空间。

但是如果是像涉及到数据采集这类需要保存数据的应用来说,只读的文件系统就很难满足应用系统的需求,我们可以选择JFFS或者YAFFS这样的可读写的文件系统。

不过在实际应用中,需要考虑的因素还应该更多。

YAFFS ,Yet Another Flash File System ,是一种类似于JFFS/JFFS2 的专门为Flash 设计的嵌入式文件系统。

与JFFS 相比,它减少了一些功能,因此速度更快、占用内存更少。

YAFFS 和JFFS 都提供了写均衡,垃圾收集等底层操作。

它们的不同之处在于:1 )、JFFS 是一种日志文件系统,通过日志机制保证文件系统的稳定性。

YAFFS 仅仅借鉴了日志系统的思想,不提供日志机能,所以稳定性不如JAFFS ,但是资源占用少。

2 )、JFFS 中使用多级链表管理需要回收的脏块,并且使用系统生成伪随机变量决定要回收的块,通过这种方法能提供较好的写均衡,在YAFFS 中是从头到尾对块搜索,所以在垃圾收集上JFFS 的速度慢,但是能延长NAND 的寿命。

yaffs2 结构

yaffs2 结构

YAFFS2是一种常见的嵌入式文件系统,主要用于NAND闪存设备。

它具有许多优点,如支持大容量存储、快速读取、易于维护等。

YAFFS2文件系统的基本结构包括以下几个部分:
1.超级块(Super Block):超级块是文件系统的元数据,包含了文件系统的
基本信息,如文件系统的类型、大小、创建时间等。

2.块组(Block Group):块组是文件系统中的数据存储单元,由多个块组
成。

每个块组包含一个超级块和多个数据块。

3.数据块(Data Block):数据块是文件系统中的主要存储单元,用于存储文
件和目录的数据。

一个块组中可以有多个数据块,每个数据块包含一定数量的页面。

4.页面(Page):页面是数据块中的最小存储单元,用于存储文件系统中的实
际数据。

一个数据块中可以包含多个页面。

5.目录(Directory):目录用于存储文件和子目录的元数据,如文件名、文
件大小、创建时间等。

6.文件(File):文件是文件系统中的基本存储单元,用于存储用户数据。


个目录中可以包含多个文件和子目录。

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

创建yaffs2文件系统
版本:Rev1.0
2008-09
更新记录2008.09.09
文档创建。

创建yaffs2文件系统
-基于Virtual PC
Team MCUZone 本文叙述基于yaffs2创建Linux的根文件系统的过程。

包含了yaffs2的配置与编译,yaffs2格式根文件映像的生成。

Linux版本选择了2.6.26, 开发环境选择了Virtual PC,其它软件可以类推。

一,准备工作
1.使用Virtual PC安装Linux虚拟机
请参照本站另一篇文档《基于VPC建立ARM_Linux开发环境》。

2.下载相关软件包
下载下列软件(可在本站ftp上下载),并传输到Linux虚拟机下。

yaffs2.tar.gz
3.准备相关环境
请参照本镇另一篇文章《9261上的Linux初步应用3》设置好主机的NFS等环境。

二,配置和编译yaffs2
1.配置yaffs2
首先展开yaffs2的压缩包:
由于现在的linux内核(2.6.26)还没有包含对yaffs2的支持,需要对linux内核做一些修改。

首先到linux内核下的fs目录下创建yaffs文件夹:
从yaffs2文件夹下复制相关的yaffs文件到yaffs文件夹下:
复制yaffs2下的Makefile.kernel到kernel下的yaffs下,并重命名为Makefile:
复制Kconfig文件到yaffs文件夹:
修改kernel的fs文件夹下的Makefile,将yaffs加入内核编译:
修改kernel的fs文件夹下的Kconfig,使得可以配置yaffs:
2.编译yaffs2
在linux下运行配置程序:
由于板子上使用了2K页的NAND因此需要选择对应2048的选项。

完成的配置项:
配置完成后保存后退出,开始编译kernel。

Kernel生成后需要将其转换成u-boot格式。

三,制作根文件系统
1.编译yaffs2工具
在yaffs2/utils下编译工具:
生成的工具:
注意mkyaffs2image.c,该文件将文件夹输出为yaffs2的image,由于yaffs2的代码使用mtd的驱动来读写NAND,因此可能需要改动代码来使得生成的image
和mtd的格式一致,特别是NAND的oob格式。

否则可能造成mount后只能看到
一个lost+found文件夹。

2.生成yaffs2根文件系统映像
使用工具生成根文件系统映像:
文件生成:
生成的根文件系统:
由于yaffs2不支持数据压缩,因此生成的image比jffs2格式要大。

3.使用yaffs2文件系统
首先将支持yaffs的新kernel烧录到板子上,使用NFS方式启动,在内核可以看到yaffs的支持:
为了将yaffs2的image烧录到板子上作为根文件系统,需要先擦除mtd0:
在linux PC上将前面生成的yaffs2的image放到NFS的tmp目录下:
在开发板的/tmp下就可以看到这个文件,使用nandwrite将其写到mtd0:
烧写完毕可以mount一下,进行测试:
在mount成功后可以先看看yaffs的信息:
可以看到所mount的mtdblock0所在NAND的信息。

到/mnt/mtd目录下浏览yaffs2文件系统中的文件:
四,Yaffs2根文件系统
测试ok后,就可以将mtd0上的yaffs2文件系统作为根文件系统。

修改u-boot下的启动参数:
启动过程中可以yaffs2文件系统被识别并作为根文件系统:
系统的mount信息:
五,一些事项
如果编译遇到问题可以先检查一下环境,然后就是工具链。

请按照上文描述的步骤操作。

六,后记
以上的叙述中并没有补充Linux的相关知识,有问题的时候可以看Linux官网或者google。

如果有任何问题和建议,请到MCUZone论坛发帖,谢谢!。

相关文档
最新文档