2.6内核增加了一个引人注目的新特性——统一设备模型(device model)。设备模型提供了一个独立的机制专门来表示设备,并描述其在系统中的拓扑结构;

Linux设备模型的核心是使用Bus、Class、Device、Driver四个核心数据结构,将大量的、不同功能的硬件设备(以及驱动该硬件设备的方法),以树状结构的形式,进行归纳、抽象,从而方便Kernel的统一管理;

而硬件设备的数量、种类是非常多的,这就决定了Kernel中将会有大量的有关设备模型的数据结构。这些数据结构一定有一些共同的功能,需要抽象出来统一实现,否则就会不可避免的产生冗余代码。这就是Kobject诞生的背景;

通过parent指针,可以将所有Kobject以层次结构的形式组合起来;
使用一个引用计数(reference count),来记录Kobject被引用的次数,并在引用次数变为0时把它释放(这是Kobject诞生时的唯一功能);
和sysfs虚拟文件系统配合,将每一个Kobject及其特性,以文件的形式,开放到用户空间(有关sysfs,会在其它文章中专门描述,本文不会涉及太多内容);

Kobject是Linux设备模型的基础;

回想文件系统中的核心对象“索引节点(indoe)”和目录项“dentry”:
    inode—与文件系统中的一个文件相对应(而实际上,只有文件被访问时,才在内存创建索引节点);
    dentry—每个路径中的一个分量,例如路径/bin/ls,其中/、bin和ls三个都是目录项,只是前两个是目录,而最后一个是普通文件;也就是说,目录项或者是一子目录,或者是一个文件;

既然,kobject要形成一颗树,那么其中的字段就要有parent,以表示树的层次关系;另外,kobject得有name字段,按说,目录或文件名并不会很长,但是,sysfs文件系统为了表示对象之间复杂的关系,需要通过软链接达到,而软链接常常有较长的名字,通过以上的分析,目前可以得知kobject对象包含的字段有:

struct kobject {
    char       *k_name;  /*长名字*/
    char       name[kOBJ_NAME_LEN]; /* 短名字*/
    struct kobject    *parent; /* 表示对象的层次关系*/
    struct dentry *dentry; /*表示sysfs中的一个目录项 */
};

查看kobject.h头文件,看到它还包含以下字段:

struct kobject {
    struct kref          kref;
    struct list_head  entry;
    struct kset          *kset;
    struct kobj_type  *ktype;
};

这四个字段,每一个都是结构体,其中structlist_head是内核中形成双向链表的基本结点结构;

增加一个引用计数可通过koject_get()函数完成:
    struct kobject* kobject_get(struct kobject *kobj);
该函数正常情况下将返回一个指向kobject的指针,如果失败则返回NULL指针;

减少引用计数通过kobject_put()完成:
    void kobject_put(struct kobject *kobj);
如果对应的kobject的引用计数减少到零,则与该kobject关联的ktype中的析构函数将被调用;

深入到引用计数系统的内部去看,会发现kobject的引用计数是通过kref结构体实现的,该结构体定义在头文件<linux/kref.h>中:
struct kref {atomic_t refcount;};
其中唯一的字段是用来存放引用计数的原子变量。那为什么采用结构体?这是为了便于进行类型检测;

上述的所有函数定义与声明分别在在文件lib/kref.c和文件<linux/kref.h>中。

共同特性的ktype
    kobject是一个抽象而基本的对象。对于一族具有共同特性的kobject,就是用定义在头文件<linux/kobject.h>中的ktype来描述:

struct kobj_type {    
    void (*release)(structkobject *);
    struct sysfs_ops  *sysfs_ops;
    struct attribute  **default_attrs;
};

release指针指向在kobject引用计数减至零时要被调用的析构函数,该函数负责释放所有kobject使用的内存和其它相关清理工作;
sysfs_ops变量指向sysfs_ops结构体,其中包含两个函数,也就是对属性进行操作的读写函数show()和store();
最后,default_attrs指向一个attribute结构体数组。这些结构体定义了kobject相关的默认属性;属性描述了给定对象的特征,其实,属性就是对应/sys树形结构中的叶子结点,也就是文件;

