SSD、eMMC、SD 卡、Flash,为什么总被混在一起说?

SSD、eMMC、SD 卡、Flash,为什么总被混在一起说?

有一次调板子,旁边一个刚入行的同事问我:

这个板子是用 Flash,还是用 eMMC?

这句话乍一听没问题,仔细一想就有点别扭。

有点像问:

这房子是用砖头,还是用公寓?

Flash 更像材料。
eMMC、SD 卡、SSD 更像已经做好的存储设备。

它们都能“存东西”,所以经常被放在一起说。可真到驱动、BSP、启动流程里,它们的位置差得很远。

Flash:最底层那块“材料”

Flash 自己其实很朴素。

它能保存数据,掉电不丢。
但它不会帮你管理太多事情。

哪个块坏了,
哪里写太多次了,
数据该不该搬家,
要不要纠错,
地址怎么映射,

这些都要靠外面的控制器、驱动或者文件系统处理。

所以 Linux 里碰到裸 Flash,通常会走 MTD:

/dev/mtd0
/dev/mtd1

这和我们平时看到的磁盘设备不是一套思路。

NOR Flash:小,但适合启动

NOR Flash 在嵌入式里很常见。

板子上那颗 8MB、16MB、32MB 的 SPI Flash,很多时候就是它。

它容量不大,速度也谈不上夸张,但有个很实用的特点:

适合放启动代码。

很多系统上电后,BootROM 会去 SPI NOR 里找 SPL 或 U-Boot。
这时候 RAM 可能还没完全起来,系统也谈不上什么文件系统。

启动阶段要的东西很简单:

能读到代码,
能跳过去执行,
别太复杂。

NOR Flash 正好适合这个位置。

NAND Flash:容量大,但要有人管

NAND Flash 更像一大片仓库。

便宜,容量大,适合放更多数据。
但它也更麻烦。

它有坏块。
它需要 ECC。
它按 page 读写,按 block 擦除。
你不能像普通磁盘那样随便想当然。

所以在 Linux 里,经常会看到这样的路径:

 Raw NAND
   ↓
   MTD
   ↓
   UBI
   ↓
  UBIFS

如果系统里有:

ubi0
ubifs

背后大概率就有 NAND 那套管理逻辑。

eMMC:把麻烦封装起来

eMMC 里面也用 Flash。

但你拿到的已经不是一颗裸 Flash 了。
里面有控制器,有协议接口,也有基础的管理逻辑。

坏块管理、地址映射、磨损均衡,这些事情 eMMC 内部已经处理了一部分。

所以 Linux 看到它时,通常是:

/dev/mmcblk0
/dev/mmcblk0p1
/dev/mmcblk0p2

你可以分区,可以格式化,可以挂 ext4:

mkfs.ext4 /dev/mmcblk0p2
mount /dev/mmcblk0p2 /mnt

做 BSP 的时候,rootfs 放 eMMC 上,维护成本通常低很多。

SD 卡:和 eMMC 很像,只是能拔

SD 卡和 eMMC 在 Linux 里关系很近,都走 MMC 子系统。

所以你插 SD 卡,也可能看到:

/dev/mmcblk0

板子上焊 eMMC,也可能看到:

/dev/mmcblk0

真正做产品时,差别就来了。

SD 卡方便。
升级、导日志、拷数据,都好用。

但 SD 卡也容易带来麻烦:

接触不良,
卡座松动,
热插拔异常,
卡质量不一致。

这些问题在实验室里不一定明显,到了现场就很烦。

eMMC 焊在板子上,没那么灵活,但稳定得多。
车机、机顶盒、工控板、Android 设备喜欢用它,就是这个原因。

SSD:复杂度已经高了一个层级

SSD 里面当然也有 NAND Flash。

但 SSD 里面的控制器比 eMMC、SD 卡复杂得多。

特别是 NVMe SSD,里面可能有:

CPU core,
DRAM cache,
DMA engine,
queue scheduler,
firmware,
FTL。

它会自己做垃圾回收,自己做磨损均衡,自己做地址映射,自己处理并行访问。

Linux 这边看到的就是标准块设备:

/dev/sda       # SATA SSD
/dev/nvme0n1   # NVMe SSD

如果是 NVMe,还要先看 PCIe 链路有没有起来,再看 nvme 驱动有没有 probe 成功。

做 SoC bring-up 时,调 NVMe SSD 很多时候已经不是在调“存储”,更像是在调:

PCIe link,
MSI/MSI-X,
DMA,
IOMMU,
BAR,
queue。

这和调 SPI NOR、eMMC 已经是两种现场了。

驱动视角看,一眼看设备名

调板子时,很多时候先不用翻资料。

先看系统里冒出来什么设备:

lsblk
cat /proc/partitions

看到:

mtd0

通常是裸 Flash。

看到:

mmcblk0

可能是 eMMC,也可能是 SD 卡。

看到:

sda

多半是 SATA SSD 或 USB 存储。

看到:

nvme0n1

就是 NVMe SSD。

真实项目里,它们经常一起出现

很多板子不会只选一种存储。

一个常见结构大概是这样:

每种存储都放在自己舒服的位置。

小 Flash 负责把系统带起来。
eMMC 负责稳定跑系统。
SD 卡负责临时交换。
SSD 负责高性能和大容量。

最后留一个现场判断

以后看到这些词,可以先按驱动框架去想:

这样就不容易乱了。

Flash 是做存储设备的材料。
eMMC、SD 卡、SSD 里面都可以有 Flash。
真正影响驱动和 BSP 工作量的,是它们外面包了多少控制器、协议和管理逻辑。

编辑于 2026-04-27 · 著作权归作者所有