很遗憾,不能看到图片,大家也可以通过下面这个链接看到这篇文章http://esslab.tw/wiki/index.php/YAFFS
YAFFS YAFFS
From ESSLabWiki From ESSLabWiki
Independent Stu書面報告 Independent Study书面报告
指導教授:張立平教授 指导教授:张立平教授
學生:黃千庭 学生:黄千庭
目錄 目录
一、摘要 一、摘要
二、動機 二、动机
三、YAFFS基本架構及運作 三、YAFFS基本架构及运作
3.1 YAFFS Data Structure 3.1 YAFFS Data Structure
3.2 Tree Node Structure 3.2 Tree Node Structure
3.3 YAFFS Garbage Collection 3.3 YAFFS Garbage Collection
3.4 Wear-Leveling 3.4 Wear-Leveling
3.5 Partial Page Programming 3.5 Partial Page Programming
四、Benchmark 四、Benchmark
4.1環境建置 4.1环境建置
4.2 Andrew Benchmark 4.2 Andrew Benchmark
4.3 Multiprogramming with/without hot/cold Data 4.3 Multiprogramming with/without hot/cold Data
五、結論 五、结论
一、 摘要一、 摘要
在現在Embedded System的廣泛應用下,其硬體及軟體的建置及設計則需要相當大的考量,亦因為其所需要的效率考量下,挑選適用的內部儲存裝置則相當的重要,一般常見的內部儲存裝置為硬碟及快閃記憶體(Flash Memory),雖然硬碟的容量相當大,但是其執行速度相當的慢、體積大且不耐震,較不適用於需要效率、體積及耐震考量的Embedded System,因為Flash Memory速度快,體積小及耐震的特性,大部份的Embedded System皆使用Flash Memory做為其內部儲存裝置。在现在Embedded System的广泛应用下,其硬体及软体的建置及设计则需要相当大的考量,亦因为其所需要的效率考量下,挑选适用的内部储存装置则相当的重要,一般常见的内部储存装置为硬碟及快闪记忆体(Flash Memory),虽然硬碟的容量相当大,但是其执行速度相当的慢、体积大且不耐震,较不适用于需要效率、体积及耐震考量的Embedded System,因为Flash Memory速度快,体积小及耐震的特性,大部份的Embedded System皆使用Flash Memory做为其内部储存装置。 如市面上最常見到的行動電話、PDA(Personal Digital Assistant)內部儲存裝置等或是數位相機所使用的記憶卡,皆使用Flash Memory。如市面上最常见到的行动电话、PDA(Personal Digital Assistant)内部储存装置等或是数位相机所使用的记忆卡,皆使用Flash Memory。 因此該怎麼操作或更有效率的使用Flash Memory,都是我們所要去關注的。因此该怎么操作或更有效率的使用Flash Memory,都是我们所要去关注的。
二、動機 二、动机
Flash Memory目前分為兩種:NOR Flash Memory及NAND Flash Memory,尤於NAND Flash Memory有較快的Erase Time、Small Size及成本較低的特性下,使得NAND更適用於Embedded System。 Flash Memory目前分为两种:NOR Flash Memory及NAND Flash Memory,尤于NAND Flash Memory有较快的Erase Time、Small Size及成本较低的特性下,使得NAND更适用于Embedded System。 Flash Memory是一儲存裝置,若要使用此儲存裝置,亦須要在Flash Memory上使用File System。 Flash Memory是一储存装置,若要使用此储存装置,亦须要在Flash Memory上使用File System。 在一般的Block Device(eg Disk)上使用的File System,如:NTFS、FAT32和ext2等等,都可用於Flash Memory上,但是這些File System並非專為Flash所設計的,所以無針對Flash的特性去操作,因些需要透用FTL(Flash Translation Layer)將其做轉換的動作,如下圖所示:在一般的Block Device(eg 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所设计的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來做轉換,如圖二所示:使用此种Flash-Specific File System则不再需要透过FTL来做转换,如图二所示:
圖二图二
JFFS主要用於NOR Flash Memory上面,YAFFS則是用於NAND Flash Memory上。 JFFS主要用于NOR Flash Memory上面,YAFFS则是用于NAND Flash Memory上。 YAFFS是由Aleph One公司所製作,適用於相當多的Embedded Operation System,如:eCOS、WinCE等等,並且在GNU GPL的條款下,開放其原始碼,因此可自Aleph One公司取得YAFFS之原始碼並可加以修改,使之符合自己的需要。 YAFFS是由Aleph One公司所制作,适用于相当多的Embedded Operation System,如:eCOS、WinCE等等,并且在GNU GPL的条款下,开放其原始码,因此可自Aleph One公司取得YAFFS之原始码并可加以修改,使之符合自己的需要。 在此我們主要探討使用NAND Flash Memory的Flash-Specific File System-YAFFS。在此我们主要探讨使用NAND Flash Memory的Flash-Specific File System-YAFFS。
三、YAFFS基本架構及運作 三、YAFFS基本架构及运作
YAFFS為一For NAND Flash Memory的Flash-Specific File System,它在設計上必會針對NAND Flash Memory的特性來設計,如在Data Structure的設計上與平常的File System必定不同,還有專為Flash Memory設計的wear-leveling Algorithm以避免同一區塊過度存取而造成毀損等等。 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等的基本架構及運作。接下来则会介绍YAFFS所使用的Data Structures、Garbage Collection及Wear-Leveling等的基本架构及运作。
3.1 YAFFS Data Structure 3.1 YAFFS Data Structure
在一般的作業系統中,會使用Disk或其他儲存裝置以儲存檔案,並使用較快速度的RAM(Random Access Memory),將欲存取使用的檔案複製至RAM中,再進行存取,最後再寫回儲存裝置。在一般的作业系统中,会使用Disk或其他储存装置以储存档案,并使用较快速度的RAM(Random Access Memory),将欲存取使用的档案复制至RAM中,再进行存取,最后再写回储存装置。 利用RAM可加速整體的執行速度及效能。利用RAM可加速整体的执行速度及效能。 另外我們會設計一些Data Structure,包括在儲存裝置上使用的Data Structure及在RAM上使用的Data Structure。另外我们会设计一些Data Structure,包括在储存装置上使用的Data Structure及在RAM上使用的Data Structure。 在儲存裝置上使用的Data Structure是為了管理在儲存裝置上所儲存的資料及其屬性(如User ID、Group ID及存取權限等)等,而RAM-Resident用以管理從儲存裝置所讀出來的檔案及資料或是邏輯位址(Logical Address)對應到儲存裝置實體位址(Physical Address)的記錄表格等,如圖三及圖四。在储存装置上使用的Data Structure是为了管理在储存装置上所储存的资料及其属性(如User ID、Group ID及存取权限等)等,而RAM-Resident用以管理从储存装置所读出来的档案及资料或是逻辑位址(Logical Address)对应到储存装置实体位址(Physical Address)的记录表格等,如图三及图四。 如此系統可在RAM中迅速找到欲存取的資料或從儲存裝置中讀出資料到RAM中。如此系统可在RAM中迅速找到欲存取的资料或从储存装置中读出资料到RAM中。
圖三-從儲存裝置讀取資料至RAM中图三-从储存装置读取资料至RAM中
而YAFFS也有使用RAM-Resident Data Structure和On-Flash Data Structure。而YAFFS也有使用RAM-Resident Data Structure和On-Flash Data Structure。
以下列幾個YAFFS主要的物件(Object)皆屬於RAM-Resident 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:一个yaffs_Object可以是档案(File)、目录(Directory)、SoftLink或是Hardlink其中一种,而每一个yaffs_Object都会对应到一个yaffs_ObjectHeader,而yaffs_ObjectHeader则是用以储存此yaffs_Object的一些属性值,例如该yaffs_Object是File或是Directory,此yaffs_Object的parentObjectId为何…等等。 yaffs_Object亦有如下的目錄結構: yaffs_Object亦有如下的目录结构:
- parent:此欄位用以指向其父目錄(parent Directory)。 parent:此栏位用以指向其父目录(parent Directory)。
- siblings:此欄位用以連結同一個目錄下的所有yaffs_Object siblings:此栏位用以连结同一个目录下的所有yaffs_Object
- children:若此yaffs_Object為一個目錄,則此欄位會指向此目錄下的yaffs_Object集合。 children:若此yaffs_Object为一个目录,则此栏位会指向此目录下的yaffs_Object集合。
- yaffs_Tnode:yaffs_Tnodes構成一棵Tree Structure,此Tree Structure可加速搜尋一個File中的Data Chunk。 yaffs_Tnode:yaffs_Tnodes构成一棵Tree Structure,此Tree Structure可加速搜寻一个File中的Data Chunk。 當其File Size愈來愈大時,其Tree Structure的也會跟著長高,而其最高限制的Level為6。当其File Size愈来愈大时,其Tree Structure的也会跟着长高,而其最高限制的Level为6。 詳細資訊在接下來的部份會加以介紹。详细资讯在接下来的部份会加以介绍。
- yaffs_Device:yaffs_Device儲存裝置的相關資訊,類似於VFS(Virtual File System)的SuperBlock。 yaffs_Device:yaffs_Device储存装置的相关资讯,类似于VFS(Virtual File System)的SuperBlock。 儲存著用來存取MTD(Memory Technology Device)的資料或存取NAND Data的函數(Function)。储存着用来存取MTD(Memory Technology Device)的资料或存取NAND Data的函数(Function)。
每個yaffs_Object都會有一個yaffs_ObjectHeader,yaffs_ObjectHeader為On-Flash Data Structure。每个yaffs_Object都会有一个yaffs_ObjectHeader,yaffs_ObjectHeader为On-Flash Data Structure。 存在於Flash上,當Flash掛載上時,會為每個yaffs_Object找尋該物件的yaffs_ObjectHeader,讀出yaffs_Object的相關資訊。存在于Flash上,当Flash挂载上时,会为每个yaffs_Object找寻该物件的yaffs_ObjectHeader,读出yaffs_Object的相关资讯。 yaffs_ObjectHeader所儲存的資訊如下: yaffs_ObjectHeader所储存的资讯如下:
圖四-yaffs_ObjectHeader記錄內容图四-yaffs_ObjectHeader记录内容
- Name:yaffs_Object的名稱。 Name:yaffs_Object的名称。
- ParentObjectID:此欄位記錄yaffs_Object的父Object ID。 ParentObjectID:此栏位记录yaffs_Object的父Object ID。
- Type:說明此yaffs_Object是File、Directory、SoftLink或是HardLink。 Type:说明此yaffs_Object是File、Directory、SoftLink或是HardLink。
- Protection(Only For File):表示此yaffs_Object的權限為何。 Protection(Only For File):表示此yaffs_Object的权限为何。
- UID(File Only):屬於哪個User ID。 UID(File Only):属于哪个User ID。
- GID(File Only):屬於哪個Group ID。 GID(File Only):属于哪个Group ID。
- Time of Last Access(File Only):最後存取時間。 Time of Last Access(File Only):最后存取时间。
- Time of Last Modification(File Only):最後修改時間。 Time of Last Modification(File Only):最后修改时间。
- Time of Last Change(File Only): Time of Last Change(File Only):
- File Size(File Only):檔案大小。 File Size(File Only):档案大小。
- equivalentObjectID(HardLink Only):僅用於HardLink。 equivalentObjectID(HardLink Only):仅用于HardLink。
- Alias(SoftLink Only):僅用於SoftLink。 Alias(SoftLink Only):仅用于SoftLink。
- CheckSum:Name的Checksum,計算Name避免不一致。 CheckSum:Name的Checksum,计算Name避免不一致。
YAFFS的最小儲存單位為一個Page或Chunk,在YAFFS中Page及Chunk所佔的大小相同,因此可視為相同的東西,但實際上兩個名詞所表示的意義不同,Page所指的是NAND Flash Memory上的實體資料儲存區,而Chunk所表示的是yaffs_Object所配置到的邏輯資料儲存區,Chunk的Size可以和Page不同,但在YAFFS中是相同的。 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相同时,为一对一的关系,此时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相同时的对应关系
圖六-Page與Chunk Size不同時的對應關係(一個Chunk對應兩個Page)图六-Page与Chunk Size不同时的对应关系(一个Chunk对应两个Page)
資料儲存時是以一個Page一個Page的方式寫入。资料储存时是以一个Page一个Page的方式写入。 Block為多個Page所組成的一個單位,一個Block中有32個Page,Block亦為一個Erase Unit(即是以一個Block為單位做清除的動作)。 Block为多个Page所组成的一个单位,一个Block中有32个Page,Block亦为一个Erase Unit(即是以一个Block为单位做清除的动作)。 如圖七示:如图七示:
圖七图七
在Flash Memory掛載上時,其會先掃瞄過所有中的Block所有Pages,以便把所有的yaffs_Object在RAM中建立起來。在Flash Memory挂载上时,其会先扫瞄过所有中的Block所有Pages,以便把所有的yaffs_Object在RAM中建立起来。 根據讀到的Page其Spare Area中Tag的chunkID值的不同,會有下列不同的處理方法:根据读到的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中。 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。 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。建立完后再根据yaffs_ObjectHeader中的ParentObjectID到RAM中寻找对应的Parent yaffs_Object,并将原yaffs_Object中的Parent指向Parent yaffs_Object。
在掃描完所有的Block後,會把Flash Memory上的所有File、Directory、SoftLink或HardLink建立成對應的yaffs_Object,以便修改其屬性值。在扫描完所有的Block后,会把Flash Memory上的所有File、Directory、SoftLink或HardLink建立成对应的yaffs_Object,以便修改其属性值。 在建立完所有yaffs_Object及其與目錄之間的關係後,會在RAM中形成一種階層式(Hierarchy)的架構,如圖八所示:在建立完所有yaffs_Object及其与目录之间的关系后,会在RAM中形成一种阶层式(Hierarchy)的架构,如图八所示:
圖八图八
在YAFFS中,File中的Data是儲存在固定大小的Page中,其大小為512 Bytes,每一個Page亦會有一個對應的Spare,其大小為16 Bytes,用以儲存該Page的相關資料。在YAFFS中,File中的Data是储存在固定大小的Page中,其大小为512 Bytes,每一个Page亦会有一个对应的Spare,其大小为16 Bytes,用以储存该Page的相关资料。
圖九图九
Spare所儲存的資料如下所示: Spare所储存的资料如下所示:
圖十图十
- Tags: Tags:
- chunkID:指相對於此yaffs_Object的第幾個Chunk。 chunkID:指相对于此yaffs_Object的第几个Chunk。 當Chunk ID為0時,則表此Chunk所儲存的是yaffs_ObjectHeader。当Chunk ID为0时,则表此Chunk所储存的是yaffs_ObjectHeader。
- serialNumber:用以辨別哪個Chunk為最新的Chunk。 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会加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。 如下表所示:如下表所示:
|
|
說明:说明: 當系統發現有兩個相同chunkID的chunk,則檢查兩個chunk的serialNumber。当系统发现有两个相同chunkID的chunk,则检查两个chunk的serialNumber。 此圖可確定serialNumber為2的必定比serialNumber為1的還新,則將serialNumber為1的chunk設為Invalid。此图可确定serialNumber为2的必定比serialNumber为1的还新,则将serialNumber为1的chunk设为Invalid。 |
說明:说明: 若兩chunk的serialNumber如上,則比較方法為將其中一個chunk的serialNumber值取出,並做(serialNumber+1) mod 4,運算後的值x。若两chunk的serialNumber如上,则比较方法为将其中一个chunk的serialNumber值取出,并做(serialNumber+1) mod 4,运算后的值x。 若x等於另一個chunk的serialNumber,表示此chunk為較新的,則把另一個chunk設為Invalid。若x等于另一个chunk的serialNumber,表示此chunk为较新的,则把另一个chunk设为Invalid。 此圖即可確定serialNumber為0的較serialNumber為3的更新。此图即可确定serialNumber为0的较serialNumber为3的更新。 |
* byteCount:表示該yaffs_Object佔此Chunk多少個Byte。 * byteCount:表示该yaffs_Object占此Chunk多少个Byte。 |
- objectID:此Chunk屬於哪個Object的Objecct ID。 objectID:此Chunk属于哪个Object的Objecct ID。
- ECC:Tags的Error Correction Code。 ECC:Tags的Error Correction Code。
- unusedStaff:保留未使用的欄位。 unusedStaff:保留未使用的栏位。
- ECC Data:Data Chunk的Error Correction Code。 ECC Data:Data Chunk的Error Correction Code。
- Page Status:當值為0時,表示此值為Invalid。 Page Status:当值为0时,表示此值为Invalid。
- Block Status:保留未使用的欄位。 Block Status:保留未使用的栏位。
3.2 Tree Node Structure(Tnode Structure) 3.2 Tree Node Structure(Tnode Structure)
系統欲存取裝置上的Data時是以Logical Address(相對於該File所產生出來的偏移位址)的方式到所指定的位址進行存取,若欲到實體儲存裝置上取得Data,則須再經過一個機制的轉換,將Logical Address轉換為Physical Address(實際儲存裝置的位址),才可從儲存裝置上讀出Data至RAM中。系统欲存取装置上的Data时是以Logical Address(相对于该File所产生出来的偏移位址)的方式到所指定的位址进行存取,若欲到实体储存装置上取得Data,则须再经过一个机制的转换,将Logical Address转换为Physical Address(实际储存装置的位址),才可从储存装置上读出Data至RAM中。 這個機制最簡單的方法就是在RAM上建立一個Logical Address到Physical Address的對映表格(Mapping Table)。这个机制最简单的方法就是在RAM上建立一个Logical Address到Physical Address的对映表格(Mapping Table)。 直接將Logical Address對映至Physical Address。直接将Logical Address对映至Physical Address。 如圖十一所示:如图十一所示:
圖十一-在RAM中建立Logical Address對應至Physical Address的對映表格图十一-在RAM中建立Logical Address对应至Physical Address的对映表格
在YAFFS中也使用了Logical Address到Physical Address 的對映機制。在YAFFS中也使用了Logical Address到Physical Address的对映机制。 所使用的機制稱之為Tree Node Structure或Tnode Structure。所使用的机制称之为Tree Node Structure或Tnode Structure。
Flash Memory掛載時,YAFFS會為每個File在RAM中建立一個Tree,當有一個要求要存取某個Chunk(或Logical Address)時,則會經由Tree Node Structure的轉換方式,找到Chunk的Physical Address。 Flash Memory挂载时,YAFFS会为每个File在RAM中建立一个Tree,当有一个要求要存取某个Chunk(或Logical Address)时,则会经由Tree Node Structure的转换方式,找到Chunk的Physical Address。
使用Tree Node Structure的優點為位址轉換時間較迅速。使用Tree Node Structure的优点为位址转换时间较迅速。 Tree Node Structure的轉換Time Complexity為O(log N),若是直接使用Logical Address to Physical Address的Mapping Table,則位址轉換為線性搜尋(Linear Search),此種搜尋方式的Time Complexity為O(N)。 Tree Node Structure的转换Time Complexity为O(log N),若是直接使用Logical Address to Physical Address的Mapping Table,则位址转换为线性搜寻(Linear Search),此种搜寻方式的Time Complexity为O(N )。 YAFFS採用此種方式來做為位址轉換的機制可提升整體的存取速度。 YAFFS采用此种方式来做为位址转换的机制可提升整体的存取速度。
Tree Node Structure是由多個Tree Node(或Tnode)所組成。 Tree Node Structure是由多个Tree Node(或Tnode)所组成。 依據Level的不同而分成兩個部份:依据Level的不同而分成两个部份:
- Internal Tnode:每個Internal Tnode由8個Pointers所組成。 Internal Tnode:每个Internal Tnode由8个Pointers所组成。
- Lowest-Level Tnode(Level 0 Tnode):每個Lowest-Level Tnode由16個Entries所組成。 Lowest-Level Tnode(Level 0 Tnode):每个Lowest-Level Tnode由16个Entries所组成。
圖十二图十二
在Tree建立好後,當系統發出要存取該File的某個Chunk時,例如:Chunk 0x235,就要在Tree上做Traverse的動作,以找尋到要求的Chunk。在Tree建立好后,当系统发出要存取该File的某个Chunk时,例如:Chunk 0x235,就要在Tree上做Traverse的动作,以找寻到要求的Chunk。 Traverse的步驟如下: Traverse的步骤如下:
1. 將十六進制轉化為二進制:0x235 0000001000110101 1.将十六进制转化为二进制:0x235 0000001000110101
2. 將二進制切割成000.000.100.011.0101,每一個切割區代表一個Level,由於Lowest-Level包含有16個Entries,因此切割出4個Bit(Bit 3 to 0)。 2.将二进制切割成000.000.100.011.0101,每一个切割区代表一个Level,由于Lowest-Level包含有16个Entries,因此切割出4个Bit(Bit 3 to 0)。 Internal Level的Tnode皆包含8個Pointer,因此其餘皆切割為3個Bit。 Internal Level的Tnode皆包含8个Pointer,因此其余皆切割为3个Bit。
3. 根據所切割出來的Bit整理成下表: 3.根据所切割出来的Bit整理成下表:
Level Level | Bits Bits | Selected Value Selected Value |
3 or more if they exist 3 or more if they exist | >=10 >=10 | Zero Zero |
2 2 | 9 to 7 9 to 7 | 100 binary = 4 100 binary = 4 |
1 1 | 6 to 4 6 to 4 | 011 binary = 3 011 binary = 3 |
0 0 | 3 to 0 3 to 0 | 0101 binary = 5 0101 binary = 5 |
4. 根據表格中各Level的值進行Traverse。 4.根据表格中各Level的值进行Traverse。
Step1:Level 2100=4 Step1:Level 2100=4 | Step2:Level 1011=3 Step2:Level 1011=3 |
|
|
Step3:Level 00101=5 Step3:Level 00101=5 | |
|
當Tree Node Structure剛開始建立時,僅會建立Lowest-Level Tnode,當File所配置的Chunk數超過16個時,則此Tree會建立一個internal Tnode,並將其第0個Pointer指向原本的Lowest-Level Tnode。当Tree Node Structure刚开始建立时,仅会建立Lowest-Level Tnode,当File所配置的Chunk数超过16个时,则此Tree会建立一个internal Tnode,并将其第0个Pointer指向原本的Lowest- Level Tnode。 當讀取到的Chunk數愈來愈多時,會一直新增Tnode,且Tree亦會愈來愈高,其Max-Level最大為6。当读取到的Chunk数愈来愈多时,会一直新增Tnode,且Tree亦会愈来愈高,其Max-Level最大为6。
Step1 Step1 | Step2 Step2 |
|
|
Step3 Step3 | Step4 Step4 |
|
|
在File已在RAM建立好Tree Node Structure後,若此File的Size變大時,則會再多配置Chunk給此File,在將Data寫入至Page後,則會去更新File的Tree Node Structure,將新配置到的Chunk加入至Tree Node Structure中,更改步驟如下:在File已在RAM建立好Tree Node Structure后,若此File的Size变大时,则会再多配置Chunk给此File,在将Data写入至Page后,则会去更新File的Tree Node Structure,将新配置到的Chunk加入至Tree Node Structure中,更改步骤如下:
1. 搜尋新配置到的Chunk ID。 1.搜寻新配置到的Chunk ID。
2. 若在Internal-Level搜尋的過程中,發現沒有Tnode,則建立一個Internal-Level的Tnode。 2.若在Internal-Level搜寻的过程中,发现没有Tnode,则建立一个Internal-Level的Tnode。
3. 當搜尋到Lowest-Level時,若也無Tnode存在,則建立一個Lowest-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。 4.根据Chunk ID中Level 0所代表的值x,到Lowest-Level Tnode中的第x个Entry中检查有无该Chunk的实体位址存在,若没有则将实体位址填入该Entry,若已存在则将比较两Chunk在Spare中的serialNumber,将较新的Chunk的实体位址写入该Entry中,并将旧的Chunk设为Invalid。
1. 搜尋新配置到的Chunk ID 1.搜寻新配置到的Chunk ID | 2. 在Internal-Level搜尋過程中,發現無Tnode存在,建立一Tnode 2.在Internal-Level搜寻过程中,发现无Tnode存在,建立一Tnode |
|
|
3. 在搜尋過程中,發現無Lowest-Level Tnode存在,則建立一Lowest-Level Tnode,並將該Chunk ID寫入對應的Entry中 3.在搜寻过程中,发现无Lowest-Level Tnode存在,则建立一Lowest-Level Tnode,并将该Chunk ID写入对应的Entry中 | |
|
3.3 YAFFS Garbage Collection 3.3 YAFFS Garbage Collection
Garbage Collection主要是用於將已不必要存在且浪費空間的Block做回收的動作,以增加可用的Block數。 Garbage Collection主要是用于将已不必要存在且浪费空间的Block做回收的动作,以增加可用的Block数。 而Garbage Collection只有某些事件發生時才會執行。而Garbage Collection只有某些事件发生时才会执行。
在YAFFS中只有在下列事件發生時會執行Garbage Collection:在YAFFS中只有在下列事件发生时会执行Garbage Collection:
- 將Data寫入Flash Memory将Data写入Flash Memory
- 更新yaffs_ObjectHeader更新yaffs_ObjectHeader
而YAFFS的Garbage Collection又分成兩種Mode:Aggressive Mode及Passive Mode,其相異點如下表所示:而YAFFS的Garbage Collection又分成两种Mode:Aggressive Mode及Passive Mode,其相异点如下表所示:
Aggressive Mode Aggressive Mode | Passive Mode Passive Mode | |
執行條件执行条件 | ErasedBlocks <= (PreservedBlocks + 1) ErasedBlocks <= (PreservedBlocks + 1) ErasedBlocks:空Block數 ErasedBlocks:空Block数 PreservedBlocks:保留Block數 PreservedBlocks:保留Block数 |
ErasedBlocks > (PreservedBlocks + 1) ErasedBlocks > (PreservedBlocks + 1) |
檢查回合數检查回合数 | Iterations = (EndBlock-StartBlock) + 1 Iterations = (EndBlock-StartBlock) + 1 |
1. Iterations=(EndBlock-StartBlock) + 1 1. Iterations=(EndBlock-StartBlock) + 1 2. Iterations = Iterations / 16 2. Iterations = Iterations / 16 3. Iterations = 200 if Iterations >200 3. Iterations = 200 if Iterations >200 |
YAFFS的Garbage Collection執行步驟如下: YAFFS的Garbage Collection执行步骤如下:
1. 從currentDirtyChecker到End Block之間尋找Dirtiest Block(包含最多Invalid Chunk的Block) 1.从currentDirtyChecker到End Block之间寻找Dirtiest Block(包含最多Invalid Chunk的Block)
圖十三图十三
2. 將currentDirtyChecker重置至所發現的Dirtiest Block的位置 2.将currentDirtyChecker重置至所发现的Dirtiest Block的位置
圖十四图十四
3. 將Dirtiest Block中的Valid Page複製至其他的Empty Chunk中。 3.将Dirtiest Block中的Valid Page复制至其他的Empty Chunk中。
圖十五图十五
4. 再將Dirtiest Block清除成Empty Block。 4.再将Dirtiest Block清除成Empty Block。
圖十六图十六
3.4 Wear-Leveling 3.4 Wear-Leveling
當Flash Memory在使用時,常常會對Flash Memory內的某個檔案做修改的動作,若此時檔案的大小更動而需要更多Page時,且在Flash Memory內仍有空的Block,則會配置空的Block給該檔案,若Flash Memory內已無空的Block,則會執行Garbage Collection的動作,清出空的Block以供使用。当Flash Memory在使用时,常常会对Flash Memory内的某个档案做修改的动作,若此时档案的大小更动而需要更多Page时,且在Flash Memory内仍有空的Block,则会配置空的Block给该档案,若Flash Memory内已无空的Block,则会执行Garbage Collection的动作,清出空的Block以供使用。 而在挑選空Block或使用Garbage Collection時挑選Dirtiest Block時,可能會造成部份的Block常常被挑選,而其他Block則很少被挑選配置。而在挑选空Block或使用Garbage Collection时挑选Dirtiest Block时,可能会造成部份的Block常常被挑选,而其他Block则很少被挑选配置。
圖十七图十七
由於Flash Memory的特性,那些常常被挑選的Block可能會因為過度的使用而造成損毀,為了避免這種負擔不均的情形發生,因此在大部份的Flash-Specific File System上都會設計一種方法以避免此種情形發生,此方法即稱為Wear-Leveling。由于Flash Memory的特性,那些常常被挑选的Block可能会因为过度的使用而造成损毁,为了避免这种负担不均的情形发生,因此在大部份的Flash-Specific File System上都会设计一种方法以避免此种情形发生,此方法即称为Wear-Leveling。
使用Wear-Leveling時,在挑選Block時不會常常固定在某幾個Block上,而可使大部份Block的存取次數能夠平均,不會造成部份Block過度存度而造成毀損。使用Wear-Leveling时,在挑选Block时不会常常固定在某几个Block上,而可使大部份Block的存取次数能够平均,不会造成部份Block过度存度而造成毁损。
圖十八图十八
在YAFFS中並沒有明確的使用Wear-Leveling,而是以下面兩種策略取代:在YAFFS中并没有明确的使用Wear-Leveling,而是以下面两种策略取代:
1. 保留部份Block,若部份Block毀損時可使用保留的Block取代。 1.保留部份Block,若部份Block毁损时可使用保留的Block取代。
2. 使用「隨機挑選Block」(Random Block Selection),如此可避免不常被挑選的Block一直沒人使用。 2.使用「随机挑选Block」(Random Block Selection),如此可避免不常被挑选的Block一直没人使用。
但是實際在觀察YAFFS的原始碼時,並未發現有使用"Random Block Selection",在詢問YAFFS作者Charles Manning是否有將"Random Block Selection"實作出來後,其回信如下:但是实际在观察YAFFS的原始码时,并未发现有使用"Random Block Selection",在询问YAFFS作者Charles Manning是否有将"Random Block Selection"实作出来后,其回信如下:
「No it is not. 「No it is not.
For the most part wear levelling is not a problem for a log-structured file 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. 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 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 locations. Some blocks (eg. those used for storing the FAT tables) get
heavily used. heavily used.
I have done some very heavy accelerated lifetime testing (eg writing over 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 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」 issues. Very few blocks had reached even one tenth of their lifetime」
在Charles Manning信中提到YAFFS實際上並未使用"Random Block Selection",因此YAFFS的Wear-Leveling所依賴的只有第一個策略而已。在Charles Manning信中提到YAFFS实际上并未使用"Random Block Selection",因此YAFFS的Wear-Leveling所依赖的只有第一个策略而已。
3.5 Partial Page Programming 3.5 Partial Page Programming
當我們要將Data寫入某個Page時,會先將該Page清除(Erase),即該Page的內容全為1,因為在Flash Memory中,僅能將Bit 1改成Bit 0,所以在清除過後所有的Bits皆會為1。当我们要将Data写入某个Page时,会先将该Page清除(Erase),即该Page的内容全为1,因为在Flash Memory中,仅能将Bit 1改成Bit 0,所以在清除过后所有的Bits皆会为1。 在清除Page後才能將資料寫入,例如Page內的Data為10111010,要將之改成01010101,則會先將Page清除為11111111,再更改成01010101。在清除Page后才能将资料写入,例如Page内的Data为10111010,要将之改成01010101,则会先将Page清除为11111111,再更改成01010101。
圖十九图十九
在NAND Flash Memory中,存取資料的最小單位為一個Page。在NAND Flash Memory中,存取资料的最小单位为一个Page。 若使用Partial Page Programming則修改Page中的Data時可以更改部份的Bit而不需要將Page Erase後才更改。若使用Partial Page Programming则修改Page中的Data时可以更改部份的Bit而不需要将Page Erase后才更改。 例如Page中的Data為10111010,要將該Data改成10100010則只需將其中兩個Bit更改為0即可,不需先Erase再寫入。例如Page中的Data为10111010,要将该Data改成10100010则只需将其中两个Bit更改为0即可,不需先Erase再写入。
圖二十图二十
使用Partial Page Programming常會發生一種問題,即是在更改Bit的時候可能會有"走樣"的情況而有沒有完全更改過來,例如Page中的Data為11111111,欲將之改成00000000,但在更改的時候卻未完全更改過來,而使的更改後的資料可能變為00111101,仍有部份的Bit未更改為0。使用Partial Page Programming常会发生一种问题,即是在更改Bit的时候可能会有"走样"的情况而有没有完全更改过来,例如Page中的Data为11111111,欲将之改成00000000,但在更改的时候却未完全更改过来,而使的更改后的资料可能变为00111101,仍有部份的Bit未更改为0。
圖二十一图二十一
在YAFFS中也使用了Partial Page Programming,主要用於將某個Page設為Invalid,即更改該Page的Spare中pageStatus。在YAFFS中也使用了Partial Page Programming,主要用于将某个Page设为Invalid,即更改该Page的Spare中pageStatus。 當Page為Valid時,其Spare內的pageStatus內容為全1的狀態,即未更改pageStatus,若要將近改為Invalid,則將pageStatus內容改為0(即全為0)即可。当Page为Valid时,其Spare内的pageStatus内容为全1的状态,即未更改pageStatus,若要将近改为Invalid,则将pageStatus内容改为0(即全为0)即可。 但是由於Partial Page Programming會導致的錯誤,使得pageStatus的內容可能會無法更改為0,因此在YAFFS中則採用了一種方法,即更改後的值,其值的二進制中,Bit為1的個數若小於6,則表示該Page為Invalid。但是由于Partial Page Programming会导致的错误,使得pageStatus的内容可能会无法更改为0,因此在YAFFS中则采用了一种方法,即更改后的值,其值的二进制中,Bit为1的个数若小于6,则表示该Page为Invalid。 否則視為Valid Page。否则视为Valid Page。
圖二十二图二十二
四、Performance Measurements 四、Performance Measurements
Flash-Specific File System有相當多的選擇,欲使用何種File System端看於設計者的需求,但在相同的需求下,該挑選何種File System則可依其執行效能及該File System可能額外所耗去的資源來做考量,在此則會評估使用yaffs在nandsim上時的效能及其可能所耗用的額外資源等。 Flash-Specific File System有相当多的选择,欲使用何种File System端看于设计者的需求,但在相同的需求下,该挑选何种File System则可依其执行效能及该File System可能额外所耗去的资源来做考量,在此则会评估使用yaffs在nandsim上时的效能及其可能所耗用的额外资源等。
4.1 環境建置 4.1环境建置
測試yaffs與nandsim的效能之Hardware及Software環境如下:测试yaffs与nandsim的效能之Hardware及Software环境如下:
Hardware Hardware | Software Software |
CPU Intel Dual Core 3.0GHz CPU Intel Dual Core 3.0GHz RAM 1.0 GHz Dual Channel RAM 1.0 GHz Dual Channel Number of CPUs 1 Number of CPUs 1 Disk subsystem SATA Disk subsystem SATA |
OS Windows XP SP2 OS Windows XP SP2 Other VMWare 5.0(Fedora Core 5+512 MB+yaffs2+Linux Kernel 2.6.17.9+nandsim) Other VMWare 5.0(Fedora Core 5+512 MB+yaffs2+Linux Kernel 2.6.17.9+nandsim) |
在Fedora Core 5的NANDSim掛載時,亦需加入參數如下:在Fedora Core 5的NANDSim挂载时,亦需加入参数如下:
modprobe nandsim second_id_byte=0x71 access_delay=180 programm_delay=520 erase_delay=1.85 modprobe nandsim second_id_byte=0x71 access_delay=180 programm_delay=520 erase_delay=1.85 second_id_byte:設定Nandsim大小,其參數值參考nand_ids.c second_id_byte:设定Nandsim大小,其参数值参考nand_ids.c access_delay:Initial page access delay(micro second) access_delay:Initial page access delay(micro second) programm_delay:Page Program Delay(micro second) programm_delay:Page Program Delay(micro second) erase_delay:Sector erase delay(milli second) erase_delay:Sector erase delay(milli second) |
4.2 Andrew Benchmark 4.2 Andrew Benchmark
Andrew Benchmark主要的測試步驟分為五個階段: Andrew Benchmark主要的测试步骤分为五个阶段:
- Phase 1:Creating Directories Phase 1:Creating Directories
- 使用指令為:mkdir使用指令为:mkdir
- Phase 2:Copying Files Phase 2:Copying Files
- 使用指令為:cp使用指令为:cp
- Phase 3:Recursive Directory Stats Phase 3:Recursive Directory Stats
- 使用指令為:ls -l使用指令为:ls -l
- Phase 4:Scanning each file Phase 4:Scanning each file
- 使用指令為:grep+wc使用指令为:grep+wc
- Phase 5:Compilation Phase 5:Compilation
- 使用指令為:make使用指令为:make
使用Andrew Benchmark會挑選一合適的Source Tree來做Benchmark,其中會包含多個檔案以供執行Andrew Benchmark的時候使用,在此測試中共有71個檔案。使用Andrew Benchmark会挑选一合适的Source Tree来做Benchmark,其中会包含多个档案以供执行Andrew Benchmark的时候使用,在此测试中共有71个档案。 其File Size Range所佔的百分比如下:其File Size Range所占的百分比如下:
圖二十三图二十三
在完成所有環境建置後,即開始進行Andrew Benchmark的測試,其測試的結果如下圖:在完成所有环境建置后,即开始进行Andrew Benchmark的测试,其测试的结果如下图:
圖二十四图二十四
在執行Andrew Benchmark時,其執行過程中會將其Source Tree的內容複製至目的地,在此我們則要測試除了原本的Source Tree所佔的空間外,yaffs額外所使用的管理空間約佔多少。在执行Andrew Benchmark时,其执行过程中会将其Source Tree的内容复制至目的地,在此我们则要测试除了原本的Source Tree所占的空间外,yaffs额外所使用的管理空间约占多少。
在執行完Andrew Benchmark後,算出原本Andrew Benchmark Source Tree所佔的空間及執行後Source Tree在nandsim上所佔的空間如下圖所示:在执行完Andrew Benchmark后,算出原本Andrew Benchmark Source Tree所占的空间及执行后Source Tree在nandsim上所占的空间如下图所示:
圖二十五图二十五
在執行完Andrew Benchmark後發現,在nandsim上一模一樣的Source Tree卻比原本的Source Tree多出了59.47k,這是yaffs在管理檔案所花費的額外成本,例如每個檔案所佔的Spare Area等等,都會耗用額外的空間。在执行完Andrew Benchmark后发现,在nandsim上一模一样的Source Tree却比原本的Source Tree多出了59.47k,这是yaffs在管理档案所花费的额外成本,例如每个档案所占的Spare Area等等,都会耗用额外的空间。
4.3 Multiprogramming with/without hot/cold Data 4.3 Multiprogramming with/without hot/cold Data
在此測試中,會包含兩種Task:在此测试中,会包含两种Task:
- TaskA:Sequentially Write 16K Bytes of Data(Hot Data) TaskA:Sequentially Write 16K Bytes of Data(Hot Data)
- TaskB:Repeatedly Update 16 Bytes of Data(Cold Data) TaskB:Repeatedly Update 16 Bytes of Data(Cold Data)
根據上述Tasks,執行下列六種執行方式,並會在各個方式下產生Response Time及Throughput,其中(x,y)表示有x個TaskA及y個TaskB同時執行:根据上述Tasks,执行下列六种执行方式,并会在各个方式下产生Response Time及Throughput,其中(x,y)表示有x个TaskA及y个TaskB同时执行:
- (0,1):Update 16 Bytes of Data (0,1):Update 16 Bytes of Data
- (1,0):Write 16K Bytes of Data (1,0):Write 16K Bytes of Data
- (1,1):Mixture of Hot Data and Cold Data (1,1):Mixture of Hot Data and Cold Data
- (2,2):Multiprogramming Testing (2,2):Multiprogramming Testing
- (4,4):Multiprogramming Testing (4,4):Multiprogramming Testing
- (8,8):Multiprogramming Testing (8,8):Multiprogramming Testing
在執行完後,針對TaskA及TaskB觀察在各種執行方式下的Response Time及Throughput。在执行完后,针对TaskA及TaskB观察在各种执行方式下的Response Time及Throughput。 針對Response Time的部份,是以RDTSC的方式取得暫存器中的Clock數,Clock數愈多,表示其所花費的時間愈長。针对Response Time的部份,是以RDTSC的方式取得暂存器中的Clock数,Clock数愈多,表示其所花费的时间愈长。
- TaskA TaskA
- Response Time Response Time
圖二十六-Response Time of TaskA图二十六-Response Time of TaskA
在TaskA的Response Time中,在各種執行方式下,由於其TaskA的數量是以指數遞增,而其Respnose Time在統計圖中亦以指數呈現上升的趨勢,可知在TaskA數量愈多的情況下,其回應時間愈長。在TaskA的Response Time中,在各种执行方式下,由于其TaskA的数量是以指数递增,而其Respnose Time在统计图中亦以指数呈现上升的趋势,可知在TaskA数量愈多的情况下,其回应时间愈长。
- Throughput Throughput
圖二十七-Throughput of TaskA图二十七-Throughput of TaskA
在TaskA的Throughput中,其統計圖與TaskA的Response Time呈現相反的情況,亦即其圖形是以指數遞減的趨勢,表示當TaskA的數量愈來愈多時,其Throughput愈低。在TaskA的Throughput中,其统计图与TaskA的Response Time呈现相反的情况,亦即其图形是以指数递减的趋势,表示当TaskA的数量愈来愈多时,其Throughput愈低。
- TaskB TaskB
- Response Time Response Time
圖二十八-Response Time of TaskB图二十八-Response Time of TaskB
在統計圖中TaskB的Response Time亦與TaskA相同,當TaskB數量愈多,其Respnose Time亦愈高(表示愈慢)。在统计图中TaskB的Response Time亦与TaskA相同,当TaskB数量愈多,其Respnose Time亦愈高(表示愈慢)。
- Throughput Throughput
圖二十九-Throughput of TaskB图二十九-Throughput of TaskB
TaskB的Throughput亦會因為TaskB的個數增加而逐漸降低,表示當系統對nandsim做存取時,TaskB個數愈多,其每秒寫入的Byte數會逐漸減少。 TaskB的Throughput亦会因为TaskB的个数增加而逐渐降低,表示当系统对nandsim做存取时,TaskB个数愈多,其每秒写入的Byte数会逐渐减少。
五、結論 五、结论
YAFFS為目前常用的一種NAND Flash Memory的Flash-Specific File System。 YAFFS为目前常用的一种NAND Flash Memory的Flash-Specific File System。 因此對YAFFS有個深度的了解將對Flash-Specific File System的製作或對YAFFS的修改都有很大的幫助。因此对YAFFS有个深度的了解将对Flash-Specific File System的制作或对YAFFS的修改都有很大的帮助。 在比較YAFFS和JFFS2之後,針對YAFFS相對於JFFS2的優劣做以下的禪述。在比较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)。在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在这边的效率是明显的比JFFS2差了一点。
YAFFS採用Tree Node Structure,將之儲存在RAM中,當系統需要某一File的某一Chunk時,即可透過Tree Node Structure進行搜尋的動作,其搜尋的Time Complexity相當於O(log N),可迅速的找到所需要的Chunk。 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,因此还是会造成部份的Block过度存取,会造成此结果的另一原因也是因为YAFFS在Wear-Leveling的应对策略"Random Block Selection"上并未实际做出来。 在YAFFS的Wear-Leveling上可參考yaffs2的做法,在某個次數下則使用"Random Block Selection",可有效的平均每個Block的存取次數。在YAFFS的Wear-Leveling上可参考yaffs2的做法,在某个次数下则使用"Random Block Selection",可有效的平均每个Block的存取次数。
使用Partial Page Programming會使得NAND Flash Memory的硬體設計上相對的較困難,因此新的NAND Flash Memory已不允許再使用Partial Page Programming,所以在YAFFS2上已不再使用Partial Page Programming。使用Partial Page Programming会使得NAND Flash Memory的硬体设计上相对的较困难,因此新的NAND Flash Memory已不允许再使用Partial Page Programming,所以在YAFFS2上已不再使用Partial Page Programming。 YAFFS亦不可在新的NAND Flash Memory上使用,因為其使用的Partial Page Programming可能會造成資料上的錯誤。 YAFFS亦不可在新的NAND Flash Memory上使用,因为其使用的Partial Page Programming可能会造成资料上的错误。
針對YAFFS劣於JFFS2的部份,也許可以將其部份加以修改,優化其執行效率,使之符合我們的需求。针对YAFFS劣于JFFS2的部份,也许可以将其部份加以修改,优化其执行效率,使之符合我们的需求。
References References
- Aleph One Aleph One
- http://203.208.37.132/translate_c?hl=zh-CN&sl=zh-TW&u=http://www.aleph1.co.uk/&prev=/search%3Fq%3Dyaffs_ObjectHeader%26hl%3Dzh-CN%26client%3Daff-cs-maxthon%26hs%3DuDH%26newwindow%3D1&usg=ALkJrhguBQLrZUevfFsrxDNoCeQ29KLcoQ http://203.208.37.132/translate_c?hl=zh-CN&sl=zh-TW&u=http://www.aleph1.co.uk/&prev=/search%3Fq%3Dyaffs_ObjectHeader%26hl%3Dzh-CN%26client%3Daff-cs-maxthon%26hs%3DuDH%26newwindow%3D1&usg=ALkJrhguBQLrZUevfFsrxDNoCeQ29KLcoQ
- Memory Technology Device(MTD) Subsystem for Linux Memory Technology Device(MTD) Subsystem for Linux
- http://203.208.37.132/translate_c?hl=zh-CN&sl=zh-TW&u=http://www.linux-mtd.infradead.org/&prev=/search%3Fq%3Dyaffs_ObjectHeader%26hl%3Dzh-CN%26client%3Daff-cs-maxthon%26hs%3DuDH%26newwindow%3D1&usg=ALkJrhgoa0eFK21pli_1vK8JZAI9tdP0VQ http://203.208.37.132/translate_c?hl=zh-CN&sl=zh-TW&u=http://www.linux-mtd.infradead.org/&prev=/search%3Fq%3Dyaffs_ObjectHeader%26hl%3Dzh-CN%26client%3Daff-cs-maxthon%26hs%3DuDH%26newwindow%3D1&usg=ALkJrhgoa0eFK21pli_1vK8JZAI9tdP0VQ
Category : Independent Study Category : Independent Study