Linux内核5.4下SD卡驱动开发实战:从mmc_blk_probe到块设备注册全流程解析
在嵌入式Linux开发中,SD卡作为最常用的存储介质之一,其驱动实现机制一直是开发者需要深入理解的核心内容。本文将带你深入Linux内核5.4版本中SD卡驱动的实现细节,从mmc_blk_probe函数开始,逐步剖析块设备创建的完整流程,包括关键数据结构如request_queue、gendisk的作用机制,以及mmc_blk_alloc等核心函数的实现原理。
1. Linux块设备驱动框架概述
Linux块设备驱动架构是一个多层次的系统,从文件系统到物理设备之间经过了多个抽象层的处理。理解这个架构对于开发SD卡驱动至关重要。
核心层次结构:
- 文件系统层:如ext4、FAT32等,负责文件的组织和管理
- 通用块层(Generic Block Layer):处理块I/O请求的抽象
- I/O调度层:优化请求顺序,提高磁盘访问效率
- 块设备驱动层:直接与硬件交互的具体实现
在SD卡驱动中,这个流程具体表现为:
code复制文件系统 → 通用块层 → I/O调度层 → mmc_blk层 → mmc core层 → mmc host层 → SD卡硬件
每个层次都有其关键数据结构:
| 层次 | 关键数据结构 | 作用描述 |
|---|---|---|
| 通用块层 | struct bio | 表示一个块I/O操作 |
| I/O调度层 | struct request | 封装bio的请求 |
| I/O调度层 | struct request_queue | 管理请求队列 |
| 块设备驱动层 | struct gendisk | 表示一个磁盘设备 |
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. MMC子系统驱动模型分析
MMC子系统是Linux内核中管理MMC/SD卡的核心框架,它采用了标准的Linux设备驱动模型。在SD卡驱动中,mmc_driver是最上层的驱动结构。
c复制static struct mmc_driver mmc_driver = {
.drv = {
.name = "mmcblk",
.pm = &mmc_blk_pm_ops,
},
