linux设备模型是对linux内核结构的一个基本的描述,主要功能包括:电源管理(比如说休眠,待机之类的),与用户空间通信(利用sysfs和用户空间交互),热插拔,提供设备类型信息,维护对象的生命周期。主要有下面组件组成。
一、 kobject 和 kset
kobject
1、数据结构
struct kobject {
const char *name;//指向对象的名字
struct list_head entry;//连接所在kset单元中的兄弟
struct kobject *parent; //指向父对象
struct kset *kset; //指向所属的kset
struct kobj_type *ktype;//指向对象类型描述符指针
struct sysfs_dirent *sd; //对象在sysfs文件系统中的目录
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;
};
2、主要接口:
void kobject_init(struct kobject *kobj, struct kobj_type *ktype) 初始化一个kobject结构
void kobject_put(struct kobject *kobj) 减少对象的引用计数,并在次数为0的时候释放他
struct kobject *kobject_get(struct kobject *kobj) 增加对象引用计数
struct kobject *kobject_create_and_add(const char *name, struct kobject *parent) 动态创建一个kobject对象,并将他注册进sysfs中
kset
它是嵌入到相同类型结构的kobject集合,属于一个特定的子系统,kobject利用它找到自己所属的类型,然后在sys下建立正确的位置,
1、数据结构
struct kset {
struct list_head list;//所拥有的kobject链表的头部
spinlock_t list_lock; //list操作的自旋锁
struct kobject kobj;//内嵌的kobject
struct kset_uevent_ops *uevent_ops;//
};
2、主要接口
void kset_init(struct kset *k) 初始化一个kset结构
struct kset *kset_create_and_add(const char *name,
struct kset_uevent_ops *uevent_ops,
struct kobject *parent_kobj) 动态创建一个kset结构,并将它添加到sysfs中
static void kset_release(struct kobject *kobj) 释放一个kset 结构
kobject 和 kset 单独用的时候很少,下面是一个不会用到的例子~~
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kobject.h>
static struct kset *my_kset;
static struct kobject my_kobj;
static void my_kobj_release(struct kobject *kobj);
static struct kobj_type my_type = {
.release = my_kobj_release,
};
static void my_kobj_release(struct kobject *kobj)
{
printk("%s %d, release kobj %s\n",__func__, __LINE__,kobj->name);
// kfree(kobj);
}
static int __init example_init(void)
{
int retval;
my_kset = kset_create_and_add("my_kset", NULL, NULL);
if(!my_kset)
{
printk("%s %d,create kset failed\n",__func__, __LINE__);
return -ENOMEM;
}
memset(&my_kobj, 0, sizeof(my_kobj));
my_kobj.kset = my_kset;
retval = kobject_init_and_add(&my_kobj, &my_type, NULL, "%s","my_kobj");
if(retval)
{
kobject_put(&my_kobj);
kset_unregister(my_kset);
printk("%s %d kobject create fail\n",__func__, __LINE__);
return -EINVAL;
}
printk("my kset kobj create success\n");
return 0;
}
static void __exit example_exit(void)
{
kobject_put(&my_kobj);
kset_unregister(my_kset);
printk("my kset kobj release success\n");
}
module_init(example_init);
module_exit(example_exit);
MODULE_LICENSE("GPL");
把这个模块插入内核后效果是,在/sys 多一个my_kset目录 在my_kset中有一个my_kobj
二 bus device driver
待续。。。。。。。。
本文深入探讨了Linux内核结构中的kobject和kset组件,阐述了它们在设备管理、电源管理、与用户空间通信及热插拔等方面的功能。同时介绍了kobject和kset的组成结构、主要接口及其在系统中的应用,为理解Linux设备模型提供了全面的视角。
921

被折叠的 条评论
为什么被折叠?



