linux驱动结构之kobject及相关结构

原创 2011年01月13日 14:16:00

     kobject最初只是被理解为一个简单的引用计数,但现在也有了很多成员,它所能处理的任务以及它所支持的代码包括:对象的引用计数、sysfs表述、结构关联、热插拔事件处理等。kobject结构定义于linux/kobject:
        struct kobject {
            const char      *k_name;
            char            name[KOBJ_NAME_LEN];
 /*k_name指针指向kobject名称的起始位置,如果名称长度小于KOBJ_NAME_LEN,那么该kobject的名称便存放到name数组中,k_name指向数组头;如果名称大于20,则动态分配以讹足够大的缓冲区来存放kobject的名称,这时k_name指向缓冲区。*/
            struct kref     kref;   //该kobject的引用计数。
            struct list_head    entry;   //链表的节点,用于挂接到该kobject对象到kset;所有同一子系统下的所有相同类型的kobject被链接成一个链表组织在一起,成员kset就是嵌入相同类型结构的kobject集合
            struct kobject      *parent;  //指向该kobject所属分层结构中的上一层节点,所有内核模块的parent是module
            struct kset         *kset;   //所属的kest的指针  
            struct kobj_type    *ktype;  //指向对象类型描述符的指针
            struct dentry       *dentry;   //文件系统相关中雨该对象对应的文件节点入口
        };

 

调用函数:
1:void kobject_init(struct kobject *):
初始化kobject,设置引用计数为1,entry域指向自身,所属的kset引用计数加1
2:int kobject_set_name(struct kobject *, const char *, ...)
用于设置置顶的kobject名称
3:void kobject_cleanup(struct kobject *)
用于清除kobject,当引用计数为0的时候,释放对象占用的资源
4:struct kobject *kobject_get(struct kobject *)
增加一个引用计数,返回该对象指针
5:void kobject_put(struct kobject *)
减少引用计数
6:int kobject_add(struct kobject *)
将对象加入linux设备层次,挂接该对象到kset的list中,增加父目录各级kobject的引用计数;并在其父对象指向的目录下创建文件节点,并启用该类型内核对象的hotplug函数
7:int kobject_add(struct kobject *)
kobject_add()函数的反函数,操作相反
8:int kobject_register(struct kobject *)
用于注册kobject,先调用kobject_init()函数进行初始化,后调用kobject_add()完成对象增加
9:int kobject_unregister(struct kobject *)
先调用kobject_del从设备层次删除该对象,在调用kobject_put减少该对象的引用计数,如果引用计数降为0,则释放该对象

 

注:新创建的kobject被加入到kset时(调用kobject_init),引用计数被加1,然后kobject跟它的parent建立关联时,引用计数被加1,所以一个新创建的kobject,其引用计数总是为2。另外kobject通常是嵌入到其他结构中的,其单独意义其实并不大。相反,那些更为重要的结构体才真正需要用到kobject结构。比如struct cdev。

 

其他相关结构:

1:struct kset {
    struct subsystem    *subsys;  //所在的subsystem的指针
    struct kobj_type    *ktype;  //指向该kest的kobject对象类型描述符的指针,被该kset的所有kobject共享
    struct list_head    list;  //用于连接该kset所拥有的kobject的链表头
    spinlock_t          list_lock;  //用于同步的自旋锁
    struct kobject      kobj;  //嵌入的kobject对象,用于引用计数,这也是该kset的引用计数
    struct kset_uevent_ops  * uevent_ops;  //事件操作集,具体可看linux设备驱动开发详解P102
    };
注:起调用函数与kobject基本类似

 

2:struct kobj_type {
   void  (*release)(struct kobject *);  //kobject引用计数减至0时要调用的析构函数
   struct  sysfs_ops  * sysfs_ops;   //属性操作
   struct  attribute  ** default_attrs;   //默认属性
};
注:其属性操作函数由sysfs_ops定义:
struct sysfs_ops
   {
       ssize_t (*show)(struct kobject *kobj, struct attribute *attr, char *buffer);
       ssize_t (*store)(struct kobject *kobj, struct attribute *attr, const char *buffer, size_t size);
   };

 

 3:struct kset_uevent_ops {
   int (*filter)(struct kset *kset, struct kobject *kobj);
   const char *(*name)(struct kset *kset, struct kobject *kobj);
   int (*uevent)(struct kset *kset, struct kobject *kobj, char **envp,                       
                  int num_envp, char *buffer, int buffer_size);};

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

浅析Linux驱动模型中的底层数据结构kobject和kset

1、kobject         Linux内核用kobject来表示一个内核对象。它和Sysfs文件系统联系密切,在内核中注册到系统中的每个kobject对象在sysfs文件系统中对对应着一个文件...

linux驱动结构之class及相关结构体

设备类struct class是一个设备的高级视图,它抽象出低级的实现细节。例如,驱动可以见到一个SCSI磁盘或者一个ATA磁盘,在类的级别,他们都是磁盘,类允许用户空间基于它们作什么来使用设备,而不...

linux驱动结构之class及相关结构体

linux驱动结构之class及相关结构体的原型、解释及调用

Linux设备驱动模型浅析1---sysfs及基本数据结构:kobject,kset,ktype

Sysfs文件系统是一个类似于proc文件系统的特殊文件系统,用于将系统中的设备组织成层次结构,并向用户模式程序提供详细的内核数据结构信息。其实,就是 在用户态可以通过对sys文件系统的访问,来看内核...

linux驱动结构pci

  • 2011-11-27 13:32
  • 446KB
  • 下载

linux驱动程序结构描述

  • 2012-10-29 16:45
  • 1.24MB
  • 下载

Linux驱动学习3(个人对kobject的一点研究)

在LINUX中最让人不解的大概就是/sys下面的内容了 下面首先让我们来创建一个简单的platform设备,并从这个设备的视角进行深入,在此篇文章的深入过程中,我们只看kobeject的模型 我所使...

DM6467的OV5642 Linux驱动程序开发(一)——V4L2框架结构

1        Vpif的V4L2 linux驱动程序框架 在linux中,使用V4L2框架来管理视频采集设备。V4L2框架主要包括两层:V4L2Device和V4L2 Subdevice,其中V...

linux驱动结构之device

系统中任一设备都有一个device对象描述,定义在linux/include/linux/device.h struct device {         struct klist   ...

linux驱动移植的重要数据结构(一)

对于嵌入式 Linux 系统来说,有各种体系结构的处理器和硬件平台,并且用户需要根据需求自己定制硬件板。只要是硬件平台有些变化,即使非常小,可能也需要做一些移植工作。内核移植是嵌入式Linux系统中最...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)