您的位置:首页 > 运维架构 > Linux

LINUX设备驱动之设备模型一--kobject

2014-09-10 10:30 211 查看
本站分析linux内核源码,版本号为2.6.xx.x

在建立linxu设备模型中kobject是一个重要的而且基础的数据结构,如果向内核注册一个kobject就相当于在sysfs文件系统下建立一个目录 .kobject又被嵌入到一个更大结构kset当中 ,在设备模型中 总线,设备,驱动就是典型的ket模型.

[align=left]下面引用ULK3中的一张图来看看:[/align]





这个图很清晰的给我们展示了一个驱动注册到pci总线上后.sys下的目录结构. 从这里我们我们可以看出使用sysfs文件系统建立起来的设备模型是很有层次的.
pci和drivers都是一个ket组成,serial由kobj构成, 在serial这个目录下面有一个属性文件new-id .


--------------------------------------------------------------

LINUX设备驱动驱动程序模型的核心数据结构是kobject,kobject数据结构在\linux\kobject.h中定义:

struct kobject {

const char *name;

struct list_head entry;

struct kobject *parent;

struct kset *kset;

struct kobj_type *ktype;

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;

unsigned int uevent_suppress:1;

};

每个kobject都有它的父节点parent、kset、kobj_type指针,这三者是驱动模型的基本结构,kset是kobject的集合,在\linux\kobject.h中定义:

struct kset {

struct list_head list;

spinlock_t list_lock;

struct kobject kobj;

struct kset_uevent_ops *uevent_ops;

};

可以看到每个kset内嵌了一个kobject(kobj字段),用来表示其自身节点,其list字段指向了所包含的kobject的链表头。我们在后面的分析中将看到kobject如果没有指定父节点,parent将指向其kset内嵌的kobject。

每个kobject都有它的kobj_type字段指针,用来表示kobject在文件系统中的操作方法,kobj_type结构也在\linux\kobject.h中定义:

struct kobj_type {

void (*release)(struct kobject *kobj);

struct sysfs_ops *sysfs_ops;

struct attribute ** default_attrs;

};

release方法是在kobject释放是调用,sysfs_ops指向kobject对应的文件操作,default_attrskobject的默认属性,sysfs_ops的将使用default_attrs属性(在后面的分析中我们将会看到)。

从上面的分析我们可以想象到kobject、kset、kobj_type的层次结构:









我们可以把一个kobject添加到文件系统中去(实际上是添加到其父节点所代表的kset中去),内核提供kobject_create_and_add()接口函数:

struct kobject *kobject_create_and_add(const char *name, struct kobject *parent)

{

struct kobject *kobj;

int retval;

kobj = kobject_create();

if (!kobj)

return NULL;

retval = kobject_add(kobj, parent, "%s", name);

if (retval) {

printk(KERN_WARNING "%s: kobject_add error: %d\n",

__func__, retval);

kobject_put(kobj);

kobj = NULL;

}

return kobj;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: