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

设备模型之kobject,kset及其关系

Linux2.6以后的设备驱动,都是在设备模型的基础上构建的,因此,要编写linux下的设备驱动程序,不论是usb设备,pci设备等,都需要了解设备模型。

设备模型的基础结构体主要是kobject,kset这两个结构体:

struct kobject {

   char      * k_name;

   char      name[KOBJ_NAME_LEN];

   struct kref    kref;

   struct list_head  entry;

   struct kobject    * parent;

   struct kset    * kset;

   struct kobj_type  * ktype;

   struct dentry     * dentry;

};

 

struct kset {

   struct subsystem  * subsys;

   struct kobj_type  * ktype;

   struct list_head  list;

   struct kobject    kobj;

   struct kset_hotplug_ops  * hotplug_ops;

};

 

还有一个subsys结构体,但subsys结构体跟kset差不多,就多了一个互斥访问信号量,因此,就不需要列出了,另外还有一个结构体

struct kobj_type {

   void (*release)(struct kobject *);

   struct sysfs_ops  * sysfs_ops;

   struct attribute  ** default_attrs;

 };

用来表示kobject,kset的类型。 

一个kobject结构如下图的kobject 类型部分,而一个kset结构如下图的kset 类型部分,一个kobject加入一个kset,主要是kobject结构体中的相关字段记录了对应的kset信息,①记录了kobject所对应kset,其所指向的是kset所包含的kobject的地址,②记录了kobject所对应的kset的kset指针,③记录了kobject的类型,④记录了kset所有的kobject的链子,这个链子是一个双向链表,每当有一个kobject加入到当前的kset,就会调用list_add_tail()函数,把要加入kset的kobject连入链表的结尾,最终形成一个链表。

当有另外一个kobject要加入当前的kset,其中的①②③步跟第一个加入当前kset的kobject是一样的,即把要加入的kobject的成员设置,使之指向当前的kset对应数据,而④需要把kobject添加到kset的list的尾部,下图表示了kobject b加入到kset A的图示:

当有一个kset,需要加入到当前的kset,其方法也跟一个kobject要加入到当前kset一样,即把要加入的kset中所包含的kobject的成员设置,使这些成员指向对应的kset的对应数据。而当前kset要加入另一个kset,其方式也是跟一个kset加入到当前kset一样,都是设备kset中的kobject,使kobject的成员指向要加入的kset的对应数据即可,下图显示了一个kset B加入到kset A中的图示。

一个简单的kset,kobject关系图如下:

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

相关文章:

  • 设备驱动基础1:设备模型之总线,驱动,设备
  • 位域“ :”
  • Kobject结构体分析
  • 2016年01月12号
  • 逻辑分析仪作用
  • make clean、make mrproer、make distclean
  • vim编辑器配置
  • 安装该设备时去现一个错误,系统找不到指定的文件
  • git提交代码步骤
  • 五线谱基础知识
  • make clean-kernel make kernel
  • git add 之后因为没提交正确文件需要撤销
  • synergy在Windows和ubuntu 多台PC共享一套键盘鼠标
  • adb命令
  • 串口log
  • interface和setter,getter
  • pdf文件如何在线转换为jpg图片
  • Vultr 教程目录
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 初识MongoDB分片
  • 从输入URL到页面加载发生了什么
  • 说说动画卡顿的解决方案
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 优化 Vue 项目编译文件大小
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • $.proxy和$.extend
  • (52)只出现一次的数字III
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (数据结构)顺序表的定义
  • (五)关系数据库标准语言SQL
  • (一)kafka实战——kafka源码编译启动
  • (原)本想说脏话,奈何已放下
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • *1 计算机基础和操作系统基础及几大协议
  • .gitignore文件—git忽略文件
  • .naturalWidth 和naturalHeight属性,
  • .NET 材料检测系统崩溃分析
  • .net 反编译_.net反编译的相关问题
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .NET上SQLite的连接
  • .net网站发布-允许更新此预编译站点
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [@Controller]4 详解@ModelAttribute
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作
  • [AutoSar]BSW_Memory_Stack_003 NVM与APP的显式和隐式同步
  • [BUUCTF]-PWN:[极客大挑战 2019]Not Bad解析