当前位置: 首页 > news >正文

Kobject结构体分析

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

转载于:https://www.cnblogs.com/Ph-one/p/5070286.html

相关文章:

  • 2016年01月12号
  • 逻辑分析仪作用
  • make clean、make mrproer、make distclean
  • vim编辑器配置
  • 安装该设备时去现一个错误,系统找不到指定的文件
  • git提交代码步骤
  • 五线谱基础知识
  • make clean-kernel make kernel
  • git add 之后因为没提交正确文件需要撤销
  • synergy在Windows和ubuntu 多台PC共享一套键盘鼠标
  • adb命令
  • 串口log
  • G-sensor 与M-sensor区别
  • VIM下CS命令
  • android系统各个输出log对应层次文件
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【面试系列】之二:关于js原型
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Apache Spark Streaming 使用实例
  • Javascript弹出层-初探
  • JavaScript学习总结——原型
  • Java教程_软件开发基础
  • Linux快速复制或删除大量小文件
  • php中curl和soap方式请求服务超时问题
  • 当SetTimeout遇到了字符串
  • 坑!为什么View.startAnimation不起作用?
  • 排序算法之--选择排序
  • 浅谈web中前端模板引擎的使用
  • 手机端车牌号码键盘的vue组件
  • 算法-图和图算法
  • 主流的CSS水平和垂直居中技术大全
  • FaaS 的简单实践
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • #14vue3生成表单并跳转到外部地址的方式
  • #每天一道面试题# 什么是MySQL的回表查询
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (zhuan) 一些RL的文献(及笔记)
  • (二)JAVA使用POI操作excel
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (转)Linq学习笔记
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • ***监测系统的构建(chkrootkit )
  • *上位机的定义
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .bat批处理(一):@echo off
  • .NET 使用配置文件
  • .Net(C#)常用转换byte转uint32、byte转float等
  • /etc/fstab和/etc/mtab的区别
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @RequestBody与@ResponseBody的使用