嵌入式Linux系统的闪存设备和文件系统学习纪要
Linux下的文件系统结构如下:
================================================================================
NAND Flash 是一种非易失性存储器(Non-Volatile Memory),常用于闪存设备和固态硬盘(SSD)中。以下是几种常见的 NAND Flash 种类:
1. SLC(Single-Level Cell):SLC NAND Flash 是最早的 NAND Flash 类型,每个存储单元只能存储一个比特(0 或 1)。它具有较高的耐久性、较低的读取延迟和较高的写入速度,但成本较高。
2. MLC(Multi-Level Cell):MLC NAND Flash 每个存储单元可以存储多个比特,通常是两个或四个比特。相比于 SLC,MLC 具有更高的存储密度,但耐久性较低,读取延迟和写入速度也相对较慢。
3. TLC(Triple-Level Cell):TLC NAND Flash 每个存储单元可以存储三个比特。TLC 具有更高的存储密度,但相对于 MLC,它的耐久性更低,读取延迟和写入速度更慢。
4. QLC(Quad-Level Cell):QLC NAND Flash 每个存储单元可以存储四个比特。QLC 具有更高的存储密度,但相对于 TLC,它的耐久性更低,读取延迟和写入速度更慢。
随着技术的进步,新的 NAND Flash 类型不断涌现,如五级单元(Penta-Level Cell,PLC)和六级单元(Hexa-Level Cell,HLC),它们进一步提高了存储密度,但也伴随着更低的耐久性和较慢的读写速度。选择适合特定应用需求的 NAND Flash 类型时,需要综合考虑存储容量、性能要求和成本等因素。
================================================================================
eMMC(embedded MultiMediaCard)是一种集成了闪存存储器和控制器的嵌入式存储解决方案。它通常用于移动设备、嵌入式系统和消费电子产品中。以下是几种常见的 eMMC 种类:
1. eMMC 4.5:eMMC 4.5 是较早版本的 eMMC 标准,提供了最基本的存储功能和性能。它支持高达52 MHz的时钟频率和8位数据总线宽度。
2. eMMC 5.0:eMMC 5.0 是较新的 eMMC 标准,相比于 4.5 版本有显著的改进。它引入了 HS400 模式,支持高达200 MHz的时钟频率和8位或4位数据总线宽度,从而提供更快的读写速度。
3. eMMC 5.1:eMMC 5.1 在 5.0 的基础上进行了进一步改进。它增加了命令队列和混合写入模式等特性,提高了性能和效率。
4. eMMC 5.1 Plus / eMMC 5.1 Turbo:这些术语通常用来描述经过优化的 eMMC 5.1 存储器,具有更高的性能和速度。
5. eMMC 5.2:eMMC 5.2 是最新的 eMMC 标准,引入了一些新功能和改进。它支持更高的时钟频率、更大的存储容量和更快的数据传输速度。
需要注意的是,不同厂商可能会对 eMMC 进行定制和优化,因此具体的性能和特性可能会有所差异。选择适合特定应用需求的 eMMC 版本时,需要考虑存储容量、读写速度、可靠性和成本等因素。
================================================================================
UBIFS
无序区块镜像文件系统(Unsorted Block Image File System, UBIFS)是用于固态存储设备上,并与LogFS相互竞争,作为JFFS2的后继文件系统之一。
开发目的
2006年,UBIFS由IBM与Nokia的工程师Thomas Gleixner,Artem Bityutskiy所设计,专门为了解决MTD(Memory Technology Device)所遇到的瓶颈。由于Nand Flash容量的暴涨,YAFFS等皆无法操控大的Nand Flash空间。UBIFS通过子系统UBI处理与MTD device之间的动作。与JFFS2一样,UBIFS 建构于MTD之上,因而与一般的块设备不兼容。
系统优点
UBIFS在设计与性能上均较YAFFS2、JFFS2更适合MLC NAND FLASH。例如:UBIFS 支持 凑数(write-back), 其写入的数据会被缓存起来, 直到有必要写入时才写到flash, 这样大大降低分散小区块数量,并提高读写效率。UBIFS文件系统目录存储在flash上,UBIFS 挂载时不需要扫描整个存储器来重新创建文件目录。支持实时压缩,而且可选择性压缩部份文件。另外UBIFS使用日志(journal),可减少对flash index的更新频率。
UBIFS 是 Nokia N900 智能手机上的默认文件系统。
以下是关于 UBIFS 的一些要点:
1. 特点:UBIFS 具有良好的可靠性和耐久性,适用于闪存设备的特殊特性。它支持动态扩展和压缩,能够有效地管理存储空间。UBIFS 还具有快速启动时间和低内存占用。
2. 日志型文件系统:UBIFS 是一个基于日志的文件系统,它使用日志来记录文件系统的操作和变化。这种设计可以提供更好的数据完整性和恢复能力,在系统异常断电或崩溃时能够快速恢复文件系统的一致性。
3. 块级别存储:UBIFS 以块为单位进行存储,而不是传统的文件级别存储。每个块都包含多个逻辑页,这样可以减少寻址开销并提高读写性能。
4. 压缩和去重:UBIFS 支持数据压缩和去重功能,可以显著减小存储空间的占用。通过压缩和去重,可以提高存储效率并延长闪存设备的寿命。
5. 可靠性和错误检测:UBIFS 具有强大的可靠性机制,包括校验和、CRC 错误检测和修复、写入日志等。这些机制可以帮助检测和纠正数据损坏或错误,并提供更高的数据完整性。
总之,UBIFS 是一种专为闪存设备设计的高性能文件系统,它通过日志和块级别存储等特性提供了可靠性、耐久性和高效性能。它在嵌入式系统和固态硬盘等应用中被广泛使用。
================================================================================
JFFS
JFFS,Journalling Flash File System的缩写,中文释义:闪存设备日志型文件系统。
简介
Journalling Flash File System(闪存设备日志型文件系统,JFFS)最初是由瑞典的 Axis Communication AB 开发。
主要作用
其目的是作为嵌入式系统免受宕(dang)机和断电危害的文件系统。然而用于NAND设备上JFFS已被JFFS2大量取代。
JFFS2
JFFS2(Journaling Flash File System 2)是一种用于闪存设备的文件系统,它是 JFFS(Journaling Flash File System)的改进版本。
JFFS2的全名为JournallingFlashFileSystemVersion2(闪存日志型文件系统第2版),其功能就是管理在MTD设备上实现的日志型文件系统。与其他的存储设备存储方案相比,JFFS2并不准备提供让传统文件系统也可以使用此类设备的转换层。它只会直接在MTD设备上实现日志结构的文件系统。JFFS2会在安装的时候,扫描MTD设备的日志内容,并在RAM中重新建立文件系统结构本身。
除了提供具有断电可靠性的日志结构文件系统,JFFS2还会在它管理的MTD设备上实现“损耗平衡”和“数据压缩”等特性。
JFFS2 具有以下特点:
1. 压缩支持:JFFS2 支持对数据进行压缩,可以减少存储空间的使用,并提高读写性能。
2. 日志结构:JFFS2 使用日志结构来记录文件系统的变化,以确保数据的完整性和可靠性。
3. 块擦除:JFFS2 以块为单位进行擦除操作,而不需要整个文件系统的擦除和重写。这使得 JFFS2 在写入大量小文件时更加高效。
4. 动态节点分配:JFFS2 允许在运行时动态创建和删除文件和目录节点,提供了更灵活的文件系统管理。
5. 适用于小容量设备:JFFS2 针对闪存设备的特性进行了优化,适用于小容量的闪存设备。
6. 低内存占用:JFFS2 对内存的需求相对较低,适合资源受限的嵌入式系统。
尽管 JFFS2 在过去被广泛使用,但随着闪存技术的发展,现代文件系统如UBIFS和YAFFS等已经取代了 JFFS2,并提供更好的性能和可靠性。因此,在选择文件系统时,建议考虑使用更先进的文件系统来满足当前的需求。
================================================================================
YAFFS2
YAFFS(Yet Another Flash File System)是由Aleph One公司所发展出来的NAND flash 嵌入式文件系统。
在YAFFS中,最小存储单位为一个页(Page),文件内的数据是存储在固定512 bytes的页中,每一页亦会有一个对应的16 bytes的Spare(OOB,Out-Of-Band)。YAFFS采用树形结构(Tree Node Structure),由多个树节点(Tree Node,Tnode)所组成,树节点又分成内部节点(Internal Tnode)与底层树节点(Lowest Level Tree node),其中内部节点由8个指针(Pointers)所组成,底层树节点由16个入口(Entries)所组成,其时间复杂度(Time Complexity)相当于O(log N),故地址转换时间较迅速。一旦闪存(Flash Memory)挂载(mount)之时,YAFFS会为每个文件在RAM中创建一棵树, 并随时提供Chunk(即Page, 由yaffs_Object所配置),可是 YAFFS并未完全实现耗损平均技术(wear-leveling)算法,因此还是会造成部分的块(Block)过度访问。
YAFFS在将数据(Data)写入闪存时会运行垃圾回收(Garbage Collection),YAFFS 垃圾回收分成两种模式:主动模式(Aggressive Mode)及被动模式(Passive Mode), 而且找寻脏块(Dirtiest Block)(最多Invalid Chunk)及查找空块(Empty Block)都是通过线性搜索(Linear Search)的方式(JFFS2是Link List的方式)。YAFFS2不再使用非全页编程(Partial Page Programming)(YAFFS仍使用)。
应用
YAFFS2 是Aleph1的工程师Charles Manning 开发的NAND Flash 文件系统。YAFFS1和YAFFS2 主要差异还是在于PAGE 读写 size的大小,YAFFS2可支持到2K per page, 远高于YAFFS的512 Bytes, 因此对大容量NAND flash更具优势。其他与YAFFS1不同的是, YAFFS2不再写spare area, sequenceNumber 用29 bits 表示。Yaffs2还拥有YAFFS1所缺乏的SuperBlock, 因此YAFFS1严重依赖文件系统的read_super。
YAFFS 和YAFFS2 皆遵守GNU GPL开放原始码。Android 采用yaffs2作为MTD NAND flash文件系统,位于fs/yaffs2/目录下,由于循序GPL,因此源码是可以看到的。
YAFFS2 的特点:
1. 可靠性:YAFFS2 使用日志和校验和等机制来确保数据的完整性和可靠性,减少数据损坏的风险。
2. 块擦除:YAFFS2 以块为单位进行擦除操作,而不需要整个文件系统的擦除和重写。这使得 YAFFS2 在写入大量小文件时更加高效。
3. 压缩支持:YAFFS2 支持对数据进行压缩,以减少存储空间的使用,并提高读写性能。
4. 快速恢复:YAFFS2 具有快速恢复功能,可以在断电或系统崩溃后快速恢复文件系统的一致性。
5. 适用于小容量设备:YAFFS2 针对闪存设备的特性进行了优化,适用于小容量的闪存设备。
6. 低内存占用:YAFFS2 对内存的需求相对较低,适合资源受限的嵌入式系统。
YAFFS2 是一个成熟且广泛应用的闪存文件系统,特别适用于嵌入式系统和其他资源受限的设备。它提供了可靠性、高效性和适应性,使得数据在闪存设备上的存储和访问更加可靠和高效。