kobject与sysfs

来源:互联网 发布:玩手游的软件 编辑:程序博客网 时间:2024/05/16 13:00

2.6内核增加了一个引人注目的新特性----统一设备模型。

 

设备模型提供了一个独立的机制专门来表示设备,并描述其在系统中的拓补结构。

 

 1,kobject 设备模型的核心部分就是kobject, 它由struct kobject结构体表示,定义于中。

kobject提供了诸如引用计数、名称和父指针等字段。具体结构如下:

struct kobject { const char *name; //名称

struct list_head entry; struct kobject *parent;//父指针

 struct kset *kset;//kobject对象的集合体

struct kobj_type *ktype; //kobject对象被关联到的一种特殊的类型

struct sysfs_dirent *sd; struct kref kref; //引用计数通过此结构体实现的

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; };

下面看下ktype结构体:

struct kobj_type { void (*release)(struct kobject *kobj); //kobject引用计数减至0时要调用的析构函数

struct sysfs_ops *sysfs_ops; //描述了sysfs文件读写时的特性

struct attribute **default_attrs; //定义了该kobject相关的默认属性 };

下面再看下kset结构体: struct kset { struct list_head list; //连接该集合(kset)中所有kobject对象

spinlock_t list_lock; struct kobject kobj; //该集合的基类

struct kset_uevent_ops *uevent_ops;//uevent相关操作 };

看完主要的kobject的相关结构体,下面接着看kobject的管理与操作:

 void kobject_init(struct kobject *kobj, struct kobj_type *ktype);

该函数用来初始化kobject,初始化并设置名称后,还需要为它设置kset和ktype字段。

kobject的引用计数: 主要有两个函数:

struct kobject *kobject_get(struct kobject *kobj); //增加一个引用计数

void kobject_put(struct kobject *kobj); //减少引用计数

 

2、sysfs sysfs文件系统是一个处于内存中的虚拟文件系统,它为我们提供了一个kobject的对象层次结构的视图。帮助用户能以一个简单文件系统的方式来观察系统中各种设备的拓补结构。借助属性对象,kobject可以用引导出文件的方式,将内核变量提供给用户读取或写入。

sysfs的诀窍是把kobject对象与目录项(directory entry)紧密联系起来,这点是通过kobject对象中的dentry字段实现的。

dentry结构体表示目录项,通过连接kobject到指定的目录项上,无疑方便地将kobject映射到该目录上。

从此,把kobject导出形成文件系统就变成如同在内存中构建目录项一样简单。

好了,kobject其实已经形成了一颗树了----就是我们心爱的对象模型体系。

由于kobject被映射到目录项,同时对象层次结构也已经在内存中形成一颗树了,因此sysfs的生成便水到渠成般的简单了。

sysfs中添加和删除kobject int kobject_register(); int kobject_unregister();

在中 struct attribute { const char *name;//属性名称

struct module *owner;//所属模块 mode_t mode;//权限 };

struct sysfs_ops { ssize_t (*show)(struct kobject *, struct attribute *,char *); //在读sysfs文件时候,该方法被调用

ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t);//在写sysfs文件的时候,该方法被调用 };

show()方法在读操作时被调用。它会拷贝由attr提供的属性值到指定的buffer缓冲区中,缓冲区大小为PAGE_SIZE字节。

 store()方法在写操作时调用,它会从buffer中读取size大小的字节,并将其存入attr表示的属性结构体变量中。缓冲区大小总是为PAGE_SIZE或更小些。