YAFFS 文件系统详细介绍

来源:互联网 发布:阿里云购买 编辑:程序博客网 时间:2024/06/05 01:59

YAFFS 文件系统详细介绍 全文(PDF文件)见链接:http://download.csdn.net/detail/taiyi2012/6857619

一、 摘要
在现在 Embedded System 的广泛应用下,其硬件及软件的建置及设
计则需要相当大的考虑,亦因为其所需要的效率考虑下,挑选适用的内
部储存装置则相当的重要,一般常见的内部储存装置为硬盘及闪存
(Flash Memory),虽然硬盘的容量相当大,但是其执行速度相当的慢、
体积大且不耐震,较不适用于需要效率、体积及耐震考虑的 Embedded
System,因为 Flash Memory 速度快,体积小及耐震的特性,大部份的
Embedded System 皆使用 Flash Memory 做为其内部储存装置。如市面上
最常见到的行动电话、PDA(Personal Digital Assistant)内部储存
装置等或是数字相机所使用的记忆卡,皆使用 Flash Memory。因此该怎
么操作或更有效率的使用 Flash Memory,都是我们所要去关注的。
二、动机
Flash Memory 目前分为两种:NOR Flash Memory 及 NAND Flash Memory,
尤于 NAND Flash Memory 有较快的 Erase Time、Small Size 及成本较
低的特性下,使得 NAND 更适用于 Embedded System。Flash Memory 是
一储存装置,
若要使用此储存装置,
亦须要在 Flash Memory 上使用 File
System。在一般的 Block Device(e.g. Disk)上使用的 File System,
如:NTFS、FAT32 和 ext2 等等,都可用于 Flash Memory 上,但是这些
File System 并非专为 Flash 所设计的,所以无针对 Flash 的特性去操
作,因些需要透用 FTL(Flash Translation Layer)将其做转换的动作,
如下图所示:
图一
使用非专为 Flash 所设计的 File System(Flash-Specific File
System),则需要透过 FTL 做转换,才能存取 Flash Memory,但使用
FTL 会多了一个转换的过程,会浪费转换的时间,对于相当要求效率的
Embedded System 来说,不太适用,因此则有专为 Flash Memory 所设计
(Flash-Specific File System)的 File System,如:JFFS、JFFS2
和 YAFFS 等等。使用此种 Flash-Specific File System 则不再需要透
过 FTL 来做转换,如图二所示:
图二
JFFS 主要用于 NOR Flash Memory 上面,YAFFS 则是用于 NAND Flash
Memory 上。
YAFFS 是由 Aleph One 公司所制作,
适用于相当多的 Embedded
Operation System,如:eCOS、WinCE 等等,并且在 GNU GPL 的条款下,
开放其原始码,因此可自 Aleph One 公司取得 YAFFS 之原始码并可加以
修改,
使之符合自己的需要。
在此我们主要探讨使用 NAND Flash Memory
的 Flash-Specific File System-YAFFS。
三、YAFFS 基本架构及运作
YAFFS 为一 For NAND Flash Memory 的 Flash-Specific File System,
它在设计上必会针对 NAND Flash Memory 的特性来设计,如在 Data
Structure 的设计上与平常的 File System 必定不同,还有专为 Flash
Memory 设计的 wear-leveling Algorithm 以避免同一区块过度存取而造
成毁损等等。
接下来则会介绍 YAFFS 所使用的 Data Structures、
Garbage
Collection 及 Wear-Leveling 等的基本架构及运作。
3.1 YAFFS Data Structure
在一般的操作系统中,会使用 Disk 或其它储存装置以储存档案,
并使用较快速度的 RAM(Random Access Memory),将欲存取使用的档
案复制至 RAM 中,再进行存取,最后再写回储存装置。利用 RAM 可加速
整体的执行速度及效能。另外我们会设计一些 Data Structure,包括在
储存装置上使用的 Data Structure 及在 RAM 上使用的 Data Structure。
在储存装置上使用的 Data Structure 是为了管理在储存装置上所储存
的数据及其属性(如 User ID、Group ID 及存取权限等)等,而
RAM-Resident 用以管理从储存装置所读出来的档案及数据或是逻辑地
址(Logical Address)对应到储存装置实体地址(Physical Address)
的记录表格等,如图三及图四。如此系统可在 RAM 中迅速找到欲存取的
数据或从储存装置中读出数据到 RAM 中。
图三-从储存装置读取数据至 RAM 中
而 YAFFS 也有使用 RAM-Resident Data Structure 和 On-Flash Data
Structure。
以下列几个 YAFFS 主要的对象(Object)皆属于 RAM-Resident Data
Structure:
 yaffs_Object:一个
