kobject是组成设备device、驱动driver、总线bus、class的基本结构。如果把前者看成基类,则后者均为它的派生产物。device、driver、bus、class构成了设备模型,而kobject内嵌于其中,将这些设备模型的部件组织起来,并形成了sysfs文件系统。kobject就是device、driver、bus、class在文件系统中的代表。在sysfs操作设备时,也必须通过kobject这个中间人来完成。kobject的主要功能如下:

对象的引用计数

通常一个内核对象被创建时,不可能知道该对象存活的时间。跟踪此对象生命周期的一个方法是使用引用计数。当内核中没有代码持有该对象的引用时,该对象将结束自己的有效生命周期,并且可以被删除。

sysfs表述

在sysfs中显示的每一个对象,都对应一个kobject,它被用来与内核交互并创建它的可见表述。

数据结构关联

从整体上看,设备模型是一个友好而复杂的数据结构,通过在其间的大量连接而构成一个多层次的体系结构。Kobject实现了该结构并把它们聚合在一起。

uevent事件处理

当系统中的硬件被热插拔时,在kobject子系统控制下,将产生事件以通知用户空间。

Kobjects 在内核中对应有一套申请,初始化,添加,注册,计数操作,释放等函数

struct kobject {

const char              *name; /*kobject的名字,每个kobject都对应着sysfs下的一个文件夹,该名字也是对应的文件夹的名字。*/

struct list_head       entry; /*双向链表指针,用于将同一kset集合中的kobject链接到一起,便于访问*/

struct kobject         *parent; /*kobject对应的父kobject节点,在sysfs表现为上一级目录*/

struct kset              *kset; /*kobject所在的集合的指针,kset概念将在kset一节中描述*/

struct kobj_type     *ktype; /*kobject对象类型指针,随后将会介绍*/

struct sysfs_dirent   *sd; /*sd用于表示VFS文件系统的目录项,由此可见它是设备与文件之间的桥梁。在sysfs节会对此结构进行分析*/

struct kref              kref; /*对象引用计数器。引用计数器的作用前面已经讲过*/

unsigned int state_initialized:1; /*初始化标志位,在对象初始化时被置位*/

unsigned int state_in_sysfs:1; /*kobject对象在sysfs中的状态,创建则置1,否则为0。亦即kobject对应的目录在sysfs中是否被创建*/

unsigned int state_add_uevent_sent:1; /*添加设备的uevent事件是否发送标志,添加设备时会向用户空间发送uevent事件,请求新增设备*/

unsigned int state_remove_uevent_sent:1; /*删除设备的uevent事件是否发送标志,删除设备时会向用户空间发送uevent事件,请求卸载设备*/

unsigned int uevent_suppress:1;

};

相关函数:

kobject_init();

// kobject 初始化函数;

kobject_add();

//将kobj 对象加入Linux 设备层次。挂接该kobject 对象到kset 的list 链中,增加父目录各级kobject 的引用计数,在其 parent 指向的目录下创建文件节点,并启动该类型内核对象的hotplug 函数

kobject_init_and_add();

//kobject_init() and kobject_add()函数的结合,返回值与kobject_add()相同;与kobject_create_and_add的区别是,kobject结构体必须已经创建好,动态创建或者静态声明均可;

kobject_del();

//从Linux 设备层次(hierarchy)中删除kobj 对象;

kobject_create();

//动态的创建一个kobject结构体;

kobject_create_and_add();

// kobject_create_and_add动态创建了一个kobject结构体,将其初始化,将其加入到kobject层次中,并最终返回所创建的 kobject的指针,当然如果函数执行失败,则返回NULL;

kobject_rename();

//改变一个kobject的名字;

kobject_move();

//将一个kobject从一个层次移动到另一个层次;

kobject_get();

//将kobj 对象的引用计数加1,同时返回该对象的指针;

kobject_put();

//将kobj 对象的引用计数减1,如果引用计数降为0,则调用kobject_release()释放该kobject 对象;

