在嵌入式存儲系統里,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 特性和限制。