yaffs_Object 可以是档案(File)、目录
(Directory)、SoftLink 或是 Hardlink 其中一种,而每一个
yaffs_Object 都会对应到一个 yaffs_ObjectHeader,而
yaffs_ObjectHeader 则是用以储存此 yaffs_Object 的一些属性
值,例如该 yaffs_Object 是 File 或是 Directory,此
yaffs_Object 的 parentObjectId 为何...等等。yaffs_Object
亦有如下的目录结构:
 parent:此字段用以指向其父目录(parent
Directory)。
 siblings:此字段用以连结同一个目录下的所有
yaffs_Object
 children:若此
yaffs_Object 为一个目录,则此字段会指向此
目录下的 yaffs_Object 集合。
 yaffs_Tnode:yaffs_Tnodes
构成一棵 Tree Structure,此 Tree
Structure 可加速搜寻一个 File 中的 Data Chunk。当其 File
Size 愈来愈大时,其 Tree Structure 的也会跟着长高,而其
最高限制的 Level 为6。
详细信息在接下来的部份会加以介绍。
 yaffs_Device:yaffs_Device
储存装置的相关信息,类似于 VFS
(Virtual File System)的 SuperBlock。储存着用来存取 MTD
(Memory Technology Device)的资料或存取 NAND Data 的函
数(Function)。
每个 yaffs_Object 都会有一个 yaffs_ObjectHeader,
yaffs_ObjectHeader 为 On-Flash Data Structure。存在于 Flash 上,
当 Flash 挂载上时,会为每个 yaffs_Object 找寻该对象的
yaffs_ObjectHeader,读出 yaffs_Object 的相关信息。
yaffs_ObjectHeader 所储存的信息如下:
图四-yaffs_ObjectHeader 记录内容
 Name:yaffs_Object
的名称。
 ParentObjectID:此字段记录
 Type:说明此
yaffs_Object 的父 Object ID。
yaffs_Object 是 File、Directory、SoftLink 或
是 HardLink。
 Protection(Only
For File):表示此 yaffs_Object 的权限为
何。
 UID(File Only):属于哪个 User ID。
 GID(File Only):属于哪个 Group ID。
 Time of Last Access(File Only):最后存取时间。
 Time of Last Modification(File Only):最后修改时间。
 Time of Last Change(File Only):
 File
Size(File Only):档案大小。
 equivalentObjectID(HardLink
 Alias(SoftLink
 CheckSum:Name
Only):仅用于 HardLink。
Only):仅用于 SoftLink。
的 Checksum,计算 Name 避免不一致。
YAFFS 的最小储存单位为一个 Page 或 Chunk, YAFFS 中 Page 及 Chunk

所占的大小相同,因此可视为相同的东西,但实际上两个名词所表示的
意义不同,Page 所指的是 NAND Flash Memory 上的实体数据储存区,而
Chunk 所表示的是 yaffs_Object 所配置到的逻辑数据储存区,
Chunk 的
Size 可以和 Page 不同,
但在 YAFFS 中是相同的。
如图五、
图六, Page

