60 秒回答模板

MTD 是内核对原始 Flash 类存储的抽象,向上提供 erase、read、write、block_isbad、分区等接口;SPI 多设备本身由 SPI core 和控制器通过 chip select 管理。对于多个 SPI Flash,设备树会在同一个 SPI controller 下描述多个子节点,每个子节点有自己的 reg 片选、compatible、频率和模式。内核创建多个 spi_device 后,spi-nor 或基于 spi-mem 的驱动分别 probe 每个设备,读取 JEDEC ID,建立 spi_nor/mtd_info,并向 MTD core 注册成独立 mtd 设备;每个设备还可以根据 fixed-partitions 或命令行再切成分区。真正访问时,MTD 调用底层驱动,底层通过 spi-mem/spi_sync 发命令,SPI controller 选择对应 CS。关键是 MTD 不直接仲裁片选,片选和总线互斥由 SPI core/controller 处理,MTD 负责存储抽象和分区。

考点 分层结构
难度 真实面经题
回答目标 证明自己理解 MTD 存储抽象、SPI 多设备枚举和存储器驱动注册之间的边界。

深入解析

01

MTD 抽象原始存储

MTD 面向没有块设备翻译层的 Flash,提供擦除块、读写和分区管理。它关心存储语义,不直接关心底层是并口、SPI 还是 NAND 控制器。

02

SPI core 管理多片选

同一控制器下多个设备通过不同 chip select 区分。设备树子节点的 reg 通常表示片选号,控制器驱动保证一次传输只选中目标设备。

03

存储器驱动逐个注册 MTD

每个 spi_device 都会匹配到存储器驱动,驱动读取 ID、设置读写擦命令、能力和大小,然后注册一个 mtd_info。多个 Flash 就对应多个 MTD 设备或多个分区树。

04

spi-mem 统一存储命令

现代 SPI 存储器常通过 spi-mem 描述 opcode、地址、dummy 和数据阶段,让控制器可以选择普通传输、四线模式或内存映射加速。

05

并发和分区要分层处理

SPI bus 锁保证传输互斥,MTD 层处理分区和擦写边界。上层文件系统或升级逻辑应按对应 mtd 设备访问,不能跨片选假设连续空间。

易错点

  • 认为 MTD 自己负责 SPI 片选仲裁。
  • 把多个片选上的 Flash 当成一个天然连续地址空间。
  • 只讲 SPI 传输,不讲 spi-nor 注册 mtd_info 和分区。
  • 忽略擦除粒度、写使能、busy 等原始 Flash 语义。

面试官追问

多个 SPI Flash 能不能合成一个连续 MTD?

默认通常是独立 mtd 设备。要合成连续空间需要上层显式做拼接或专门驱动支持,不能假设 MTD 自动跨设备拼接。

MTD 和块设备有什么区别?

MTD 暴露原始 Flash 的擦除块和写入限制;块设备提供固定扇区读写抽象,通常隐藏了擦除和磨损细节。

如果面试官让你现场排查,你会先看哪些证据?

我会先看 dmesg 和返回码,再查 /sys 下设备、驱动和资源状态,必要时加 trace/ftrace 或最小日志,先证明问题出在设备生成、匹配、资源获取、回调路径还是用户态交互。