---
# System prepended metadata

title: Flash Memory File System
tags: [lesson, rteslab]

---

# Flash Memory File System
###### tags: `lesson` `rteslab`
---

架構:
FMFS出現原因
NAND.NOR特性
FMFS架構
	MTD
各FS特點(比較表)
	JFFS2
	UBIFS
	YAFFS
補充
	exFAT

---
>待補清單
>UBIFS 找檔流程
>YASSF 垃圾收集 週期
>exFAT boundary alignment能有助於flash file system原因:
>跟flash硬體有關
>若沒對齊造成跨頁，會浪費兩個區塊的壽命
>有對齊則可優化
>
---
書面報告
>https://hackmd.io/AoyMuVsoT7qWzOJmDbEiEg

---
>電腦上通行的大部份檔案系統，都是針對碟盤儲存裝置設計的，應用到快閃記憶體上並不適合。一般的檔案系統，可以透過快閃記憶體轉換層（Flash Translation Layer，FTL）寫入快閃記憶體，但是它的缺點是寫入的效率較差。因此，設計快閃記憶體檔案系統仍然是有必要的。

>儘管磁碟檔案系統也能在快閃記憶體上使用，但快閃記憶體檔案系統是快閃記憶體裝置的首選，理由如下：

- 擦除區塊：快閃記憶體的區塊在重新寫入前必須先進行擦除。擦除區塊會占用相當可觀的時間。因此，在裝置空閒的時候擦除未使用的區塊有助於提高速度，而寫入資料時也可以優先使用已經擦除的區塊。
- 隨機存取：由於在磁碟上尋址有很大的延遲，磁碟檔案系統有針對尋址的最佳化，以儘量避免尋址。但快閃記憶體沒有尋址延遲。
- 寫入平衡（Wear levelling）：快閃記憶體中經常寫入的區塊往往容易損壞。快閃記憶體檔案系統的設計可以使資料均勻地寫到整個裝置。

>老FileSystem對flash較好原因:
>寫入次數較少