与 Chunk Size 相同时,为一对一的关系,此时 Logical-to-Physical
Address Translation 的 Mapping Table 则会占去不少 RAM 的空间,
Page
和 Chunk 大小不同时,假设为一对二时,此时 Logical-to-Physical
Address Translation 的 Mapping Table Size 则可减少为一半,如此可
有效减少 Mapping Table 在 RAM 中所占的空间。
图五-Page 与 Chunk Size 相同时的对应关系
图六-Page 与 Chunk Size 不同时的对应关系
(一个 Chunk 对应两个 Page)
数据储存时是以一个 Page 一个 Page 的方式写入。Block 为多个 Page
所组成的一个单位,
一个 Block 中有 32 个 Page,
Block 亦为一个 Erase
Unit(即是以一个 Block 为单位做清除的动作)。如图七示:
图七
在 Flash Memory 挂载上时,其会先扫瞄过所有中的 Block 所有 Pages,
以便把所有的 yaffs_Object 在 RAM 中建立起来。根据读到的 Page 其
Spare Area 中 Tag 的 chunkID 值的不同,会有下列不同的处理方法:
1. chunkID >0:表示该 Page 为储存某个 yaffs_Object 的 Data,并根
据该 Tag 中的 ObjectID 到 RAM 中寻找该 yaffs_Object 是否在 RAM 中已
建立,若建立则将该 Page 加入至所属的 yaffs_Object 中,若未建立则
根据 ObjectID 去建立一个对应的 yaffs_Object,
并将该 Page 加入至对
应的 yaffs_Object 中。
2. chunkID =0:表示该 Page 为 yaffs_ObjectHeader,并根据此 Page
的 Spare Area 中 Tag 的 ObjectID 到 RAM 中寻找该 yaffs_Object 是否
在 RAM 中已建立,若建立则将该 Page 加入至所属的 yaffs_Object 中,
若未建立则根据 ObjectID 去建立一个对应的 yaffs_Object。建立完后
再根据 yaffs_ObjectHeader 中的 ParentObjectID 到 RAM 中寻找对应的
Parent yaffs_Object,并将原 yaffs_Object 中的 Parent 指向 Parent
yaffs_Object。
在扫描完所有的 Block 后,会把 Flash Memory 上的所有 File、
Directory、SoftLink 或 HardLink 建立成对应的 yaffs_Object,以便
修改其属性值。
在建立完所有 yaffs_Object 及其与目录之间的关系后,
会在 RAM 中形成一种阶层式(Hierarchy)的架构,如图八所示:
图八
在 YAFFS 中,File 中的 Data 是储存在固定大小的 Page 中,其大小为
512 Bytes,每一个 Page 亦会有一个对应的 Spare,其大小为 16 Bytes,
用以储存该 Page 的相关数据。
图九
Spare 所储存的数据如下所示:
图十
 Tags:
 chunkID:
指相对于此 yaffs_Object
的第几个 Chunk。 Chunk ID

为 0 时,则表此 Chunk 所储存的是 yaffs_ObjectHeader。
 serialNumber:用以辨别哪个
Chunk 为最新的 Chunk。当更新此
Chunk 时, serialNumber 会加 1 并写入至其它 Block 的 Chunk

中,
并将原 Chunk 的设为 Invalid
(表此 Data Chunk 已无效)
,
但若在将该 Chunk 设为 Invalid 之前则发生了断电(Power
Lost)的突发事件,当电源回复并再重新扫描 Flash Memory
时,会检查某一 yaffs_Object 到有两个一样的 Chunk(其
ChunkID 相同) 但其 serialNumber 不同,
,
则会比较此二 Chunk
的 serialNumber,以辨别出哪个 Chunk 为较新的 Data,并将
较旧 Data 的 Chunk 设为 Invalid。如下表所示:
说明:
说明: 若两 chunk 的 serialNumber 如上,
当系统发现有两个相同 chunkID 则比较方法为将其中一个 chunk 的
的 chunk,则检查两个 chunk 的 serialNumber 值取出,并做
serialNumber。此图可确定 (serialNumber+1) mod 4,运算后的
serialNumber 为 2 的必定比 值 x。若 x 等于另一个 chunk 的
serialNumber 为 1 的还新,则将 serialNumber,表示此 chunk 为较新
serialNumber 为 1 的 chunk 设为 的,
则把另一个 chunk 设为 Invalid。
Invalid。
此图即可确定 serialNumber 为 0 的
较 serialNumber 为 3 的更新。
* byteCount:表示该 yaffs_Object 占此 Chunk 多少个 Byte。
 objectID:此
 ECC:Tags
Chunk 属于哪个 Object 的 Objecct ID。
的 Error Correction Code。
 unusedStaff:保留未使用的字段。
 ECC
Data:Data Chunk 的 Error Correction Code。
 Page
 Block
Status:当值为 0 时,表示此值为 Invalid。
Status:保留未使用的字段。
3.2 Tree Node Structure(Tnode Structure)
系统欲存取装置上的 Data 时是以 Logical Address 相对于该 File
(
所产生出来的偏移地址)的方式到所指定的地址进行存取,若欲到实体
储存装置上取得 Data,
则须再经过一个机制的转换, Logical Address

