1、Kobject

Kobject是设备驱动模型的核心结构,它使所有设备在底层都有统一的接口。在内核注册的kobject对象都会对应sysfs文件系统中的一个目录(目录名称有Kobject结构中k_name指定)

struct kobject {
    const char        * k_name; // 指向设备名称的指针
    char            name[KOBJ_NAME_LEN]; // 设备名称
    struct kref        kref; //引用计数
    struct list_head    entry; //所属kset集合列表成员
    struct kobject        * parent; // 指向父节点对象
    struct kset        * kset; //所属kset集合
    struct kobj_type    * ktype; //设备类型
    struct dentry        * dentry; //与该对象对应的文件节点指针
    wait_queue_head_t    poll; //等待队列
};

相关操作函数:

extern void kobject_put(struct kobject *);

kobject引用计数减1(即kref减1),当kef的值为0时,将调用release函数释放该kobject对象;

struct kobject * kobject_get(struct kobject * kobj)

kobject引用计数增1;

extern int kobject_add(struct kobject *);

将kobject对象添加到所属的kset集合中,同时创建对应的文件目录(具体实现看kobject.c中的源码);
extern void kobject_del(struct kobject *);

删除kobject对象;

extern int kobject_register(struct kobject *);

注册kobject对象,先调用kobject_init进行初始化 ,然后调用kobject_add完成对象的注册,最后调用kobject_uevent注册kobject增加事件;

extern void kobject_unregister(struct kobject *);

注销kobject对象;先调用kobject_uevent注册KOBJ_REMOVE事件(事件通知作用),然后调用kobject_del删除对象,最后调用kobject_put减少该对象的引用计数,同样当引用计数为0时将会调用release销毁函数;

2、Kset

struct kset {
    struct subsystem    * subsys;  // 所属子系统
    struct kobj_type    * ktype; // 所属Kset集合的Kobject的类型
    struct list_head    list; // 所属Kset的Kobject对象链表头
    spinlock_t        list_lock; //Kset的互斥锁
    struct kobject        kobj; // 所属Kset的Kobject对象的父节点
    struct kset_uevent_ops    * uevent_ops; // Kset相关事件处理函数
};

相关操作函数:

static inline void kset_put(struct kset * k);

kset的引用计数减1,实际kset的引用计数使用的内嵌的Kobject对象的引用计数;

static inline struct kset * kset_get(struct kset * k)

kset的引用计数加1;

int kset_add(struct kset * k)

kset_add内部调用的是kobject_add,其实就是将kset的内嵌的kobject对象挂接到上层子系统中;

kset_register、kset_unregister与Kobject中对应操作函数实现比较类似(源码详情Kobject.c)

Kobject与Kset的关系图如下:

3、Kobj_type

struct kobj_type {
    void (*release)(struct kobject *); //释放kobject函数
    struct sysfs_ops    * sysfs_ops; //属性操作字段(读和写)
    struct attribute    ** default_attrs; // 默认的属性字段,该字段指定的属性结构将以文件的形式输出到sysfs目录;

struct sysfs_ops {
    ssize_t    (*show)(struct kobject *, struct attribute *,char *buf); // 处理用户对属性值的读取,属性读取后的值保存在参数buf中;
    ssize_t    (*store)(struct kobject *,struct attribute *,const char *, size_t); // 处理用户设置的属性值
};

struct attribute {
    const char        * name; // 文件名
    struct module         * owner; // 所属模块
    mode_t            mode;
};

 

Linux内核系列设备模型(一) Kobject与Kset的更多相关文章

  1. Linux内核(7) - 设备模型(上)

    对于驱动开发来说,设备模型的理解是根本,毫不夸张得说,理解了设备模型,再去看那些五花八门的驱动程序,你会发现自己站在了另一个高度,从而有了一种俯视的感觉,就像凤姐俯视知音和故事会,韩峰同志俯视女下属. ...

  2. Linux内核(8) - 设备模型(下)

    设备模型拍得再玄幻,它也只是个模型,必须得落实在具体的子系统,否则就只能抱着个最佳技术奖空遗恨.既然前面已经以USB子系统的实现分析示例了分析内核源码应该如何入手,那么这里就仍然以USB子系统为例,看 ...