[MTD](https://zh.wikipedia.org/wiki/MTD)

http://mark-shih.blogspot.com/2012/10/mtd-devmtddevmtdblok.html
MTD 是一個subsystem，用來簡化底層的flash device (ROM/NAND/OneNAND/NOR)的driver。在MTD下，driver只需提供read/write/erase的功能，而不需知道其上是使用FTL (Flash Translation Layer)，還是FFS (Flash File System)。
為了讓既有的filesystem(fat/ext/xfs...)能用在flash device上，就需要FTL這個software layer。mtdblock就是其中一種FTL。要注意的是使用FTL時，如果改了其中一個sector，就必須讀一整個eraseblock到 memory，然後erase，最後再把整個eraseblock寫回，顯然cost很高。

具有 eraseblocks 的特微，而不是像硬碟一樣使用叢集。
eraseblocks (32KiB ~ 128KiB) 跟硬碟的 sector size（512 到 1024 bytes）比起來要大很多。
操作上主要分作三個動作： 從 eraseblock 讀取、寫入 eraseblock 、還有就是清除 eraseblock 。
壞掉的 eraseblocks 無法隱藏，需要軟體加以處理。
eraseblocks 的壽命大約會在 104 到 105 的清除動作之後結束。

像USB隨身碟、多媒體記憶卡（MMC）、SD卡、CF卡等其他流行的可移動儲存器要和MTD區分開來，雖然它們也叫「flash」，但它們不是使用MTD技術的儲存器

http://www.linux-mtd.infradead.org/faq/general.html#L_mtd_what
|Block device|MTD device|
|-|-|
|Consists of sectors|Consists of eraseblocks|
|Sectors are small (512, 1024 bytes)|Eraseblocks are larger (typically 128KiB)|
|Maintains 2 main operations: read sector and write sector|Maintains 3 main operations: read from eraseblock, write to eraseblock, and erase eraseblock|
|Bad sectors are re-mapped and hidden by hardware (at least in modern LBA hard drives); in case of FTL devices it is the responsibility of FTL to provide this|Bad eraseblocks are not hidden and should be dealt with in software|
|Sectors are devoid of the wear-out property (in FTL devices it is the responsibility of FTL to provide this)|Eraseblocks wear-out and become bad and unusable after about 103 (for MLC NAND) - 105 (NOR, SLC NAND) erase cycles|

SSD特性
https://kknews.cc/zh-tw/tech/k8xgvy8.html



### 物理特性


| | NOR | NAND | 
|-| -------- | -------- | 
|| 可原地執行 |  | 
|寫入速度| 慢 | 快 | 
|寫入單位| 1擦除區 | 1page |
|擦除速度| 慢 | 快 | 
|擦除單位| 1擦除區 | 1擦除區 | 
|適合容量| 小 | 大 | 
|位元線|每個位元都有|多個位元一個|
|隨機存取(位元)|有|無，只能連續存取|
(1擦除區約為16~128kBytes)
(1page可能為512,2048,4096,8192Bytes)

NOR可原地執行 NAND容易有壞塊而使程式碼不連續 
NOR每次寫入擦除都是以一擦除塊為單位
NOR常用在不需經常更新的程式 例如BIOS與韌體

快閃記憶體可分為頁(Page)、帶外區(OOB)、擦除塊(Block)。
- 頁就是快閃記憶體讀取及寫入的最小單位，依顆粒製成不同有512，2048，4096，8192位元組。
- 帶外區是每一個頁在實體的結構中實際數據位元組之外的使用空間，若以2048位元組為一頁為例，每一個頁在實體的結構中除了2048位元組的使用空間，還會有64位元組額外的容量，供硬體以及軟體儲存一些額外的資訊，通常會用來儲存糾錯碼的數據，來校正快閃記憶體使用久後會有位元不能使用的問題。
- 擦除塊為快閃記憶體擦除的最小單位, 每64或128頁即為一個擦除塊，因為頁大小會有不同，擦除塊也就不同。一顆晶片裡有多少擦除塊，是依快閃記憶體的大小而定，但通常是2的冪次方。

NAND結構:
	2D
		SLC 1單元1bit2狀態
		MLC	1單元2bit4狀態
		TLC	1單元3bit8狀態
	3D還沒好
	
|製成結構|單層單元(SLC)|多層單元(MLC)|三層單元(TLC)|四層儲存單元(QLC)
|-|-|-|-|-|
|每晶體儲存單位|1 位元|2 位元|3 位元|4位元
|寫入速度|200–300微秒每頁|600 - 900微秒|每頁|900–1350微秒每頁
|讀取速度|25微秒每頁|50微秒每頁|75微秒每頁
|擦除速度|1.5~2微秒每擦除塊|3微秒每擦除塊|4.5微秒每擦除塊
|使用壽命|5萬到10萬次寫入|3千到1萬次寫入|五百到1千次寫入

	

## FFS2
最早

## JFFS2
JFFS2是專為小型快閃記憶體設計的快閃記憶體檔案系統。可以使用在NOR或NAND快閃記憶體上，僅在SLC架構中使用，含有多種壓縮模式可以選用。此設計的檔案系統基本結構之儲存最小單位為一節點，每個節點都包含檔案資訊；屬於同一檔案的節點，則可以指向同一檔案的節點位置，也增加意外斷電時，可找回數據資料的可能性。在JFFS2寫入操作時，會立即寫入快閃記憶體，藉由主記憶體結構更新節點位置，加快讀取速度。因為並無目錄紀錄檔案位置，在掛載時需要掃描整個快閃記憶體，隨著儲存空間的增大，掛載時間也隨之增加。

[原始論文](https://www.kernel.org/doc/mirror/ols2001/jffs2.pdf)
ISO690
WOODHOUSE, David. JFFS: The journalling flash file system. In: Ottawa linux symposium. 2001.
https://baike.baidu.com/item/jffs2

![](https://i.imgur.com/0W9401e.png)

下一代是UBIFS與LogFS
### UBIFS
![](https://i.imgur.com/SLvd5Az.png)





## YAFFS
Yet Another Flash File System
屬於Log-structured file systems
有YAFFS與YAFFS2
YAFFS2可支援到2K per page, 遠高於YAFFS的512 bytes, 因此對大容量NAND Flash更具優勢

Yaffs1 is a simpler mode of operation that uses deletion markers to track state.
● Yaffs2 is a more complex mode of operating that was developed to support larger
flash types that cannot used deletion markers.
● Yaffs means operations common to both.

YAFFS採用Tree Node Structure，
由多個Tree Node（Tnode）所組成，
Tnode又分成Internal Tnode與Lowest-Level Tnode，
其中Internal Tnode由8個Pointers所組成，
Lowest-Level Tnode由16個Entries所組成，
其時間複雜度（Time Complexity）相當於O(log N)，
故位址轉換時間較迅速。

官網介紹
https://archive.is/1WjyJ
https://web.archive.org/web/20071006090305/http://www.yaffs.net/

配合NAND記憶體特性開發的檔案系統
從MTD(記憶體裝置)得到的NAND頁大小而分配chunk大小，每chunk就是一頁

16~20頁

>學長的論文有JFFS2跟YAFFS2跟UBIFS的比較

Yaffs1 uses deletion markers, which
breaks the sequential write rule. Yaffs2 does not use deletion markers

識別符號為YAFFS2判別檔案型別如目錄、文件等等。
父節點編號為記錄上層節點編號，通常是目錄節點；若是根目錄則為0
名字為檔案名稱可存放255位元組。
重規劃檔案大小是由於配合快閃記憶體檔案系統運作出現的，由於一份檔案的元資料只會出現在Chunk為0的節點，所以若是有檔案原來為10M的資料改變其中5M的資料只寫入3M時，會有2M的資料空洞產生。此時就需要加以記錄改變後的大小與記錄符號連接，而不使檔案資料遺失。
檔案識別符號為虛擬檔案系統辨別檔案的型別、創建時間、修改時間等等。
檔案大小則為此檔案的資料量，由於只有一個元資料，這也表示提取多少Chunk有此元資料決定。
最後是硬連接與符號連接


### UBIFS
https://zh.wikipedia.org/wiki/UBIFS
UBI相當於UBIFS的FTL
作用是實現垃圾回收


## exFAT

由FAT32演變

https://zh.wikipedia.org/wiki/ExFAT
https://blog.gtwang.org/windows/ntfs-vs-fat-exfat-file-system/

https://baike.baidu.com/item/exFAT
为了解决FAT32等不支持4G及其更大的文件而推出。对于闪存，NTFS文件系统不适合使用，exFAT更为适用。对于磁盘则不太适用

與其他FS比較表

https://www.eassos.cn/jiao-cheng/ying-pan/file-system.php
FAT兩大限制:
1、FAT分区中的单个文件不能大于4G；2、通常FAT分区的容量不能大于32G，否则效率会很低

https://en.wikipedia.org/wiki/ExFAT#Flash_optimizations
exFAT contains a few features that, according to Microsoft, makes it flash-friendly:
- Boundary alignment for filesystem structures. The offsets for the FAT and the cluster heap is adjustable at format-time, so that writes to these areas will happen in as few flash blocks as possible.
- An "OEM Parameters" field can be used to record features such as block size of the underlying storage.[37]
- The lack of a journal, so that less data are written

http://jay-fva.blogspot.com/2011/11/exfat.html
exFAT原本設計的目的是在FAT32與NTFS之 間取得一個折衷，有FAT32的輕便、不需要耗損太多的效能及記憶體來處理檔案運作，又有類似NTFS的CAL存取控制機制（很可惜在SP1下找不到 exFAT對於CAL的支援），以及類似HPFS系統可快速整理可用叢集空間的Free Space Bitmap，來將檔案破碎的情況盡量減少。
>exFAT用大cluster

>大cluster浪費空間

| 1|JFFS2|YAFFS2|UBIFS
|-|-|-|-|
|壓縮功能|支持|不支持|支持|
|快閃記憶體類別|NOR、NAND|NAND|NOR、NAND
|快閃記憶體結構|2D-SLC|2D-SLC、2D-MLC|2D-SLC、2D-MLC
|檔案大小|最大4 GByte|最大512GByte|最大2048GByte
|最大檔名|254 Byte|255 Byte|255 Byte
|寫入動作|同步|同步|同步、回寫

||JFFS2|	YAFFS2|	UBIFS|
|-|-|-|-|
|掛載時間|每512MiB增加1.8秒|每512MiB增加0.2秒|3秒
|卸載時間|最慢不超過0.01秒|0.0003秒|0.05秒
|寫入|2.7MiB/s|2.8MiB/s|3.1MiB/s
|讀取|1.8MiB/s|3.5MiB/s|2.4MiB/s
|垃圾回收|空間有效利用|時間不會增加|實際不由檔案系統控制

2010年1月15日，Google宣布將他們公司使用的檔案系統，由ext2，升級為ext4。在同年12月14日，Google也宣布他們將在Android 2.3版中，使用ext4來取代之前的YAFFS。

---
網頁list
zh.wikipedia.org/wiki/闪存#快閃記憶體檔案系統
zh.wikipedia.org/wiki/快閃記憶體檔案系統
en.wikipedia.org/wiki/Flash_file_system
https://zh.wikipedia.org/wiki/MTD
www.linux-mtd.infradead.org/faq/general.html#L_ext2_mtd
mark-shih.blogspot.com/2012/10/mtd-devmtddevmtdblok.html
en.wikipedia.org/wiki/Flash_file_system
zh.wikipedia.org/wiki/Ext4
en.wikipedia.org/wiki/ExFAT#Flash_optimizations
zh.wikipedia.org/wiki/F2FS
zh.wikipedia.org/wiki/UBIFS

baike.baidu.com/item/exFAT
eassos.cn/jiao-cheng/ying-pan/file-system.php
zh.wikipedia.org/wiki/YAFFS#YAFFS2
archive.is/rpCEN
yaffs.net/yaffs-overview
yaffs.net/yaffs-2-specification
https://yaffs.net/sites/yaffs.net/files/HowYaffsWorks.pdf

ethesis.nitrkl.ac.in/6534/2/E-3.pdf