真实面经题目 · 原创解析
MTD 子系统如何处理 SPI 多设备?
这题考 MTD、SPI core 和存储器驱动分层,回答要说明每个片选上的存储器作为独立 spi device,由 spi-nor 或 spi-mem 驱动注册成独立 MTD 设备和分区。
真实面经题目 · 原创解析
这题考 MTD、SPI core 和存储器驱动分层,回答要说明每个片选上的存储器作为独立 spi device,由 spi-nor 或 spi-mem 驱动注册成独立 MTD 设备和分区。
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 面向没有块设备翻译层的 Flash,提供擦除块、读写和分区管理。它关心存储语义,不直接关心底层是并口、SPI 还是 NAND 控制器。
同一控制器下多个设备通过不同 chip select 区分。设备树子节点的 reg 通常表示片选号,控制器驱动保证一次传输只选中目标设备。
每个 spi_device 都会匹配到存储器驱动,驱动读取 ID、设置读写擦命令、能力和大小,然后注册一个 mtd_info。多个 Flash 就对应多个 MTD 设备或多个分区树。
现代 SPI 存储器常通过 spi-mem 描述 opcode、地址、dummy 和数据阶段,让控制器可以选择普通传输、四线模式或内存映射加速。
SPI bus 锁保证传输互斥,MTD 层处理分区和擦写边界。上层文件系统或升级逻辑应按对应 mtd 设备访问,不能跨片选假设连续空间。
默认通常是独立 mtd 设备。要合成连续空间需要上层显式做拼接或专门驱动支持,不能假设 MTD 自动跨设备拼接。
MTD 暴露原始 Flash 的擦除块和写入限制;块设备提供固定扇区读写抽象,通常隐藏了擦除和磨损细节。
我会先看 dmesg 和返回码,再查 /sys 下设备、驱动和资源状态,必要时加 trace/ftrace 或最小日志,先证明问题出在设备生成、匹配、资源获取、回调路径还是用户态交互。