flash存储系统流程
Linux通过SDIO驱动控制器来读写eMMC/SPI/NAND Flash,与文件系统之间存在一个层次化的关系。简单来说,SDIO驱动控制器是硬件层面的接口,负责实际的物理数据传输,而文件系统则是软件层面的抽象,负责管理数据的逻辑组织。
它们之间的关系可以这样理解:
-
硬件接口层 (SDIO驱动控制器) :
-
SDIO (Secure Digital Input Output) 是一种总线接口,最初用于SD卡,但也被扩展用于连接其他外设,例如eMMC、Wi-Fi模块等。
-
SDIO驱动控制器 是Linux内核中的一个模块,它的作用是与SDIO硬件控制器进行通信,将上层发出的读写请求转换为SDIO协议定义的命令和数据传输操作,并将其发送给连接在SDIO总线上的存储设备(如eMMC)。
-
对于eMMC:eMMC本身集成了Flash控制器,它将NAND Flash的复杂性(如坏块管理、磨损均衡、ECC等)封装起来,对外提供一个标准的块设备接口。因此,SDIO驱动通过eMMC的控制器来读写eMMC。
-
对于SPI/NAND Flash:
- SPI (Serial Peripheral Interface) 是一种串行总线,常用于连接NOR Flash或较小容量的NAND Flash。
- 对于NAND Flash,由于其自身的特性(需要擦除才能写入,有坏块,需要磨损均衡等),通常还需要一个Flash Translation Layer (FTL) 或 Memory Technology Device (MTD) 层 来管理这些复杂性。SDIO驱动可以直接或间接地通过MTD层来操作NAND Flash。
- SPI Flash (包括NOR Flash和部分NAND Flash) 也可能通过SPI接口连接,其驱动同样会提供一个底层的读写接口。
-
-
块设备层 (Block Device Layer) 或 MTD层 (Memory Technology Device Layer) :
- eMMC 通常被Linux内核识别为块设备 (Block Device) 。这意味着它提供了一个固定大小的块(例如512字节或4KB)的随机读写接口,就像传统的硬盘一样。Linux的块设备层负责管理这些块设备,并提供统一的接口给上层使用。通常在Linux中,eMMC设备会被表示为
/dev/mmcblkX。 - NAND Flash(尤其是“裸”NAND Flash,没有内置控制器的那种),由于其读写特性与传统块设备不同,通常由Linux的MTD (Memory Technology Device) 子系统来管理。MTD层提供了一个抽象,处理NAND Flash特有的擦除、坏块管理、磨损均衡等问题。MTD设备通常被表示为
/dev/mtdX。
- eMMC 通常被Linux内核识别为块设备 (Block Device) 。这意味着它提供了一个固定大小的块(例如512字节或4KB)的随机读写接口,就像传统的硬盘一样。Linux的块设备层负责管理这些块设备,并提供统一的接口给上层使用。通常在Linux中,eMMC设备会被表示为
-
文件系统层 (Filesystem Layer) :
-
文件系统 是Linux内核中负责管理存储设备上文件和目录的逻辑结构和访问方式的软件层。它构建在块设备层或MTD层之上。
-
对于eMMC(作为块设备) :
- 由于eMMC被抽象为块设备,可以使用各种常见的块设备文件系统,如Ext4、FAT32、NTFS等。这些文件系统不关心底层存储的具体实现(例如eMMC内部是如何进行磨损均衡的),它们只需要块设备提供的读写接口。
- 文件系统负责将文件的逻辑结构(文件名、目录结构、权限等)映射到存储设备上的物理块地址。
-
对于NAND Flash(通过MTD层) :
- 由于NAND Flash的特性(如需要擦除才能写入,磨损限制),使用为NAND Flash优化过的文件系统更为合适,例如UBIFS、JFFS2、YAFFS2等。这些文件系统直接与MTD层交互,并内置了对坏块管理和磨损均衡的支持,以避免与硬件层(如果有硬件FTL)的功能冲突。
- 尽管MTD层也可以暴露一个“mtdblock”接口,让传统块设备文件系统(如Ext4)也能在NAND Flash上使用,但这通常不推荐,因为它会绕过MTD层的坏块和磨损均衡管理,可能导致数据丢失或Flash寿命缩短。
-
总结关系链条:
用户/应用程序
↓
文件系统 (e.g., Ext4, UBIFS)
↓
块设备层 (for eMMC) 或 MTD层 (for NAND Flash)
↓
存储设备驱动 (e.g., eMMC控制器驱动, SPI Flash驱动)
↓
SDIO驱动控制器 (与SDIO硬件通信)
↓
SDIO硬件控制器
↓
eMMC/SPI/NAND Flash 物理存储介质
简而言之:
SDIO驱动控制器是底层硬件交互的“手”,它知道如何通过SDIO协议与存储设备进行通信。
存储设备(如eMMC、SPI/NAND Flash)本身是物理存储介质。
文件系统是顶层逻辑管理的“大脑”,它决定了数据如何被组织、存储和访问。
SDIO驱动和文件系统之间通过Linux内核的存储子系统(块设备层或MTD层)进行解耦。这意味着文件系统不需要直接与SDIO控制器对话,它只需要通过标准的接口(如读写块或MTD操作)来与底层的存储设备交互,而这些底层操作最终由SDIO驱动完成。这种分层设计提高了系统的模块化和可移植性。