转换为 Physical Address(实际储存装置的地址),才可从储存装置上
读出 Data 至 RAM 中。这个机制最简单的方法就是在 RAM 上建立一个
Logical Address 到 Physical Address 的对映表格(Mapping Table)。
直接将 Logical Address 对映至 Physical Address。如图十一所示:
图十一-在 RAM 中建立 Logical Address 对应至 Physical Address 的对
映表格
在 YAFFS 中也使用了 Logical Address 到 Physical Address 的对映机
制。所使用的机制称之为 Tree Node Structure 或 Tnode Structure。
Flash Memory 挂载时,
YAFFS 会为每个 File 在 RAM 中建立一个 Tree,
当有一个要求要存取某个 Chunk(或 Logical Address)时,则会经由
Tree Node Structure 的转换方式,找到 Chunk 的 Physical Address。
使用 Tree Node Structure 的优点为地址转换时间较迅速。Tree Node
Structure 的转换 Time Complexity 为 O(log N),
若是直接使用 Logical
Address to Physical Address 的 Mapping Table,则地址转换为线性
搜寻(Linear Search),此种搜寻方式的 Time Complexity 为 O(N)。
YAFFS 采用此种方式来做为地址转换的机制可提升整体的存取速度。
Tree Node Structure 是由多个 Tree Node(或 Tnode)所组成。依
据 Level 的不同而分成两个部份:
 Internal
Tnode:
每个 Internal Tnode 由 8 个 Pointers 所组成。
 Lowest-Level
Tnode
(Level 0 Tnode) 每个 Lowest-Level Tnode
:
由 16 个 Entries 所组成。
图十二
在 Tree 建立好后,当系统发出要存取该 File 的某个 Chunk 时,例如:
Chunk 0x235,就要在 Tree 上做 Traverse 的动作,以找寻到要求的
Chunk。Traverse 的步骤如下:
1. 将十六进制转化为二进制:0x235  0000001000110101
2. 将二进制切割成 000.000.100.011.0101,每一个切割区代表一个
Level,由于 Lowest-Level 包含有 16 个 Entries,因此切割出 4 个 Bit
(Bit 3 to 0)。Internal Level 的 Tnode 皆包含 8 个 Pointer,因此
其余皆切割为 3 个 Bit。
3. 根据所切割出来的 Bit 整理成下表:
Level Bits Selected Value
3 or more if they exist >=10 Zero
2 9 to 7 100 binary = 4
1 6 to 4 011 binary = 3
0 3 to 0 0101 binary = 5
4. 根据表格中各 Level 的值进行 Traverse。
100=4Step1:Level 2
011=3Step2:Level 1
0101=5Step3:Level 0
当 Tree Node Structure 刚开始建立时,
仅会建立 Lowest-Level Tnode,
当 File 所配置的 Chunk 数超过 16 个时,
则此 Tree 会建立一个 internal
Tnode,并将其第 0 个 Pointer 指向原本的 Lowest-Level Tnode。当读
取到的 Chunk 数愈来愈多时,
会一直新增 Tnode, Tree 亦会愈来愈高,

其 Max-Level 最大为 6。
Step1 Step2
Step3 Step4
在 File 已在 RAM 建立好 Tree Node Structure 后,
若此 File 的 Size
变大时,则会再多配置 Chunk 给此 File,在将 Data 写入至 Page 后,则
会去更新 File 的 Tree Node Structure,将新配置到的 Chunk 加入至
Tree Node Structure 中,更改步骤如下:
1. 搜寻新配置到的 Chunk ID。
2. 若在 Internal-Level 搜寻的过程中,发现没有 Tnode,则建立一个
Internal-Level 的 Tnode。
3. 当搜寻到 Lowest-Level 时,若也无 Tnode 存在,则建立一个
Lowest-Level 的 Tnode。
4. 根据 Chunk ID 中 Level 0 所代表的值 x,到 Lowest-Level Tnode
中的第 x 个 Entry 中检查有无该 Chunk 的实体地址存在,
若没有则将实
体地址填入该 Entry,若已存在则将比较两 Chunk 在 Spare 中的
serialNumber,将较新的 Chunk 的实体地址写入该 Entry 中,并将旧的
Chunk 设为 Invalid。
2. 在 Internal-Level 搜寻过程
1. 搜寻新配置到的 Chunk ID
中,发现无 Tnode 存在,建立一
Tnode
3. 在搜寻过程中,发现无
Lowest-Level Tnode 存在,则建立一
Lowest-Level Tnode,并将该 Chunk
ID 写入对应的 Entry 中
3.3 YAFFS Garbage Collection
Garbage Collection 主要是用于将已不必要存在且浪费空间的 Block
做回收的动作,以增加可用的 Block 数。而 Garbage Collection 只有
某些事件发生时才会执行。
在 YAFFS 中只有在下列事件发生时会执行 Garbage Collection:
将
Data 写入 Flash Memory
 更新