kobject_get_path();

//返回kobject的路径;

kobject_set_name();

//设置kobject的名字

Kobject结构体分析的更多相关文章

  1. Linux内核kobject结构体分析

    1.前言 Linux内核中有大量的驱动,而这些驱动往往具有类似的结构,根据面向对象的思想,可以将共同的部分提取为父类,而这个父类就是kobject,kobject结构体中包含了大量设备的必须信息,而三 ...

  2. FFMPEG结构体分析:AVPacket

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrame FFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVCodecConte ...

  3. FFMPEG结构体分析:AVStream

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrame FFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVCodecConte ...

  4. FFMPEG结构体分析:AVCodec

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrame FFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVCodecConte ...

  5. FFMPEG结构体分析:AVIOContext

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrame FFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVCodecConte ...

  6. FFMPEG结构体分析:AVCodecContext

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrame FFMPEG结构体分析:AVFormatContext FFMPEG结构体分析:AVCodecConte ...

  7. FFMPEG结构体分析:AVFormatContext

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrameFFMPEG结构体分析:AVFormatContextFFMPEG结构体分析:AVCodecContext ...

  8. FFMPEG结构体分析:AVFrame

    注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrameFFMPEG结构体分析:AVFormatContextFFMPEG结构体分析:AVCodecContext ...

  9. FFmpeg: AVPacket 结构体分析

    AVPacket是FFmpeg中很重要的一个数据结构,它保存了解封装之后,解码之前的数据(注意:仍然是压缩后的数据)和关于这些数据的一些附加信息,如显示时间戳(pts).解码时间戳(dts).数据时长 ...

随机推荐

  1. 项目分析(channelid是如果产生的)

    channelid如何生成的 /////////////////////////////////////////////////////////////// // // I_TCPServer.h / ...

  2. shiro中unauthorizedUrl不起作用

    解决方法: 在shiro配置文件中添加(异常全路径做key,错误页面做value) <bean class="org.springframework.web.servlet.handl ...

  3. Configuration Management小结

    一.git branch和patch区别 patch,只是把diff部分创建一个分支.Detail: http://www.cnblogs.com/y041039/articles/2411600.h ...

  4. 【JQuery NoviceToNinja系列】目录

    [JQuery NoviceToNinja系列]目录 [JQuery NoviceToNinja系列]01 开篇 Html页面设计和布局

  5. C++中static的全部作用

    要理解static,就必须要先理解另一个与之相对的关键字,很多人可能都还不知道有这个关键字,那就是auto,其实我们通常声明的不用static修饰的变量,都是auto的,因为它是默认的,就象short ...

  6. [开发]Win7环境下Eclipse连接Hadoop2.2.0

    准备: 确保hadoop2.2.0集群正常运行 1.eclipse中建立mven工程,并编辑pom文件如下 <dependencies> <dependency> <gr ...

  7. spring事务认识

    Spring配置异常回滚采用的是rollback-for=“BusinessException”.来源于java的检查性异常.非检查性异常的区别.使用spring难免要用到spring的事务管理,要用 ...

  8. 如何使用 OneAPM 监控微软 Azure Cloud Service ?

    不知不觉微软 Azure 已经进入中国市场近两年的时间.那么 Azure 平台的性能究竟如何?资源加载的延迟.虚拟机的稳定性等问题是否切实满足客户期许.这些都是大家对微软 Azure 这个国外的云服务 ...

  9. 如何用 Parse 和 Swift 搭建一个像 Instagram 那样的应用?(3)

    [编者按]本篇文章作者是 Reinder de Vries,既是一名企业家,也是优秀的程序员,发表多篇应用程序的博客.本篇文章中,作者主要介绍了如何基于 Parse 特点,打造一款类似 Instagr ...

  10. POJ 1503 Integer Inquiry(大数相加,java)

    题目 我要开始练习一些java的简单编程了^v^ import java.io.*; import java.util.*; import java.math.*; public class Main ...