Linux 驱动数据模型

    科技2022-07-10  136

    Linux设备驱动模型

    目录

    Linux设备驱动模型前言一、linux重要数据结构体1、kobject2、kset3、kobj_type


    前言

    Linux 驱动架构学习


    一、linux重要数据结构体

    1、kobject

    结构体kobject是组成设备驱动模型的基本结构。 kobject 结构体如下: #include <linux/kobject.h> struct kobject { const char *name;  //kobject的名称,显示在sysfs文件系统中,就是一个目录的名字。 struct list_head entry; //链接下一个kobject结构,维护对象链表功能,平行链接 struct kobject *parent; //指向父kobject结构体,有层次的链接 struct kset *kset; struct kobj_type *ktype;   struct kernfs_node *sd; //对应sysfs的文件目录 struct kref kref; //kobject的引用计数 #ifdef CONFIG_DEBUG_KOBJECT_RELEASE struct delayed_work release; #endif 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; }; 在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关系图
    Processed: 0.010, SQL: 8