1. Linux设备模型概述
Linux设备模型是内核中用于统一管理各类硬件设备的框架体系。它不仅仅是一个简单的设备列表,而是一套完整的对象关系管理系统。想象一下,当你插入一个USB设备时,内核需要知道这个设备是什么类型、由哪个驱动管理、挂载在哪个总线、需要哪些资源——所有这些信息都由设备模型来组织和维护。
设备模型的核心价值在于:
- 提供统一的设备表示方法,消除不同总线架构间的差异
- 实现设备的热插拔支持
- 建立清晰的设备-驱动-总线关系拓扑
- 通过sysfs向用户空间暴露设备信息
在2.6内核之前,Linux对各种总线的支持是分散实现的,导致代码重复率高、维护困难。设备模型的引入彻底改变了这种局面,它用面向对象的思想重构了整个设备管理体系。
2. 设备模型的核心数据结构
2.1 kobject:基础构建块
kobject是设备模型的原子单位,相当于面向对象中的基类。每个在内核中注册的设备、驱动或总线都是一个kobject实例。它的主要职责包括:
- 引用计数管理
- sysfs目录项创建
- 父子关系维护
- 事件通知机制
c复制struct kobject {
const char *name; // sysfs显示名称
struct list_head entry; // 链表节点
struct kobject *parent; // 父对象指针
struct kset *kset; // 所属集合
struct kobj_type *ktype; // 类型描述符
struct kernfs_node *sd; // sysfs节点
struct kref kref; // 引用计数
};
2.2 kset:对象容器
kset是kobject的集合容器,它实现了以下关键功能:
- 聚合相同类型的kobject
- 提供统一的uevent事件处理
- 管理包含对象的生命周期
典型的kset实例包括:
- 所有PCI设备集合(pci_devices_kset)
- 块设备集合(block_kset)
- 字符设备集合(char_kset)
