一.什么是设备模型
字符设备驱动通常适用于相对简单的设备,对于一些更复杂的功能,比如说电源管理和热插拔事件管理,使用字符设备框架可能不够灵活和高效。为了应对更复杂的设备和功能,Linux内核提供了设备模型。设备模型允许开发人员以更高级的方式来描述硬件设备和它们之间的关系,并提供一组通用 API 和机制来处理设备的注册,热插拔事件,电源管理等。通过使用设备模型,驱动开发人员可以将更多的底层功能交给内核来处理,而不必重复实现这些基础功能。这使得驱动的编写更加高级和模块化,减少了重复工作和出错的可能性。对于一些常见的硬件设备,如 USB、i2c 和平台设备,内核已经提供了相应的设备模型和相关驱动,开发人员可以基于这些模型来编写驱动,从而更快地实现特定设备的功能,并且可以借助内核的电源管理和热插拔事件管理功能。 总之,使用设备模型可以帮助简化驱动开发过程,并提供更高级的功能和灵活性,使得驱动开发人员能够更好地适应复杂的硬件设备需求。
二.kset 和 kobject 的关系
一个 kset 可以包含多个kobject,而一个kobject只能属于一个 kset。kset 提供了对 kobject 的集合管理和操作接口,用于组织和管理具有相似特性或关系的 kobject。这种关系使得内核能够以一种统一的方式管理和操作不同类型的内核对象。
三.内核对象机制主要数据结构
kobject 结构体在内核源码 kernel/include/linux/kobject.h文件中,它包含了一些字段用于表示和管理内核对象。
struct kobject {
const char *name;
struct list_headentry;
struct kobject *parent;
struct kset *kset;
struct kobj_type *ktype;
struct kernfs_node *sd; /* sysfs directory entry */
struct kref kref;
#ifdef CONFIG_DEBUG_KOBJECT_RELEASE
struct delayed_work release;
#endif
unsigned int state_initialized:1;
unsigned int state_in_sysfs:1;
unsigned int state_add_uevent_sent:1;
unsigned int state_remove_uevent_sent:1;
unsigned int uevent_suppress:1;
ANDROID_KABI_RESERVE(1);
ANDROID_KABI_RESERVE(2);
ANDROID_KABI_RESERVE(3);
ANDROID_KABI_RESERVE(4);
};
const char *name:表示 kobject 的名称,通常用于在/sys 目录下创建对应的目录。
- struct list_head entry:用于将 kobject 链接到父 kobject 的子对象列表中,以建立层次关系。
- struct kobject *parent:指向父 kobject,表示 kobject 的层次关系。
- struct kset *kset:指向包含该 kobject 的 kset,用于进一步组织和管理kobject。
- struct kobj_type *ktype:指向定义 kobject 类型的 kobj_type 结构体,描述kobject 的属性和操作。
- struct kernfs_node *sd:指向 sysfs 目录中对应的 kernfs_node,用于访问和操作sysfs目录项。
- struct kref kref:用于对 kobject 进行引用计数,确保在不再使用时能够正确释放资源。
- unsigned int 字段:表示一些状态标志和配置选项,例如是否已初始化、是否在sysfs中、是否发送了 add/remove uevent 等。
每一个 kobject 都会对应系统/sys/下的一个目录
四.为什么要引入设备模型
设备模型在内核驱动中扮演着关键的角色,通过提供统一的设备描述和管理机制,简化了驱动的编写和维护过程,提高了代码的复用性和可维护性,并支持热插拔和动态资源管理等重要功能。设备模型包含以下四个概念:
1. 总线(Bus):总线是设备模型中的基础组件,用于连接和传输数据的通信通道。总线可以是物理总线(如 PCI、USB)或虚拟总线(如虚拟设备总线)。总线提供了设备之间进行通信和数据传输的基本机制。
2. 设备(Device):设备是指计算机系统中的硬件设备,例如网卡、显示器、键盘等。每个设备都有一个唯一的标识符,用于在系统中进行识别和管理。设备模型通过设备描述符来描述设备的属性和特性。
3. 驱动(Driver):驱动是设备模型中的软件组件,用于控制和管理设备的操作。每个设备都需要相应的驱动程序来与操作系统进行交互和通信。驱动程序负责向设备发送命令、接收设备事件、进行设备配置等操作。
4. 类(Class):类是设备模型中的逻辑组织单元,用于对具有相似功能和特性的设备进行分类和管理。类定义了一组共享相同属性和行为的设备的集合。通过设备类,可以对设备进行分组、识别和访问。