Linux设备驱动模型
目录
Linux设备驱动模型前言一、linux重要数据结构体1、kobject2、kset3、kobj_type
前言
Linux 驱动架构学习
一、linux重要数据结构体
1、kobject
结构体kobject是组成设备驱动模型的基本结构。 kobject 结构体如下:
#include <linux/kobject.h>
struct kobject
{
const char *name
;
struct list_head entry
;
struct kobject
*parent
;
struct kset
*kset
;
struct kobj_type
*ktype
;
struct kernfs_node
*sd
;
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;
};
在linux内核中,没有kobject直接定义的变量,kobject只作为一个抽象的基类,将kobject嵌入到另一个结构中,这个结构就可以看做是kobject的一个子类。而kobject的子类关注kobject的属性和方法。
内核里的设备之间是以树状形式组织的,树形结构每一个目录对应一个kobject对象(目录组织结构和名字等信息)在这种组织架构里靠上层的节点可以看作是下层节点的父节点,反映到sysfs里就是上级目录和下级目录之间的关系。在内核里,正是kobject帮助我们实现这种父子关系。
成员功能介绍:
struct list_head entry;
平行链接的链表指针,多个kobject 可以使用这个链表链接起来。当设备接入linux机器时,就通过这个链表,用来遍历这个结构体,以配对相应的驱动程序。
struct kobject *parent;
指向上一层结构(父节点)。如果一个kobject 表示一个USB设备,那么它的parent指针指向了USB集线器,而这个USB挂接到这个集线器上的。
struct kset *kset;
指向所属的kest集合,kset包含了kobject,kobject绑定kset
struct kobj_type *ktype;
指针,用来绑定kobj_type,提供给kobject功能。将属性单独组织成数据结构kobj_type存放在ktype中。对于sysfs中的普通文件读写操作都是由kobject->ktype->sysfs_ops来完成的。
kobject提供的服务:
-对象引用计数 -维护对象链表 -对象上锁 -用户空间表示
kobject的作用归纳:
(1)kobject始终代表sysfs文件系统中的一个目录,name成员指定了目录名。 (2)parent成员指定了kobject在sysfs中的目录,从而形成一个树形结构。 (3)ktype是kobject的属性,属性用文件来表示,放在kobject对应目录下。
2、kset
struct kset
{
struct list_head list
;
spinlock_t list_lock
;
struct kobject kobj
;
const struct kset_uevent_ops
*uevent_ops
;
};
3、kobj_type
struct kobj_type
{
void (*release
)(struct kobject
*kobj
);
struct sysfs_ops
*sysfs_ops
;
struct attribute
**default_attrs
;
};
Kobj type数据结构包含三个成员。 release方法用于释放kobject占用的资源、sysfs_ops指针指向sysfs操作表、一个sysfs文件系统缺省属性列表。 Sysfs操作表包括两个函数store()和show()。当用户态读取属性时,show()函数被调用,该函数编码指定属性值存入buffer中返回给用户态;而store()函数用于存储用户态传入的属性值
其中struct sysfs_ops 定义如下:
struct sysfs_ops
{
ssize_t
(*show
)(struct kobject
*, struct attribute
*,char *);
ssize_t
(*store
)(struct kobject
*,struct attribute
*,const char *, size_t
);
};
kobject和kset关系图