Yaffs文件系统是专门为NAND flash设计的,以下是我对yaffs的理解.(很多一部分是翻译,理解的,难免有疏漏之处)
$[
g3i.n)Dcb!s'qW0
LUPA开源社区{'YANe-NW1B_
LUPA开源社区t)gx/rhX0`
--Yaffs用到的专用术语--
LUPA开源社区8kAD
sp%yx}*T
Page -
NAND里可访问的最小存储单元,需要跟文件系统中"页"的概念区别开来.具有的属性:读,写;能被标记,表明其是否损坏;还有用于存放校验数据的oob
单元.
Page大小有512字节的,也有2K字节的;针对此,oob区域也有不同大小,512B/Page的oob有16个字节,2KB/Page的oob就是
前者的4倍,也就是说64个字节.
LUPA开源社区7fYoL)eib6Y?gV
LUPA开源社区)kX+o
T
G
`v!]Z[
LUPA开源社区QI@;eh f)n e8b
Block - NAND实现了快速的擦,就是因为有了它. Block由64个Page组成. 所以根据Page大小不同,block有16K字节的和128K字节的.
9o5|!o0p]1Dmi0
6{(I;z@@*C0
5W~H1G,i!p:J[0
OOB - 用来存放Page上数据的ECC信息,每个Page都有自己的oob
LUPA开源社区|q2\"l4Xn
0}G&t7o\^!pCQ0
Chunk - Chunk是Yaffs文件系统里的概念,是文件访问的基本单元,跟Nand物理上的page大小一样
C8S)x~NldI0
$gyGl
Q.gc0
Object - 构成Yaffs文件系统的各种元素,比如文件,目录,链接,设备等等
^T9s
a;B$q^2~I9o;~0
T~:cJX gik;Q0
LUPA开源社区ys8T#B-K)mvP
--yaffs设计--
LUPA开源社区:`Ce(\$N%F!DG?
基于4个原则:
)y ?5awP1t0
1. 专门为Nand flash设计
T|w$M7\0Ia0
2. 稳定性好
ln0Ka:Fl:h0
3. 运行时消耗内存小
LUPA开源社区Z ^+Ta;CT
4. 启动速度快
4Yv5B&R
y\(`)]0
LUPA开源社区H:e
l#c^
文件数据都是存在chunk中的,chunk的大小跟page一样. 每个page都被标记了一个chunk number和file id. 简单的说,文件被分成很多chunk存在各个page中.每个chunk的有
$v2c$}*aDSl%yS0
效数据都是page的大小,除了最后哪个chunk. 照我的理解,chunk跟page就是同一个东西.
]g!K~n'z'|0
u/_cwXXL ~3v
^X0
文件的"头"当然被放置在第一个page中;里面包括了一些信息比如文件属性,路径等;这个page的属性就区别于其他page,因为yaffs系统通过找到这个"头page" 来找到文件. 文件夹,链接等也被存在类似的page中.
gfYQ5P0
&D-Gw&g@&? g0
当然文件被修改的时候,yaffs会把修改好的结果写入到新的chunk里;删除操作是通过把删除的目标(可以是文件,链接,文件夹)放置到一个'隐藏'的路径中.所以说,删除一个目标之后,它并没有从
LUPA开源社区9Y/G.QXZ(yE]
Nand中消失,而是继续存在的,知道保存它的所由page都被擦除.