zoukankan      html  css  js  c++  java
  • 转 kobject结构体分析

    转载自:http://blog.csdn.net/zhoujiaxq/article/details/7646050

    未知作者,以及源地址 ,敬请谅解。

    kobject是组成设备device、驱动driver、总线bus、class的基本结构。

    如果把前者看成基类,则后者均为它的派生产物。

    device、driver、bus、class构成了设备模型,而kobject内嵌于其中,将这些设备模型的部件组织起来,并形成了sysfs文件系统kobject就是device、driver、bus、class在文件系统中的代表(核心)。

    在sysfs操作设备时,也必须通过kobject这个中间人来完成(原来kobject不仅仅是核心,还是操作device设备的 着力点  句柄抽象对应与设备文件file 描述符 int fd)

    上面都是说kobject怎么怎么构成设备模型的部件核心组织整个设备模型,但是实际上到底kobject怎么逐渐实现了device driver bus class等在内核中的具体功能呢??

    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的名字

  • 相关阅读:
    C#泛型
    QT QML Keys 处理注意事项
    Ubuntu 16.04 安装 QT Create 5.3.1
    在VMWare中安装了Ubuntu16.04,想要 Win10 中通过 SecureCRT 来操作
    Ubuntu16在VMWare中使用共享文件夹
    QT QLineEdit 获取焦点/获取焦点后全选字符
    QT Layout 布局的重要性
    QT ToolBar 工具栏浮动状态
    QT 格式化字符串功能
    QT 窗体之间(MainWindow 和 Dialog)数据传递
  • 原文地址:https://www.cnblogs.com/hisoka/p/4111761.html
Copyright © 2011-2022 走看看