深入理解 Linux 中磁盘空间驱动的编写:从原理到实践
在编写 Linux 内核中的磁盘空间驱动时,理解不同类型的存储设备及其在内核中的工作模式至关重要。常见的存储设备主要分为两类:采用 MTD(Memory Technology Device)模式的原始闪存设备(如 NAND、NOR Flash),以及使用块设备模式(Block Device Mode)的存储设备(如 eMMC、SD 卡、U 盘、SATA 硬盘等)。
本篇博文将围绕磁盘空间驱动的核心编写逻辑,结合实际设备类型,对比分析 MTD 与块设备的差异,并深入讲解 eMMC 所处的工作模式与其对驱动开发的影响。
一、磁盘设备的两种主要模式
1.1 MTD 模式(Memory Technology Device)
MTD 模式主要面向原始闪存设备,例如 NAND 和 NOR Flash。这类设备没有自带的 Flash 管理控制器,所有的擦除、写入对齐、坏块处理、磨损均衡等都需要依赖软件层完成。
在内核中,MTD 子系统由 drivers/mtd/
提供支持,相关设备节点表现为:
/dev/mtdX
:字符设备接口,用于直接访问底层 Flash;/dev/mtdblockX
:块设备封装接口,供文件系统挂载使用;
MTD 设备通常使用专门设计的 Flash 文件系统(如 JFFS2、UBIFS),并由用户空间工具(如 flash_erase
、nandwrite
)进行数据擦写操作。
1.2 块设备模式(Block Device Mode)
块设备模式适用于那些自带控制器并对外屏蔽物理细节的存储设备,例如 eMMC、SD 卡、U 盘、NVMe 和传统机械硬盘等。这类设备对上层操作系统暴露为标准的块设备接口,表现为:
/dev/mmcblk0
、/dev/sda
、/dev/nvme0n1
等;- 可直接格式化为 ext4、f2fs、vfat 等文件系统;
- 通过标准工具(如
mkfs.ext4
、fsck
、mount
)进行日常管理;
块设备由内核中的不同子系统管理,如:
- MMC 设备由
drivers/mmc/
支持; - NVMe 由
drivers/nvme/
管理; - USB 存储由
drivers/usb/storage/
实现。
二、eMMC 所处的模式:标准块设备
eMMC(embedded MultiMediaCard)是一种广泛应用于移动设备、工控平台、嵌入式主板的嵌入式存储器,其本质是一颗集成了 NAND Flash 与 Flash 控制器的单芯片设备。
2.1 eMMC 的硬件特性
- 内置 Flash Translation Layer (FTL),自动完成逻辑块与物理页映射、坏块管理、磨损均衡;
- 对主机(即 SoC/CPU)完全屏蔽 Flash 原始操作的复杂性;
- 支持标准命令接口(如 JEDEC eMMC 规范定义的命令集)。
2.2 eMMC 在 Linux 中的表现
在 Linux 内核中,eMMC 通过 MMC 子系统进行管理,对系统暴露为标准的块设备节点,例如:
/dev/mmcblk0
:代表 eMMC 设备本体;/dev/mmcblk0p1
、/dev/mmcblk0p2
:其上划分的分区设备;
eMMC 不属于 MTD 设备,因此:
- 不会出现在
/proc/mtd
中; - 不支持
mtd-utils
提供的低级擦写工具; - 可直接格式化为 ext4、f2fs 等标准文件系统进行挂载;
三、MTD 与块设备模式对比分析
特性 | MTD 模式 | 块设备模式(eMMC 所在) |
---|---|---|
典型设备 | 原始 NAND Flash、SPI NOR Flash | eMMC、SD 卡、U 盘、SATA 硬盘等 |
内核驱动子系统 | drivers/mtd/ | drivers/mmc/ 等 |
设备节点 | /dev/mtdX 、/dev/mtdblockX | /dev/mmcblk0 、/dev/sda 等 |
是否需软件 FTL 支持 | 是,需借助文件系统层(如 UBIFS) | 否,硬件自带 FTL |
支持的文件系统 | JFFS2、UBIFS | ext4、f2fs、vfat 等 |
是否出现在 /proc/mtd | 是 | 否 |
用户空间工具支持 | mtd-utils (如 flash_erase , nandwrite ) | 标准工具链(如 mkfs.ext4 , mount ) |
此外,访问粒度与写入机制 是两种模式的核心本质区别:
MTD 模式强调原始字节访问能力,但受限于 Flash 本身的页/块结构,写入前必须擦除,需自行管理坏块与磨损问题。
块设备模式则以标准扇区为单位访问,底层细节由设备控制器屏蔽,使用体验更贴近传统磁盘。
换句话说:
✅ MTD 模式:你必须“管理 Flash”。
✅ Block 模式:你只需“使用存储”。
这也决定了两类设备在驱动编写上的出发点和工作重心完全不同。
四、驱动开发者该如何选择接口?
在开发 Linux 磁盘空间驱动时,关键在于识别目标设备所处的模式:
- 若为原始 NAND/NOR Flash,则需使用 MTD 接口,支持特定 Flash 文件系统,且要考虑擦除、对齐、坏块等底层细节;
- 若为 eMMC、U 盘、SD 卡等设备,应使用标准块设备框架,系统已为你屏蔽物理细节,驱动重点转向注册设备、分区识别和文件系统集成。
五、总结与后续方向
eMMC 是一种自带控制器的闪存设备,它不属于 MTD 设备,而是在 Linux 内核中作为标准块设备管理。开发者在处理存储驱动时,应根据设备特性选择对应接口框架。
本篇博文从内核驱动视角出发,梳理了磁盘空间驱动所涉及的两大工作模式,并结合 eMMC 的具体特性进行了深入分析。后续章节将围绕块设备驱动注册流程、分区处理、读写调度及文件系统挂载机制展开更深入的探讨,为驱动开发打下坚实基础。