  3. linux设备驱动模型(kobject与kset)

    Linux设备模型的目的:为内核建立一个统一的设备模型,从而又一个对系统结构的一般性抽象描述.换句话说,Linux设备模型提取了设备操作的共同属性,进行抽象,并将这部分共同的属性在内核中实现,而为需要 ...

  4. Linux设备模型之kobject

    阿辉原创,转载请注明出处 参考文档:LDD3-ch14.内核文档Documentation/kobject.txt,本文中使用到的代码均摘自Linux-3.4.75 ----------------- ...

  5. 内核设备模型从kobject到子系统

                                         内核设备模型 目的:表示设备和设备在系统中的拓扑关系 优点:1减少内核代码量,2可以统一查看所有设备状态和所连接的总线,3可以 ...

  6. 基于tiny4412的Linux内核移植 -- 设备树的展开

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  7. 基于tiny4412的Linux内核移植 -- 设备树的展开【转】

    转自:https://www.cnblogs.com/pengdonglin137/p/5248114.html#_lab2_3_1 阅读目录(Content) 作者信息 平台简介 摘要 正文 一.根 ...

  8. linux驱动之设备模型

    linux 设备驱动模型 inux2.6提供了新的设备模型:总线.驱动.设备.基本关系简要的概括如下: 驱动核心可以注册多种类型的总线. 每种总线下面可以挂载许多设备.(通过kset devices) ...

  9. Linux设备驱动之Kobject、Kset

    作者:lizuobin(也是我们兼职的论坛答疑助手) 原文: https://blog.csdn.net/lizuobin2/article/details/51523693 纠结又纠结,虽然看了一些 ...

随机推荐

  1. opengl打开本地bmp图片绘制

    注意bmp图片的格式问题,32位ARGB  或者24位RGB.你所采用的素材一定要注意是多少位的就用多少位的.否则会显示错误的图片或者其他什么的错误. 代码如下 32位版本 #include < ...

  2. python获取系统时间

    import time print time.time() 输出的结果是: 1279578704.6725271 但是这样是一连串的数字不是我们想要的结果,我们可以利用time模块的格式化时间的方法来 ...

  3. git fork同步原作者

    从github上获取源代码,一种是直接下载,但是无法改动后提交. 一种是fork一下,但是和原作者同步麻烦. 所以我找到了四个命令,解决同步问题. 以后建议大家fork一下,主要是哪天对源码熟悉了,想 ...

  4. 深入理解Oracle的imp/exp 和各版本之间的规则

    Oracle数据中IMP/EXP工具可用于对数据进行迁移.IMP命令用于把Dmp文件从本地导入到远程数据库服务器,而EXP命令则是把数据从远程数据库服务器导出到本地的Dmp文件.其功能相当于Oracl ...

  5. 2016041601 - linux上安装maven

    在linux系统中安装maven,个人目前使用ubuntu15.1系统. 要想使用maven,前提条件必须配置好java. 1.检查java信息. 命令:echo $JAVA_HOME 和java - ...

  6. Oracle分析函数之FIRST_VALUE和LAST_VALUE

    FIRST_VALUE 返回组中数据窗口的第一个值 FIRST_VALUE ( [scalar_expression )OVER ( [ partition_by_clause ] order_by_ ...

  7. 一步步学习ASP.NET MVC3 (4)——Razor(2)

    请注明转载地址:http://www.cnblogs.com/arhat 在上一章,我们介绍了Razor的一些基本语法,从Razor中我们可以出ASP.NET MVC的视图引擎给我们带来的便利,但是同 ...

  8. nodejs child process

    //Create child processvar thread = require('child_process'); var msg = thread.fork(__dirname + '/chi ...

  9. word-wrap同word-break的区别(转)

    本文列举了兼容 IE 和 FF 的换行 CSS 推荐样式,详细介绍了word-wrap同word-break的区别. 兼容 IE 和 FF 的换行 CSS 推荐样式 最好的方式是 word-wrap: ...

  10. ie6 css sprites重复加载

    如果你使用css sprites,那么在ie6下并不能发挥sprites的作用,它还是会每次再重新 加载这个图片,解决方法为为ie6添加下面这条js: <!--[if IE 6]>     ...