学习中platform平台驱动中,慢慢发现底层有一个叫做linux设备驱动模型的东西。发现是它是底层驱动重要的组织结构,现在针对设备驱动模型进行分析。从而加深对整个设备驱动注册的理解。
用户空间程序通过sysfs虚拟文件系统访问设备的相关信息。这些信息被组织成层次结构,用sysfs虚拟文件系统来表示,用户通过对sysfs的操作,就可以控制设备或者读取设备的信息。
kobj_type-->属性文件
struct kobject {
const char *name; kobject的名称,显示在sysfs文件系统中,作为一个目录的名字。
struct list_head entry; 链接下一个kobject结构
struct kobject *parent; 指向父kobject结构体
struct kset *kset; 指向所属的kest集合
struct kobj_type *ktype; 指向kobject的属性文件,每个对象都有属性
将属性单独组织成数据结构kobj_type存放在ktype中
对于sysfs中的普通文件读写操作都是由kobject->ktype->sysfs_ops来完成的
struct sysfs_dirent *sd; 对应sysfs的文件目录
struct kref kref; kobject的引用计数
unsigned int state_initialized:1; 初始化状态
unsigned int state_in_sysfs:1; 是否已经加入到sysfs中
unsigned int state_add_uevent_sent:1;
unsigned int state_remove_uevent_sent:1;
unsigned int uevent_suppress:1;
};
name表示的是kobject在sysfs中的名字;
指针parent用来指向kobject的父对象;
Kref大家应该比较熟悉了,kobject通过它来实现引用计数;
Kset指针用来指向这个kobject所属的kset;
对于ktype用来描述kobject的类型信息。
kobject的作用:
(1)kobject始终代表sysfs文件系统中的一个目录,name成员指定了目录名,不是文件。
(2)parent成员指定了kobject在sysfs中的目录,从而形成一个树形结构。
(3)ktype是kobject的属性,属性用文件来表示,放在kobject对应目录下。
struct kobj_type {
void (*release)(struct kobject *kobj); 释放kobject和其占用资源的函数
const struct sysfs_ops *sysfs_ops; 操作下一个属性数组的方法
struct attribute **default_attrs; 属性数组
const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);
const void *(*namespace)(struct kobject *kobj);
};
kobj_type的default_attrs成员保存了属性数组,每个kobject对象可以一个或多个属性,属性的定义如下:struct attribute {
const char *name; 属性的名称,对应目录下一个文件的名字
umode_t mode; 属性的读写权限
#ifdef CONFIG_DEBUG_LOCK_ALLOC
struct lock_class_key *key;
struct lock_class_key skey;
#endif
};
kobj_type的default_attrs数组表明了kobject有哪些属性,但是没有说明如何操作这些属性,这个任务由kobj_type的struct sysfs_ops {
ssize_t (*show)(struct kobject *, struct attribute *,char *); 读属性操作函数
ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t); 写属性操作函数
const void *(*namespace)(struct kobject *, const struct attribute *);
};
kobject:要读写的kobject指针,attribute:要读写的属性。struct kset {
struct list_head list;
spinlock_t list_lock;
struct kobject kobj;
const struct kset_uevent_ops *uevent_ops;
};
kobject与kset对应关系:
目前的简单理解:
linux存在一个虚拟文件系统/sysfs,内核启动挂接文件系统后会将sysfs文件系统挂接到/sys下。内核启动时会初始化并注册一些总线、设备,这些总线、设备等会在sys下创建目录,来存储,如/sys/bus/platform 下存储了平台设备信息。如何组织管理设备,并创建目录呢,通过设备驱动模型的几个重要结构体:Kobject、kobj_type、kset来组织和管理目录及文件结构。