🧠
Linux 设备模型(Device Model)是内核实现驱动管理的基础框架,不仅支撑驱动开发和设备管理,还提供了与用户空间交互的统一接口。本篇博文将详细而清晰地讲解设备模型的核心概念、结构组成、总线分类,并深入阐述设备模型如何通过 sysfs 文件系统与用户空间交互,帮助你建立清晰的知识框架。
📘 第一部分:Linux 设备模型基础
Linux 设备模型是内核统一管理硬件设备、驱动程序及其匹配关系的基础架构。其核心作用是将设备、驱动程序以及两者的连接抽象出来,形成清晰易维护的体系。
设备模型包含三个核心结构:
结构 | 核心类型 | 作用描述 |
---|---|---|
设备 | struct device | 表示系统中的硬件设备 |
驱动 | struct device_driver | 实现对设备的操作与管理 |
总线 | struct bus_type | 连接设备与驱动,提供匹配机制 |
设备和驱动必须挂载在同一总线类型下,内核才能自动匹配并调用驱动的 probe()
接口。
📘 第二部分:核心数据结构详解
✅ 结构体 device
表示具体设备实例,包括设备树节点信息、父子关系以及总线类型等元数据:
struct device {
const char *init_name; // 设备初始名称
struct bus_type *bus; // 所属总线
struct device_driver *driver; // 匹配驱动
struct device *parent; // 父设备
struct device_node *of_node; // 对应设备树节点
...
};
✅ 结构体 device_driver
表示驱动程序,定义驱动名称、匹配设备的规则和生命周期管理函数:
struct device_driver {
const char *name; // 驱动名称
const struct of_device_id *of_match_table; // 匹配设备的兼容性表
int (*probe)(struct device *dev); // 驱动初始化回调
int (*remove)(struct device *dev); // 驱动移除回调
struct bus_type *bus; // 驱动所依附的总线
...
};
✅ 结构体 bus_type
连接设备和驱动程序,提供匹配逻辑,定义总线的匹配规则:
struct bus_type {
const char *name; // 总线名称
int (*match)(struct device *dev, struct device_driver *drv); // 设备驱动匹配方法
...
};
📘 第三部分:Linux 总线类型与分类
🔹 实体总线 vs 虚拟总线
总线类别 | 示例 | 描述 |
---|---|---|
实体总线 | PCI、USB、I2C、SPI | 物理存在于硬件电路中,具有枚举机制 |
虚拟总线 | platform、serio、amba | 无物理总线控制器,依赖设备树或手动注册 |
🔹 常见总线目录
/sys/bus/
├── platform
├── pci
├── usb
├── i2c
├── spi
├── serio
├── scsi
每种总线下均包含两个子目录:
devices/
:包含挂接的所有设备实例drivers/
:包含注册到总线的驱动程序
📘 第四部分:sysfs 文件系统与设备模型映射
Linux 通过 sysfs 文件系统,将内核设备模型的数据结构映射到用户空间,提供便捷的查看与调试接口。
路径 | 描述 |
---|---|
/sys/bus/ | 总线类型列表及设备驱动映射关系 |
/sys/devices/ | 所有设备的拓扑结构,从根设备开始 |
/sys/class/ | 抽象功能分类,如网络接口、输入设备 |
/sys/module/ | 当前加载的内核模块及其参数 |
/sys/kernel/ | 内核的各种状态、调度策略及调试接口 |
/sys/power/ | 电源管理接口,如 suspend/resume |
/sys/fs/ | 包含 sysfs、debugfs 等虚拟文件系统 |
/sys/firmware/ | 固件信息、设备树信息 |
📘 第五部分:设备模型分类方式
🔸 按总线类型分类
总线类型 | 应用场景 |
---|---|
platform | SoC 内部集成外设,如 GPIO、PWM、ADC |
i2c | EEPROM、传感器、RTC 等低速设备 |
spi | Flash 存储、传感器等高速串行设备 |
pci | 网卡、显卡等扩展设备 |
usb | 外部可热插拔设备,如摄像头、鼠标、键盘等 |
🔸 按功能子系统分类
子系统 | 路径 | 设备示例 |
---|---|---|
网络 | drivers/net/ | 网卡、无线网络模块 |
图形 | drivers/gpu/ | DRM、Framebuffer 等显示设备 |
音频 | sound/ | ALSA 声卡驱动 |
存储 | drivers/mmc/ , drivers/scsi/ | SD 卡、U盘、SATA 硬盘等 |
平台设备 | drivers/platform/ | GPIO 控制器、ADC 控制器等 |
📘 第六部分:总结与应用
Linux 设备模型通过统一抽象的结构和 sysfs 文件系统接口,实现了设备与驱动的清晰划分与管理,提升了内核驱动的模块化程度和开发效率。掌握设备模型的核心知识,有助于更有效地进行驱动开发和内核调试。
📚 延伸阅读与参考资源
- Linux 内核源码目录:
drivers/base/
、include/linux/device.h
- 内核文档:
Documentation/driver-model/
- 《Linux Device Drivers》第三版
- Greg Kroah-Hartman 设备模型讲解视频
下一篇博文我们将继续深入,聚焦设备资源管理机制,探讨如何通过 platform_get_resource()
、devm_*()
、of_property_read_*()
等关键 API 实现设备资源的安全高效管理与驱动初始化流程,进一步强化对 Linux 驱动开发的理解。