认识Linux设备驱动模型和Kobject相关推荐

  1. Linux设备模型——设备驱动模型和sysfs文件系统解读笔记

    Linux设备模型--设备驱动模型和sysfs文件系统解读笔记 原文:https://blog.csdn.net/yj4231/article/details/7799245 将对Linux系统中的s ...

  2. Linux设备驱动模型二 kobject

    Linux设备驱动模型二 kobject 1 kobject 1.1 kobject数据结构 kobject是sysfs文件系统的基础数据结构,它定义在include/linux/kobjec.h中 ...

  3. Linux 设备模型之 (kobject、kset 和 Subsystem)(二)

    1.kobject 结构 在Linux内核里,kobject是组成Linux设备模型的基础,一个kobject对应sysfs里的一个目录.从面向对象的角度来说,kobject可以看作是所有设备对象的基 ...

  4. Linux设备模型分析之kobject(基于3.10.1内核)

    一.kobject结构定义 kobject是Linux设备模型的最底层数据结构,它代表一个内核对象. kobject结构体定义在include/linux/kobject.h文件中: [cpp] vi ...

  5. Linux设备模型分析之kobject

    一.kobject应用举例 Linux设备模型最基本的组成元素是kobject,我们先来看一个kobject的应用例子,该程序在Ubuntu 10.10, 2.6.32-38-generic-pae内 ...

  6. 整理--linux设备驱动模型

    知识整理–linux设备驱动模型 以kobject为底层,组织类class.总线bus.设备device.驱动driver等高级数据结构,同时实现对象引用计数.维护对象链表.对象上锁.对用户空间的表示 ...

  7. Linux 设备驱动程序(二)

    系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核(一) 深入理解 Linux 内核(二) Linux 设备驱动程序(一) Linux 设备驱动程序(二) Linux 设备驱动程序( ...

  8. linux设备模型:devtmpfs虚拟文件系统分析

    devtmpfs是一个设备文件系统,它将其所有文件保存在虚拟内存中. devtmpfs中的所有内容都是临时的,因为不会在您的硬盘驱动器上创建任何文件.如果卸载devtmpfs实例,其中存储的所有内容都 ...

  9. linux设备模型:pci驱动程序注册过程

    一个具有正常探测功能的pci驱动程序应具有基本的pci_driver结构实现,如: static struct pci_driver driver_ops = {.name = "drive ...

最新文章

  1. 2021年大数据Kafka(十二):❤️Kafka配额限速机制❤️
  2. 当前标识(NT AUTHORITY\NETWORK SERVICE)没有对“的写访问权限。
  3. PHP 不跳转界面取input值进行验证_【Python】tesseract+uiautomator2+夜神模拟器 悠长假期手游集市识别验证码自动购买 - Amorius...
  4. 网络编程基础之C/S架构和TCP/IP协议
  5. 在bootstrap table中使用Tooltip
  6. Microsoft SQL Server 全角转半角函数
  7. java replacefirst第n_Java中replace()、replaceFirst()和replaceAll()区别
  8. jni c 回调 java,JNI - 如何从C ++或C回调到Java?
  9. 分析称2015年手机文娱将激增至540亿美元
  10. Winform开发框架之终极应用 - 伍华聪 - 博客园
  11. 对经太空搭载的“神舟三号口服液”口服液的生产菌株进行了科学鉴定.^
  12. 如何限制计算机游戏,如何禁止玩电脑游戏、屏蔽网络游戏方法
  13. 【74HC595】STM32 74HC595驱动程序
  14. 服务器浏览器怎么打不开网页,电脑能上qq打不开网页怎么回事?
  15. 油猴插件安装以及好用的脚本推荐
  16. 【详细】TMS软件十大品牌推荐!
  17. Odoo owl 学习笔记之13—event_handing
  18. 【积水成渊-逐步定制自己的Emacs神器】3:为Emacs安装扩展
  19. Spring Security Oauth2:授权模式、简单模式 、密码模式 和 客户端模式
  20. 十分钟教会女朋友上手阿里云服务器

热门文章

  1. MapReduce基础开发之五分布式下载ftp文件到本地再迁移到hdfs
  2. Leetcode 125. 验证回文串 解题思路及C++实现
  3. ap计算机科学换学分,科普:AP成绩出来了 换学分最全指南就在这
  4. 设计立方体类(求出立方体的面积和体积 分别用全局函数和成员函数判断两个立方体是否相等)
  5. Python 技术篇-利用Office VBA实现word文档转化为pdf文档实例演示
  6. PyQt5 技术篇-设置窗口置顶不生效问题原因,setWindowFlags()设置参数后不生效解决办法
  7. [watevrCTF-2019]Pickle Store
  8. oracle 11gr2 bbed 安装,oracle11gR2 装配bbed工具
  9. 【MFC三天一个游戏】之 局域网黑白棋
  10. 老大难的 Java ClassLoader,到了该彻底理解它的时候了