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;
}
在建立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;
}
相关文章推荐
- Linux设备驱动模型学习笔记(kobject,kset,subsystem子系统)
- LINUX设备驱动之设备模型一--kobject
- LINUX设备驱动之设备模型一--kobject
- Linux kernel驱动相关抽象概念及其实现 之“linux设备模型kobject,kset,ktype”
- Linux内核部件分析<5> 设备驱动模型的基石kobject
- LINUX设备驱动之设备模型一--kobject
- 嵌入式Linux驱动笔记(十六)------设备驱动模型(kobject、kset、ktype)
- linux内核部件分析(五)——设备驱动模型的基石kobject
- linux总线设备驱动模型之Kobject&Kset
- LINUX设备驱动之设备模型一--kobject
- 嵌入式 linux下kernel代码中设备驱动模型的基石kobject
- Linux内核部件分析 设备驱动模型的基石kobject
- Linux设备驱动模型学习之基础篇--Kobject.txt翻译
- Linux设备驱动模型学习之基础篇--Kobject.txt翻译
- linux内核部件分析(五)——设备驱动模型的基石kobject
- 【加入自己的部分内容】Linux设备驱动模型学习之基础篇--Kobject.txt翻译
- 慢慢学Linux驱动开发,第五篇,初探设备模型概念
- Linux设备模型之tty驱动架构分析(转载)
- [转]linux设备模型之uart驱动架构分析(开始做驱动!!)
- linux设备模型之uart驱动架构分析