yaffs_ObjectHeader
而 YAFFS 的 Garbage Collection 又分成两种 Mode:Aggressive Mode
及 Passive Mode,其相异点如下表所示:
Aggressive Mode
Passive Mode
ErasedBlocks <=

(PreservedBlocks + 1)

ErasedBlocks > (PreservedBlocks +
ErasedBlocks: Block 数


1)
PreservedBlocks:保留

Block 数
1.

Iterations=(EndBlock-StartBlock)
查 Iterations =
+ 1
回 (EndBlock-StartBlock) +
2. Iterations = Iterations / 16
合 1
3. Iterations = 200 if Iterations

>200
YAFFS 的 Garbage Collection 执行步骤如下:
1. 从 currentDirtyChecker 到 End Block 之间寻找 Dirtiest Block 包
(
含最多 Invalid Chunk 的 Block)
图十三
2. 将 currentDirtyChecker 重置至所发现的 Dirtiest Block 的位置
图十四
3. 将 Dirtiest Block 中的 Valid Page 复制至其它的 Empty Chunk 中。
图十五
4. 再将 Dirtiest Block 清除成 Empty Block。
图十六
3.4 Wear-Leveling
当 Flash Memory 在使用时,常常会对 Flash Memory 内的某个档案
做修改的动作,
若此时档案的大小更动而需要更多 Page 时,
且在 Flash
Memory 内仍有空的 Block,则会配置空的 Block 给该档案,若 Flash
Memory 内已无空的 Block,则会执行 Garbage Collection 的动作,清
出空的 Block 以供使用。
而在挑选空 Block 或使用 Garbage Collection
时挑选 Dirtiest Block 时,可能会造成部份的 Block 常常被挑选,而
其它 Block 则很少被挑选配置。
图十七
由于 Flash Memory 的特性,那些常常被挑选的 Block 可能会因为过度
的使用而造成损毁,为了避免这种负担不均的情形发生,因此在大部份
的 Flash-Specific File System 上都会设计一种方法以避免此种情形
发生,此方法即称为 Wear-Leveling。
使用 Wear-Leveling 时,在挑选 Block 时不会常常固定在某几个 Block
上,而可使大部份 Block 的存取次数能够平均,不会造成部份 Block 过
度存度而造成毁损。
图十八
在 YAFFS 中并没有明确的使用 Wear-Leveling,而是以下面两种策
略取代:
1. 保留部份 Block,若部份 Block 毁损时可使用保留的 Block 取代。
2. 使用「随机挑选 Block」(Random Block Selection),如此可避免
不常被挑选的 Block 一直没人使用。
但是实际在观察 YAFFS 的原始码时,并未发现有使用"Random Block
Selection",在询问 YAFFS 作者 Charles Manning 是否有将"Random
Block Selection"实作出来后,其回信如下:
「No it is not.
For the most part wear levelling is not a problem for a
log-structured file
system like yaffs because usage cycles tend to clear out and reuse
areas.
Wear levelling is much more an issue for file systems like FAT
which use block
locations. Some blocks (eg. those used for storing the FAT tables)
get
heavily used.
I have done some very heavy accelerated lifetime testing (eg
writing over
150Gbytes of data into a device) with no indications of any wear
levelling
issues. Very few blocks had reached even one tenth of their
lifetime」
在 Charles Manning 信中提到 YAFFS 实际上并未使用"Random Block
Selection",
因此 YAFFS 的 Wear-Leveling 所依赖的只有第一个策略而
已。
3.5 Partial Page Programming
当我们要将 Data 写入某个 Page 时,会先将该 Page 清除(Erase),即
该 Page 的内容全为 1,因为在 Flash Memory 中,仅能将 Bit 1 改成 Bit
0,
所以在清除过后所有的 Bits 皆会为 1。
在清除 Page 后才能将数据写
入,例如 Page 内的 Data 为 10111010,要将之改成 01010101,则会先
将 Page 清除为 11111111,再更改成 01010101。
图十九
在 NAND Flash Memory 中,存取数据的最小单位为一个 Page。若使用
Partial Page Programming 则修改 Page 中的 Data 时可以更改部份的
Bit 而不需要将 Page Erase 后才更改。
例如 Page 中的 Data 为 10111010,
要将该 Data 改成 10100010 则只需将其中两个 Bit 更改为 0 即可,
不需
先 Erase 再写入。
图二十
使用 Partial Page Programming 常会发生一种问题,即是在更改 Bit
的时候可能会有"走样"的情况而有没有完全更改过来,例如 Page 中的
Data 为 11111111,欲将之改成 00000000,但在更改的时候却未完全更
改过来,
而使的更改后的数据可能变为 00111101,
仍有部份的 Bit 未更
改为 0。
图二十一
在 YAFFS 中也使用了 Partial Page Programming,主要用于将某个
Page 设为 Invalid,即更改该 Page 的 Spare 中 pageStatus。当 Page
为 Valid 时,其 Spare 内的 pageStatus 内容为全 1 的状态,即未更改
pageStatus,若要将近改为 Invalid,则将 pageStatus 内容改为 0(即
全为 0)即可。但是由于 Partial Page Programming 会导致的错误,使
得 pageStatus 的内容可能会无法更改为 0,
因此在 YAFFS 中则采用了一
种方法,即更改后的值,其值的二进制中,Bit 为 1 的个数若小于 6,
则表示该 Page 为 Invalid。否则视为 Valid Page。
图二十二
四、Performance Measurements
Flash-Specific File System 有相当多的选择,欲使用何种 File
System 端看于设计者的需求,但在相同的需求下,该挑选何种 File
System 则可依其执行效能及该 File System 可能额外所耗去的资源来做
考虑,
在此则会评估使用 yaffs 在 nandsim 上时的效能及其可能所耗用
的额外资源等。
4.1 环境建置
测试 yaffs 与 nandsim 的效能之 Hardware 及 Software 环境如下:
Hardware
Software
CPU Intel Dual OS Windows XP SP2
Core 3.0GHz Other VMWare 5.0(Fedora Core 5+512
RAM 1.0 GHz Dual MB+yaffs2+Linux Kernel 2.6.17.9+nandsim)
Channel
Number of CPUs 1
Disk subsystem
SATA
在 Fedora Core 5 的 NANDSim 挂载时,亦需加入参数如下:
modprobe nandsim second_id_byte=0x71 access_delay=180
programm_delay=520 erase_delay=1.85
second_id_byte:设定 Nandsim 大小,其参数值参考 nand_ids.c
access_delay:Initial page access delay(micro second)
programm_delay:Page Program Delay(micro second)
erase_delay:Sector erase delay(milli second)
4.2 Andrew Benchmark
Andrew Benchmark 主要的测试步骤分为五个阶段:
 Phase
1:Creating Directories
 使用指令为:mkdir
 Phase
2:Copying Files
 使用指令为:cp
 Phase
3:Recursive Directory Stats
 使用指令为:ls
 Phase
-l
4:Scanning each file
 使用指令为:grep+wc
 Phase
5:Compilation
 使用指令为:make
使用 Andrew Benchmark 会挑选一合适的 Source Tree 来做 Benchmark,
其中会包含多个档案以供执行 Andrew Benchmark 的时候使用,在此测
试中共有 71 个档案。其 File Size Range 所占的百分比如下:
图二十三
在完成所有环境建置后,即开始进行 Andrew Benchmark 的测试,其测
试的结果如下图:
图二十四
在执行 Andrew Benchmark 时,其执行过程中会将其 Source Tree 的内
容复制至目的地,在此我们则要测试除了原本的 Source Tree 所占的空
间外,yaffs 额外所使用的管理空间约占多少。
在执行完 Andrew Benchmark 后,算出原本 Andrew Benchmark Source
Tree 所占的空间及执行后 Source Tree 在 nandsim 上所占的空间如下图
所示:
图二十五
在执行完 Andrew Benchmark 后发现,在 nandsim 上一模一样的
Source Tree 却比原本的 Source Tree 多出了 59.47k,这是 yaffs 在管
理档案所花费的额外成本,例如每个档案所占的 Spare Area 等等,都
会耗用额外的空间。
4.3 Multiprogramming with/without hot/cold Data
在此测试中,会包含两种 Task:
 TaskA:Sequentially
 TaskB:Repeatedly
