嵌入式文件系统知多少

时间:2023-01-21 20:06:10

Nand/Nor Flash

在嵌入式Linux产品中,通常使用的存储介质为Nand Flash和Nor Flash,而手机、相机等产品通常使用eMMC、SD Card作为存储介质,导致这种差异的原因主要是成本考量。

Nand Flash和Nor Flash具有低成本、高密度存储的优势。但是,它们在读写操作上又有各自的限制。Nand Flash和Nor Flash都没有片内FTL(Flash Transfer Layer)层,换句话说,它们都是raw flash。也就是说,本质上它们都是字符设备。未填写数据的时候,所有位都是高电平;写操作是将高电平变为低电平;只有擦操作才能将低电平变为高电平。所以Nand Flash和Nor Flash的写操作都只能通过先擦除再写入完成,读操作没有限制。

Nand Flash通常用来存储数据,它通过页(Page)和块(Block)两级结构组成,页大小通常为512Byte,类似于磁盘,块大小为8~32KB。读取和写入以页为单位进行,擦操作以块为单位进行。另外,针对每一页有16字节的OOB区,用来存放额外的信息以及ECC纠错码。Nand Flash比较容易出现坏块,其生命周期是擦写100万次。

Nor Flash通常用来存代码,因为它具有XIP(eXecute In Place)的特性,即片上执行,CPU可以把它当RAM使用,同时它也可以保存数据。Nor Flash的页大小通常为32Byte,块大小为128KB,芯片内部包含512Byte的写缓冲区。Nor Flash具有随机读和页读两种方式,擦除操作则是以块为单位,即128KB。Nor Flash在擦除操作之前,必须对每一位写0。Nor Flash的读速度比Nand Flash快,擦除和写入速度则比Nand Flash慢。另外,Nor Flash没有芯片内部的坏块处理,因为它比较少出现坏块,其生命周期是擦写10万次。

 

MTD(Memory Technology Devices) 

MTD子系统在raw flash上提供了一层抽象层,并提供统一的API接口给文件系统层,这样文件系统就不用关心实际的Flash类型是Nand Flash还是Nor Flash。

MTD子系统有以下三种接口:

1) mtd字符设备:/dev/mtd0, /dev/mtd1等,通常包括一组ioctl进行读取、擦除、写入、标记坏块、获取flash信息等操作

2) sysfs 参考Documentation/ABI/testing/sysfs-class-mtd

3) /proc/mtd

MTD子系统给文件系统层提供的API都在include/linux/mtd/mtd.h中描述,其中最重要的是mtd_info结构体。内核3.4版本之前,文件系统层通过mtd_info的成员函数指针调用接口函数;内核3.4版本以后,通过mtd.h文件中声明的mtd_read() mtd_write()等函数实现。

MTD既可以是字符设备,也可以是块设备。

mtdblock驱动是一个过时的工具,用来在mtd设备之上模拟块设备。它不进行坏块处理,所以不能用于Nand Flash。它的工作原理是通过缓存数据块来实现,修改操作在内存中缓存的数据块进行,然后擦除实际物理块,再将缓存的数据写入物理块。这样会出现掉电的时候,数据丢失的现象。另外,它也不进行wear-leveling和bit-flips(位反转)处理。通常将mtdblock理解为FTL层,其实这种认知是错误的,尽量不要使用mtdblock,除非你知道自己在干什么。

 

YAFFS/JFFS2/SQUASHFS/UBIFS

文件系统