linux 设备模型

来源:互联网 发布:淘宝客订单虚假交易 编辑:程序博客网 时间:2024/04/28 07:42

      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


 

 

 

 

 

 

待续。。。。。。。。