Write 16K Bytes of Data(Hot Data)
Update 16 Bytes of Data(Cold Data)
根据上述 Tasks,执行下列六种执行方式,并会在各个方式下产生
Response Time 及 Throughput,
其中(x,y)表示有 x 个 TaskA 及 y 个 TaskB
同时执行:
 (0,1):Update
16 Bytes of Data
 (1,0):Write
16K Bytes of Data
 (1,1):Mixture
of Hot Data and Cold Data
 (2,2):Multiprogramming Testing
 (4,4):Multiprogramming Testing
 (8,8):Multiprogramming Testing
在执行完后,针对 TaskA 及 TaskB 观察在各种执行方式下的 Response
Time 及 Throughput。针对 Response Time 的部份,是以 RDTSC 的方式
取得缓存器中的 Clock 数,Clock 数愈多,表示其所花费的时间愈长。
 TaskA
 Response
Time
图二十六-Response Time of TaskA
在 TaskA 的 Response Time 中,在各种执行方式下,由于其 TaskA 的数
量是以指数递增,而其 Respnose Time 在统计图中亦以指数呈现上升的
趋势,可知在 TaskA 数量愈多的情况下,其响应时间愈长。

Throughput
图二十七-Throughput of TaskA
在 TaskA 的 Throughput 中,其统计图与 TaskA 的 Response Time 呈现
相反的情况,亦即其图形是以指数递减的趋势,表示当 TaskA 的数量愈
来愈多时,其 Throughput 愈低。
 TaskB
 Response Time
图二十八-Response Time of TaskB
在统计图中 TaskB 的 Response Time 亦与 TaskA 相同,当 TaskB 数量愈
多,其 Respnose Time 亦愈高(表示愈慢)。

Throughput
图二十九-Throughput of TaskB
TaskB 的 Throughput 亦会因为 TaskB 的个数增加而逐渐降低,
表示当系
统对 nandsim 做存取时,
TaskB 个数愈多,
其每秒写入的 Byte 数会逐渐
减少。
五、结论
YAFFS 为目前常用的一种 NAND Flash Memory 的 Flash-Specific File
System。因此对 YAFFS 有个深度的了解将对 Flash-Specific File
System 的制作或对 YAFFS 的修改都有很大的帮助。
在比较 YAFFS 和 JFFS2
之后,针对 YAFFS 相对于 JFFS2 的优劣做以下的禅述。
在 Trace YAFFS 的程序代码时,发现 YAFFS 的 Garbage Collection 寻
找 Dirtiest Block 及寻找 Empty Block 出来配置时所使用的方式皆为
Linear Search 的方式,其 Time Complexity 为 O(N),而不像 JFFS2 是
以 Link List 的方式去管理 Dirty Block 和 Empty Block,在寻找 Dirty
Block 及 Empty Block 时,只需从 List 的头或尾取出即可,其 Time
Complexity 为 O(1)。
因此在这边发现,
YAFFS 在这边的效率是明显的比
JFFS2 差了一点。
YAFFS 采用 Tree Node Structure,将之储存在 RAM 中,当系统需
要某一 File 的某一 Chunk 时,即可透过 Tree Node Structure 进行搜
寻的动作,其搜寻的 Time Complexity 相当于 O(log N),可迅速的找到
所需要的 Chunk。
YAFFS 并未实际的做出 Wear-Leveling,因此还是会造成部份的
Block 过度存取,会造成此结果的另一原因也是因为 YAFFS 在
Wear-Leveling 的应对策略"Random Block Selection"上并未实际做出
来。在 YAFFS 的 Wear-Leveling 上可参考 yaffs2 的做法,在某个次数
下则使用"Random Block Selection",可有效的平均每个 Block 的存取
次数。
使用 Partial Page Programming 会使得 NAND Flash Memory 的硬
件设计上相对的较困难,因此新的 NAND Flash Memory 已不允许再使用
Partial Page Programming,
所以在 YAFFS2 上已不再使用 Partial Page
Programming。YAFFS 亦不可在新的 NAND Flash Memory 上使用,因为其
使用的 Partial Page Programming 可能会造成数据上的错误。
针对 YAFFS 劣于 JFFS2 的部份,也许可以将其部份加以修改,优化其执
行效率,使之符合我们的需求。
References
 Aleph
One
 http://www.aleph1.co.uk/
 Memory
Technology Device(MTD) Subsystem for Linux
 http://www.linux-mtd.infradead.org/
Retrieved from "http://esslab.tw/wiki/index.php/YAFFS"

1 0
原创粉丝点击