Yaffs文件系统简介
1 简介
1.1 应用场合
Yaffs(Yet Another Flash File System)文件系统是专门针对NAND闪存设计的嵌入式文件系统,目前有YAFFS和YAFFS2两个版本,两个版本的主要区别之一在于YAFFS2能够更好的支持大容量的NAND FLASH芯片。
1.2 Yaffs文件系统数据在NAND上的存储方式
Yaffs对文件系统上的所有内容(比如正常文件,目录,链接,设备文件等等)都统一当作文件来处理,每个文件都有一个页面专门存放文件头,文件头保存了文件的模式、所有者id、组id、长度、文件名、Parent Object ID等信息。因为需要在一页内放下这些内容,所以对文件名的长度,符号链接对象的路径名等长度都有限制。
前面说到对于NAND FLASH上的每一页数据,都有额外的空间用来存储附加信息,通常NAND驱动只使用了这些空间的一部分,Yaffs正是利用了这部分空间中剩余的部分来存储文件系统相关的内容。以512+16B为一个PAGE的NAND FLASH芯片为例,Yaffs文件系统数据的存储布局如下所示:
0..511 |
数据区域 |
512..515 |
YAFFS TAG |
516 |
Data status byte |
517 |
Block status byte 坏块标志位 |
518..519 |
YAFFS TAG |
520..522 |
后256字节数据的ECC校验结果 |
523..524 |
YAFFS TAG |
525..527 |
前256字节数据的ECC校验结果 |
个BYTE用来存放文件系统相关的信息(yaffs_Tags)。这8个Byte的具体使用情况按顺序如下:
Bits |
Content |
20 |
ChunkID,该page在一个文件内的索引号,所以文件大小被限制在2^20 PAGE 即512Mb |
2 |
2 bits serial number |
10 |
ByteCount 该page内的有效字节数 |
18 |
ObjectID 对象ID号,用来唯一标示一个文件 |
12 |
Ecc, Yaffs_Tags本身的ECC校验和 |
2 |
Unused |
,以后每次写具有同一ObjectID和ChunkID的page的时候都加一,因为Yaffs在更新一个PAGE的时候总是在一个新的物理Page上写入数据,再将原先的物理Page删除,所以该serial number可以在断电等特殊情况下,当新的page已经写入但老的page还没有被删除的时候用来识别正确的Page,保证数据的正确性。万个左右。
最后以上这些是针对Yaffs1而言,对于Yaffs2因为针对chunk size大于1k的NAND FLASH,在Tags各分量及总体尺寸上都做了修改,以便更快更好的处理大容量的NAND FLASH芯片。由于Tag尺寸的增大,在512+16B类型的NAND FLASH上就一个Trunk对应一个page的情况,目前就无法使用Yaffs2文件系统了。
由于文件系统的基本组织信息保存在页面的备份空间中,因此,在文件系统加载时只需要扫描各个页面的备份空间,即可建立起整个文件系统的结构,而不需要像JFFS1/2 那样扫描整个介质,从而大大加快了文件系统的加载速度。
1.3 yaffs文件系统在内存中的组织方式
1.3.1 SupperBlock
操作文件系统的第一步自然是取得SuperBlock了,Yaffs文件系统本身在NAND Flash上并不存在所谓的SuperBlock块,完全是在文件系统mount的过程中由read_super函数填充的,不过有意思的一点是,由于物理上没有存储superblock块,所以NAND Flash上的yaffs文件系统本身没有存储filesystem的魔数(MagicNum),在内存中superblock里的s_magic参数也是直接赋值的,所以存储在NAND FLASH上的任何文件系统都能被当作yaffs文件系统mount上来,只是数据都会被当作错误数据放在lost+found目录中,不知道这算不算yaffs文件系统的一个bug。
通常一个具体的文件系统在VFS的Super_block结构中除了通用的数据外,还有自己专用的数据,Yaffs文件系统的专用数据是一个yaffs_DeviceStruct结构,主要用来存储一些相关软硬件配置信息,相关函数指针和统计信息等。
1.3.2 文件在内存中的组织方式
在mount过程执行read_super的过程中,Yaffs文件系统还需要将文件系统的目录结构在内存中建立起来。由于没有super块,所以需要扫描Yaffs分区,根据从OOB中读取出的yaffs_tags信息判断出是文件头page还是数据page。再根据文件头page中的内容以及数据page中的ObjectID/ChunkID/serial Number等信息在内存中为每个文件(Object)建立一个对应的yaffs_object对象。
在yaffs_object结构中,主要包含了:
Ø 如修改时间,用户ID,组ID等文件属性;
Ø 用作yaffs文件系统维护用的各种标记位如脏(dirty)标记,删除标记等等;
Ø 用作组织结构的,如指向父目录的Parent指针,指向同级目录中其他对象链表的siblings双向链表头结构
此外根据Object类型的不同(目录,文件,链接),对应于某一具体类型的Object,在Yaffs_object中还有其各自专有的数据内容
Ø 普通文件:文件尺寸,用于快速查找文件数据块的yaffs_Tnode 树的指针等
Ø 目录:目录项内容双向链表头(children)
Ø 链接:softlink的alias,hardlink对应的ObjectID
除了对应于存储在NAND FLASH上的object而建立起来的yaffs_object以外,在read_super执行过程中还会建立一些虚拟对象(Fake Object),这些Fake Object在NAND FLASH上没有对应的物理实体,比如在建立文件目录结构的最初,yaffs会建立四个虚拟目录(Fake Directory):rootDir, unlinkedDir, deleteDir, lostNfoundDir分别用作根目录,unlinked对象挂接的目录,delete对象挂接的目录,无效或零时数据块挂接的目录。
通过创建这些yaffs_object,yaffs文件系统就能够将存储在NAND FLASH上数据系统的组织起来,在内存中维护一个完整的文件系统结构。
2 Yaffs文件系统集成及应用相关
2.1 系统移植
这里所谓移植,就是在特定的软硬件环境里编译出yaffs文件系统模块了。目前最新的yaffs版本的代码里主要是按照2.6内核的方式写的Kconfig和Makefile,对于2.4内核来说,改起来也很简单,基本上,只需要:
Ø 在内核中建立YAFFS目录fs/yaffs,并把下载的YAFFS代码复制到该目录下面。
Ø 参考yaffs代码中的Kconfig文件,按照2.4内核的风格修改你自己的Config.in文件,使得可以配置YAFFS。
Ø 修改fs/makefile,加入yaffs目录
Ø 按照2.4内核的风格修改YAFFS目录中的Makefile文件。
只是在配置YAFFS的时候需要注意一点,即使你的NAND FLASH是512+16B的,不需要使用YAFFS2,也需要将对2k page的NAND FLASH的支持这一项选上,否则编译无法通过(因为部分代码没有用CONFIG宏包起来),不知道这是不是我下载的这个版本的个别现象,还是对Makefile还需要进一步的修改。
此外就是最好把Lets Yaffs do its own ECC选上,理由后面会说,其他选项就无所谓了,主要是对性能的调整,看着选吧,按推荐配置好了,比如Turn off debug chunk erase check,这一项,我试验的结果选上后平均可以提高20-30%左右的擦写速度。
2.2 Yaffs文件系统的制作和使用
通过Yaffs Image文件制作yaffs文件系统
字节为单位的一个page的data数据外,同时紧跟在后还包括了16字节为单位的NAND备份数据区(OOB)的数据。个字节为单位的。就是因为包含了这额外的16字节/page的数据,所以基本上常规办法如dd,或者通常的下载其它类型image的工具就无法正常下载yaffs image了,需要修改你所使用的下载工具的代码,使得它能将yaffs image中的这些额外数据也写入NAND FLASH OOB中。
这里还有一点需要注意的是,通过mkyaffsimage制做出来的image其OOB中也包含它自己计算的ECC校验数据,其校验算法有可能和MTD NAND驱动的校验算法不同,如果在内核中由MTD来处理ECC,会造成MTD认为所有的page都校验错误。所以,这也是我前面说最好把Lets Yaffs do its own ECC选上的原因,同时,要把MTD NAND驱动中的ECC校验关闭。
Yaffs文件系统简介的更多相关文章
- UBIFS文件系统简介 与 利用mkfs.ubifs和ubinize两个工具制作UBI镜像 (完整理解版本)
UBI文件系统简介 在linux-2.6.27以前,谈到Flash文件系统,大家很多时候多会想到cramfs.jffs2.yaffs2等文件系统. 它们也都是基于文件系 统+mtd+flash设备的架 ...
- linux 文件系统简介
linux文件系统简介 文件系统是linux的一个十分基础的知识,同时也是学习linux的必备知识. 本文将站在一个较高的视图来了解linux的文件系统,主要包括了linux磁盘分区和目录.挂载基 ...
- yaffs文件系统
1. 概述yaffs文件系统专为Nandflash设计的日志文件系统,占用page中oob区域.目前有两个版本的yaffs文件系统.nandflash不可靠,存在坏块,存在数据错误,需要软件弥补纠正此 ...
- 在内核中增加对yaffs文件系统的支持
自己最近在搞一些内核以及根文件系统的移植,就涉及到了需要在内核中增加对yaffs文件系统的支持.在网上找了一些文档后,自己将具体的操作过程做了一个总结,方便以后查询使用: 1.获取yaffs源码 YA ...
- Linux磁盘和文件系统简介
Linux磁盘和文件系统简介 1.文件系统:存储设备上存储数据的方式方法 磁盘主要由盘片.机械手臂.磁头和主轴马达组成,而数据的写入实际是写在盘片上,磁盘的最小存储单位为扇区,每个扇区为512字节,扇 ...
- Linux 4.10.8 根文件系统制作(三)---制作yaffs文件系统
这里直接用的是韦东山提供的工具. yaffs文件系统是专门用于nandflash的文件系统 我们前面已经下载了yaffs 的源码,也做了文件系统目录的构建. 在yaffs2的源码目录中有一个utils ...
- linux2.6.30.4内核移植(3)——yaffs文件系统移植
内核源码:linux2.6.30.4 交叉编译工具:3.4.5 移植linux内核至:TQ2440 工作基础:http://www.cnblogs.com/nufangrensheng/p/36696 ...
- UBI文件系统简介
转:http://www.embedu.org/Column/Column102.htm 在linux-2.6.27以前,谈到Flash文件系统,大家很多时候多会想到cramfs.jffs2.yaff ...
- Linux学习笔记之 Btrfs文件系统简介及使用
Btrfs 也有一个重要的缺点,当 BTree 中某个节点出现错误时,文件系统将失去该节点之下的所有的文件信息.而 ext2/3 却避免了这种被称为”错误扩散”的问题. Btrfs相关介绍: Btrf ...
随机推荐
- Rss 的作用 及使用方法
也可以参考http://jingyan.baidu.com/article/e73e26c0c73e1f24adb6a70f.html 什么是RSS RSS是站点用来和其他站点之间共享内容的一种简易方 ...
- Makefile 工程管理
Makefile 工程管理 Makefile 规则 --变量 在Makefile中,用户除了可以自己定义变量外,还可以使用存在系统已经定义好的默认变量 $^:代表所有的依赖文件 $@:代表目标 $&l ...
- NET基础课--开发工具实用功能
1.浏览代码结构 类视图 2.重构功能 提取长的的方法体中的部分方法到单独函数中 路径:选择代码段,右击重构----提取方法 3.代码结构 a 代码对齐 点[编辑]-[高级]-[设置选定内容的格式] ...
- SQL按汉语拼音首字母排序
以常用到的省的数据表(province)为例,其中name字段为省的名称,SQL语句如下: ))) as py ,a.name from province a left outer join ( se ...
- Sql Server中charindex、patindex的区别
SQL代码如下: select charindex('1,','121,1,1234') select patindex('%1,%','121,1,1234') ','121,1,1234') se ...
- iOS 开发者证书总结
iOS 证书分两种类型. 第一种为$99美元的,这种账号有个人和公司的区别,公司账号能创建多个子账号,但个人的不能.这种账号可以用来上传app store 第二种为¥299美元的,这种账号只能用于企业 ...
- ios开发 block语句块
ios开发 block语句块 1.block 理解为匿名函数 2.block变量的定义 //定义block变量,^表示定义block //技巧:函数名左右加括号,在函数名前面在加^ void (^bl ...
- C++中类的内存空间大小(sizeof)分析
注意类大小与结构体大小还是有一些不同的,类里面还包含成员函数(特别是虚函数),结构体中一般只有数据成员. 首先明确各数据类型占多大的空间.例如int到底是占2字节还是4字节空间: 在TC里,int是2 ...
- YUI Array 之 indexOf(索引值|搜索)
YUI原码 YUI indexOfYArray.indexOf = Lang._isNative(Native.indexOf) ? function (array, value, from) { r ...
- spring2.5IOC控制反转详解
spring2.5IOC控制反转详解 19. 五 / J2EE / 一条评论 基本的代码结构 1 IOC包下 基本的spring创建对象 将类添加到配置文件中,由容器创建. Source code ...