在嵌入式存储系统里,MTD(Memory Technology Device)和 FTL(Flash Translation Layer)是上下两层、互相配合的概念。你可以把它想成**“原始硬件接口”和“硬盘驱动”**的关系。
1. MTD 是什么
-
定位:内核里对原始 Flash 芯片的抽象层(原生访问层)。
-
职责:
- 提供直接访问 flash 的接口(读、写、擦除块等)。
- 屏蔽硬件差异,让上层不用关心具体是 NOR 还是 NAND。
- 不做块映射、不隐藏坏块、不做磨损均衡。
-
接口形式:
- 常见的
/dev/mtd0
、/dev/mtdblock0
等设备节点。 - MTD 子系统是 Linux 内核的一部分,主要用于原生 flash 存储器(而不是 eMMC、UFS 这种已经有控制器的)。
- 常见的
2. FTL 是什么
-
定位:Flash Translation Layer,介于原始 flash 与文件系统之间的映射层。
-
职责:
- 将 flash(带坏块、擦写限制)的地址空间映射成逻辑块地址(LBA),像磁盘一样使用。
- 做坏块管理、磨损均衡(wear leveling)、垃圾回收(GC)。
- 对上层文件系统来说,FTL 把 flash“伪装”成一个普通的块设备。
-
实现位置:
- 可能在硬件里(比如 eMMC、SSD 的控制器内部自带 FTL)。
- 也可能在软件里(Linux 的 NFTL、YAFFS2/UBI+UBIFS 中的一部分功能)。
3. 两者的关系
可以用一张逻辑图来理解:
文件系统 (ext4 / FAT / UBIFS)↑块设备接口 (/dev/sdX 或 /dev/ftlX)↑
FTL 层(地址映射 + 坏块管理 + 磨损均衡)↑MTD 层(读/写/擦除原始 flash)↑物理 NAND/NOR 芯片
- MTD 负责直接驱动硬件,提供最原始的读写擦 API。
- FTL 站在 MTD 上面,把不规则的 flash 特性转换成线性的块地址,让普通文件系统能用。
- 如果是原始 NAND,没有硬件 FTL,那软件就必须配一个 FTL(比如 UBI+UBIFS)。
- 如果 flash 自带控制器(eMMC、SSD),那硬件里的 FTL 已经把 flash 封装成了块设备,Linux 直接用
/dev/mmcblk0
,MTD 就用不上了。
4. 嵌入式工程中的典型场景
- 直接 MTD + 特殊文件系统:
原始 NAND flash → MTD → UBI/UBIFS(UBI 相当于软件 FTL 功能的一部分)。 - 硬件带 FTL:
eMMC → 硬件控制器 FTL → 块设备接口 → ext4 / FAT。 - 自写软件 FTL:
在裸机 RTOS 里,工程师可能自己写一个简单的 FTL,把 flash 映射成逻辑扇区,供 FAT 使用。
1. MTD 并不是简单“地址转成设备节点”
- MTD 层确实会在 Linux 下生成
/dev/mtdX
(字符设备)和/dev/mtdblockX
(块设备)这样的节点,但它做的不仅仅是“地址映射”,还要提供基本的 flash 操作 API(读、写、擦除)。 - 它是 面向原始 Flash 的抽象层,不会隐藏坏块,也不会做逻辑地址映射成连续 LBA(这是 FTL 的工作)。
2. 研发人员看到 /dev/mtdX
时
/dev/mtdX
是字符设备接口,使用ioctl
(比如MEMGETINFO
、MEMERASE
等)进行擦写,不能像普通磁盘文件那样直接read
/write
就万事大吉,因为 Flash 写入前必须擦除,而且写粒度受限。/dev/mtdblockX
是 MTD 提供的块设备接口,可以让某些文件系统(如 JFFS2)挂载,但底层依旧是 MTD 调用原生 flash 操作。
3. 和“直接 open/read/write”区别
- 如果是普通块设备(如
/dev/sda
、/dev/mmcblk0
),可以直接open
+read
/write
做随机读写,因为底层是硬件控制器+FTL。 - 对
/dev/mtdX
,read
可以直接用,但write
前要考虑擦除块、坏块标记等,不是完全透明的。 - 所以说,MTD 让你不用写硬件驱动去操作 NAND/NOR,但还是要遵守 flash 的物理限制。
✅ 总结一句:
MTD 不是把 flash 简单映射成普通硬盘,而是提供“原始 flash 访问接口”的统一驱动层,研发人员可以用设备节点访问它,但需要理解 flash 特性和限制。