
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 工作量的,是它们外面包了多少控制器、协议和管理逻辑。