Linux Mtd子系统1(基于Linux6.6)---概述
一、Linux MTD 子系统概述
MTD (Memory Technology Device) 子系统是 Linux 内核中的一个组件,专门用于支持各种类型的闪存存储设备(如 NAND、NOR 闪存、EEPROM 和其他非易失性存储)。这些设备通常用于嵌入式系统中,作为系统的主要存储介质。MTD 子系统提供了一个通用的接口,允许用户空间应用和内核访问这些设备,并进行读写操作。
MTD 主要的设计目标是提供对非易失性内存(如闪存)的抽象,支持高效的管理和操作,同时能够对不同类型的闪存存储设备进行支持,包含了 NAND Flash、NOR Flash、SPI Flash 等。
1.1、MTD 子系统的架构
MTD 子系统包含以下几个关键组成部分:
-
MTD 设备驱动:每种类型的闪存硬件都有相应的 MTD 设备驱动,这些驱动负责与硬件进行交互,例如读取和写入数据,处理闪存特有的操作(如坏块管理)。
-
MTD 层(API 和抽象):MTD 层提供了一个统一的接口,允许内核和用户空间程序通过标准接口访问不同类型的闪存设备。它提供对设备的抽象,使得不同类型的闪存设备可以通过相同的方式进行访问。
-
MTD 子系统中的文件系统:为了方便数据存储和管理,MTD 子系统支持将闪存设备格式化为文件系统(如 JFFS2、UBIFS 等),以便存储用户数据。
1.2、MTD 设备类型
MTD 子系统支持多种类型的闪存设备。常见的设备包括:
-
NAND Flash:NAND 闪存常用于大容量存储,在嵌入式系统和手机中广泛应用。由于其块级擦写特性,NAND 闪存通常需要使用更复杂的坏块管理和擦写寿命管理技术。
-
NOR Flash:NOR 闪存相比 NAND 闪存更适合存储代码,支持按字节读取,擦写性能较差,但它的读取速度更快,且可以直接用于执行存储。
-
SPI Flash:SPI 闪存是一种通过 SPI 接口进行通信的小型闪存设备,通常用于存储固件、配置数据等。它可以通过较低的引脚数与微控制器连接。
-
EEPROM:电可擦可编程只读存储器,用于存储少量配置数据等信息。
1.3、MTD 核心功能
MTD 提供了许多关键功能,包括:
读写操作
MTD 提供了标准的读写操作接口,允许应用程序和内核代码直接与闪存设备交互。读写操作通常是块级操作,设备可能不支持按字节读取(特别是对于 NAND 闪存)。
坏块管理
闪存设备可能会有一些坏块,这些块在物理层面上无法再使用。MTD 子系统会自动检测并管理坏块,确保数据不会被写入损坏的区域。
擦除操作
闪存设备(尤其是 NAND 和 NOR Flash)需要在写入新数据前进行擦除操作。擦除是一个块级的操作,不同于一般的文件系统擦除。MTD 提供了对擦除操作的管理,确保用户不会在坏块上进行擦除。
物理擦写生命周期管理
MTD 提供擦写周期计数和管理,以防止闪存存储器因频繁的擦写而过早损坏。许多闪存设备具有有限的擦写次数,MTD 子系统会进行适当的优化,避免对同一区域的频繁擦写。
1.4、MTD 文件系统
尽管 MTD 子系统本身提供了直接的块级访问接口,用户通常希望在闪存设备上创建一个文件系统。Linux 提供了多个适合闪存设备的文件系统:
-
JFFS2 (Journaling Flash File System 2):JFFS2 是一个为闪存设备设计的日志型文件系统,适用于 NOR 和 NAND 闪存。它使用日志记录和垃圾回收来管理闪存的擦写周期。
-
UBIFS (UBI File System):UBIFS 是另一个针对 NAND 闪存设计的文件系统,相较于 JFFS2,UBIFS 在处理大容量 NAND 闪存时表现更好。UBIFS 架构与 UBI 层配合使用,能够提供更高效的管理和性能。
-
YAFFS (Yet Another Flash File System):YAFFS 是另一个针对闪存设计的文件系统,专门为 NAND 闪存优化,具有较小的内存占用和较高的性能。
-
F2FS (Flash-Friendly File System):F2FS 是由 Linux 基金会开发的一个新的闪存优化文件系统,专为 NAND 闪存设备设计,旨在提高闪存存储设备的性能和寿命。
1.5、MTD 接口与用户空间
MTD 提供了一些与用户空间交互的接口,用户可以通过这些接口管理和操作闪存设备:
-
/dev/mtdX 设备节点:MTD 设备会在
/dev
目录下创建一个设备节点,格式为/dev/mtdX
,其中 X 是设备的编号。用户空间可以通过这个设备节点直接与 MTD 设备进行交互。 -
/dev/mtdblockX 设备节点:对于有文件系统支持的闪存设备,
/dev/mtdblockX
设备节点提供了类似普通块设备的接口,用户可以通过这个设备节点进行读写操作。 -
MTD 工具:Linux 提供了多种命令行工具(如
flash_erase
,nandwrite
,nandread
等)来帮助用户管理 MTD 设备。 -
UBI 和 UBI 文件系统:UBI(Universal Block Interface)是一个管理 NAND 闪存的中间层,它在 MTD 子系统上方提供了一个更加抽象的块设备接口,便于管理闪存块的分配和坏块管理。UBIFS 文件系统通常与 UBI 配合使用。
1.6、MTD 设备的应用场景
MTD 子系统广泛应用于嵌入式系统中,尤其是在存储需求较为简单但可靠性要求高的场合。常见的应用场景包括:
-
嵌入式系统:如路由器、单片机、智能家居设备等,这些设备通常使用 NAND 或 NOR 闪存存储操作系统、配置文件、固件等数据。
-
固件存储:在许多设备中,固件存储在 SPI Flash、NAND Flash 等设备中,MTD 提供了管理和更新这些固件的能力。
-
可擦写存储:如 EEPROM 和 NOR Flash 用于存储小量的配置数据。
二、设备间的逻辑关联图与抽象
下图是norflash 、nandflash与cpu之间的关联。针对norflash,可直接与cpu关联,也可通过spi controller与cpu相连;而针对nandflash,即可以通过nandflash controller、spi controlloer与cpu相连。
而针对spi controller、spi device、spi driver的抽象及关联,已在之前的专栏中介绍。而针对nandflash controller,我们在后面会详细说明。而mtd驱动模型则通过对nor flash、nandflash等闪存设备进行抽象,对上层模块抽象成统一成设备模型(mtd_info),对下则通过mtd_info完成与具体闪存设备驱动的绑定,从而完成对闪存设备的访问操作。此处mtd的抽象,就和vfs抽象类似。
1. NOR Flash 与 CPU 的连接
NOR Flash 是一种广泛用于存储代码的闪存类型,它支持按字节读取,因此非常适合存储引导加载程序(如 BIOS 或 U-Boot)以及可执行代码。NOR Flash 的结构使其特别适合被直接执行(XIP,Execute In Place)。
- 连接方式:NOR Flash 通常通过 并行接口 连接到 CPU,尤其是在较早的嵌入式系统中,或者通过 SPI 接口 在更简单的系统中进行连接。
- 数据传输:CPU 可以直接从 NOR Flash 读取代码,执行这些代码。由于其按字节读取的特点,CPU 可以很高效地从 NOR Flash 中获取数据并执行。
2. NAND Flash 与 CPU 的连接
NAND Flash 是一种块级存储器,通常用于大容量的非易失性存储(如固态硬盘、嵌入式存储等)。NAND Flash 由于擦写操作的块级特性,不适合直接执行存储在其上的代码,因此通常需要一个 管理层,如 Flash 控制器,来处理坏块管理、擦写、读写操作等。
- 连接方式:NAND Flash 通过 并行接口 或 Serial NAND (SPI-NAND) 接口连接到 CPU。为了高效管理 NAND Flash 的操作,通常会使用 NAND Flash 控制器 或 UBI (Universal Block Interface) 层来将其转换为更高效的块设备。
- 数据传输:由于 NAND Flash 是按块(而非字节)进行读写的,CPU 通常通过控制器来执行块级读取和写入操作。一般来说,系统会通过操作系统中的文件系统(如 JFFS2、UBIFS)对 NAND Flash 进行管理。
3. CPU 通过总线访问闪存
- 总线架构:无论是 NOR Flash 还是 NAND Flash,CPU 都通过特定的总线与存储设备进行通信。在现代嵌入式系统中,CPU 可能使用 外部总线(如 AHB 或 AXI) 与 NAND 或 NOR Flash 连接,或者使用 串行接口(如 SPI),这取决于具体的硬件设计。
4. NOR Flash 和 NAND Flash 的比较
- NOR Flash 更适合存储代码,因为它支持按字节读取,CPU 可以直接执行存储的代码。它的缺点是擦写速度较慢,且存储容量较小,成本较高。
- NAND Flash 存储容量大,成本低,适合存储大量数据,但不适合直接执行,因此需要操作系统或 Flash 控制器的支持来管理数据的读取和写入。
三、MTD设备驱动模型与VFS及FLASH驱动的关联
如下为mtd设备驱动模型、vfs、flash设备驱动之间的关联图。
1. MTD(Memory Technology Device)
MTD 是 Linux 内核中的一个子系统,旨在支持各种闪存设备,包括 NAND 和 NOR Flash。MTD 提供了对这些存储设备的访问接口,并处理设备的低层管理。
主要功能:
- MTD 设备 是抽象的设备接口,允许用户空间访问和操作闪存存储。
- 提供对原始闪存设备(比如 NAND 和 NOR Flash)进行操作的接口。
- 提供坏块管理、擦除、写入和读取等功能。
2. VFS(Virtual File System)
VFS 是 Linux 内核的一个层,负责在用户空间和不同类型的文件系统之间提供统一的接口。VFS 提供了文件系统的抽象层,用户通过标准的文件操作(如打开、读、写、关闭等)与文件系统交互。
主要功能:
- 为不同类型的文件系统(如 ext4、FAT、JFFS2、UBIFS)提供统一的接口。
- 通过虚拟文件系统接口将文件系统操作映射到具体的文件系统实现上。
- 负责管理文件系统的挂载、访问权限和文件操作。
3. Flash 设备驱动
Flash 设备驱动是 Linux 中对具体硬件(如 NAND 和 NOR Flash)的支持层,处理闪存设备的低层硬件接口。Flash 设备驱动通常依赖于 MTD 子系统来管理硬件的访问。
主要功能:
- NAND 驱动:负责与 NAND Flash 进行交互,提供读写、坏块管理等基本操作。
- NOR 驱动:负责与 NOR Flash 进行交互,支持 XIP(Execute In Place)功能。
- 管理硬件的物理特性,如块管理、坏块标记、擦写等。
4. VFS 与 MTD 的关系
- MTD 子系统 通过设备驱动提供对 Flash 存储设备的操作接口,但在用户空间,Flash 设备的内容需要通过文件系统进行访问。此时,VFS 提供了文件系统接口,可以通过不同的文件系统格式(如 JFFS2、UBIFS)来挂载和访问 Flash 存储。
- 在实际应用中,MTD 设备并不直接提供文件系统功能,而是通过 VFS 将 Flash 存储与文件系统挂钩,让用户可以像操作普通文件一样进行访问。
5. Flash 驱动与 VFS 的关系
- Flash 驱动 通过 MTD 子系统向文件系统提供原始存储设备接口。
- 在用户空间,VFS 和文件系统会对 Flash 存储进行抽象,用户可以通过标准的文件操作(如
open()
,read()
,write()
)与存储设备交互,但底层的操作是通过 MTD 驱动来完成的。
关系图
+-----------------+ +--------------------------+ +-----------------+
| Flash Device | <----> | MTD Driver | <----> | VFS Layer |
+-----------------+ +--------------------------+ +-----------------+
| | |
v v v
+------------+ +------------+ +----------------+
| NAND/NOR | | Flash | | File System |
| Driver | | Device | | (e.g., JFFS2, |
| (Hardware) | | Layer | | UBIFS, EXT4) |
+------------+ +------------+ +----------------+
^ ^ ^
| | |
+------------------------------+--------------------------------------+
|
v
+-----------------------+
| Block/Raw Device |
| (Flash Storage) |
+-----------------------+
详细说明:
-
Flash Device:是硬件层面的 Flash 存储设备(如 NAND 或 NOR Flash)。这些设备通过硬件接口(如 SPI、并行总线)连接到系统,通常由具体的设备驱动来操作。
-
MTD Driver:提供对闪存设备的管理功能。MTD 驱动负责与底层硬件交互,包括坏块管理、擦写、读写操作等。MTD 设备向上层提供一个标准的接口,供 VFS 或文件系统访问。
-
VFS:作为虚拟文件系统层,VFS 提供了统一的文件接口(如
open()
,read()
,write()
)。当用户需要通过文件系统访问 Flash 存储时,VFS 将文件操作请求传递给具体的文件系统实现(如 JFFS2 或 UBIFS)。 -
File System (e.g., JFFS2, UBIFS):这些文件系统负责将闪存设备的原始块存储转换为文件系统形式,让用户可以进行文件级别的读写操作。文件系统通常会使用 MTD 接口来访问底层的闪存设备。
-
Block/Raw Device:MTD 设备的上层接口可以是块设备接口或原始设备接口。对于 Flash 存储,文件系统通过 MTD 提供的接口进行读写操作,而用户可以通过文件系统接口来访问存储。