linux 设备模型

本文深入探讨了Linux内核结构中的kobject和kset组件,阐述了它们在设备管理、电源管理、与用户空间通信及热插拔等方面的功能。同时介绍了kobject和kset的组成结构、主要接口及其在系统中的应用,为理解Linux设备模型提供了全面的视角。

      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


 

 

 

 

 

 

待续。。。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值