Linux内核系列设备模型(一) Kobject与Kset
1、Kobject
Kobject是设备驱动模型的核心结构,它使所有设备在底层都有统一的接口。在内核注册的kobject对象都会对应sysfs文件系统中的一个目录(目录名称有Kobject结构中k_name指定)
struct kobject {
const char * k_name; // 指向设备名称的指针
char name[KOBJ_NAME_LEN]; // 设备名称
struct kref kref; //引用计数
struct list_head entry; //所属kset集合列表成员
struct kobject * parent; // 指向父节点对象
struct kset * kset; //所属kset集合
struct kobj_type * ktype; //设备类型
struct dentry * dentry; //与该对象对应的文件节点指针
wait_queue_head_t poll; //等待队列
};
相关操作函数:
extern void kobject_put(struct kobject *);
kobject引用计数减1(即kref减1),当kef的值为0时,将调用release函数释放该kobject对象;
struct kobject * kobject_get(struct kobject * kobj)
kobject引用计数增1;
extern int kobject_add(struct kobject *);
将kobject对象添加到所属的kset集合中,同时创建对应的文件目录(具体实现看kobject.c中的源码);
extern void kobject_del(struct kobject *);
删除kobject对象;
extern int kobject_register(struct kobject *);
注册kobject对象,先调用kobject_init进行初始化 ,然后调用kobject_add完成对象的注册,最后调用kobject_uevent注册kobject增加事件;
extern void kobject_unregister(struct kobject *);
注销kobject对象;先调用kobject_uevent注册KOBJ_REMOVE事件(事件通知作用),然后调用kobject_del删除对象,最后调用kobject_put减少该对象的引用计数,同样当引用计数为0时将会调用release销毁函数;
2、Kset
struct kset {
struct subsystem * subsys; // 所属子系统
struct kobj_type * ktype; // 所属Kset集合的Kobject的类型
struct list_head list; // 所属Kset的Kobject对象链表头
spinlock_t list_lock; //Kset的互斥锁
struct kobject kobj; // 所属Kset的Kobject对象的父节点
struct kset_uevent_ops * uevent_ops; // Kset相关事件处理函数
};
相关操作函数:
static inline void kset_put(struct kset * k);
kset的引用计数减1,实际kset的引用计数使用的内嵌的Kobject对象的引用计数;
static inline struct kset * kset_get(struct kset * k)
kset的引用计数加1;
int kset_add(struct kset * k)
kset_add内部调用的是kobject_add,其实就是将kset的内嵌的kobject对象挂接到上层子系统中;
kset_register、kset_unregister与Kobject中对应操作函数实现比较类似(源码详情Kobject.c)
Kobject与Kset的关系图如下:

3、Kobj_type
struct kobj_type {
void (*release)(struct kobject *); //释放kobject函数
struct sysfs_ops * sysfs_ops; //属性操作字段(读和写)
struct attribute ** default_attrs; // 默认的属性字段,该字段指定的属性结构将以文件的形式输出到sysfs目录;
struct sysfs_ops {
ssize_t (*show)(struct kobject *, struct attribute *,char *buf); // 处理用户对属性值的读取,属性读取后的值保存在参数buf中;
ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t); // 处理用户设置的属性值
};
struct attribute {
const char * name; // 文件名
struct module * owner; // 所属模块
mode_t mode;
};
Linux内核系列设备模型(一) Kobject与Kset的更多相关文章
- Linux内核(7) - 设备模型(上)
对于驱动开发来说,设备模型的理解是根本,毫不夸张得说,理解了设备模型,再去看那些五花八门的驱动程序,你会发现自己站在了另一个高度,从而有了一种俯视的感觉,就像凤姐俯视知音和故事会,韩峰同志俯视女下属. ...
- Linux内核(8) - 设备模型(下)
设备模型拍得再玄幻,它也只是个模型,必须得落实在具体的子系统,否则就只能抱着个最佳技术奖空遗恨.既然前面已经以USB子系统的实现分析示例了分析内核源码应该如何入手,那么这里就仍然以USB子系统为例,看 ...
- linux设备驱动模型(kobject与kset)
Linux设备模型的目的:为内核建立一个统一的设备模型,从而又一个对系统结构的一般性抽象描述.换句话说,Linux设备模型提取了设备操作的共同属性,进行抽象,并将这部分共同的属性在内核中实现,而为需要 ...
- Linux设备模型之kobject
阿辉原创,转载请注明出处 参考文档:LDD3-ch14.内核文档Documentation/kobject.txt,本文中使用到的代码均摘自Linux-3.4.75 ----------------- ...
- 内核设备模型从kobject到子系统
内核设备模型 目的:表示设备和设备在系统中的拓扑关系 优点:1减少内核代码量,2可以统一查看所有设备状态和所连接的总线,3可以 ...
- 基于tiny4412的Linux内核移植 -- 设备树的展开
作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...
- 基于tiny4412的Linux内核移植 -- 设备树的展开【转】
转自:https://www.cnblogs.com/pengdonglin137/p/5248114.html#_lab2_3_1 阅读目录(Content) 作者信息 平台简介 摘要 正文 一.根 ...
- linux驱动之设备模型
linux 设备驱动模型 inux2.6提供了新的设备模型:总线.驱动.设备.基本关系简要的概括如下: 驱动核心可以注册多种类型的总线. 每种总线下面可以挂载许多设备.(通过kset devices) ...
- Linux设备驱动之Kobject、Kset
作者:lizuobin(也是我们兼职的论坛答疑助手) 原文: https://blog.csdn.net/lizuobin2/article/details/51523693 纠结又纠结,虽然看了一些 ...
随机推荐
- Bootstrap优秀网站:乐窝网
Bootstrap优秀网站:乐窝网 调用谷歌在线地图的API和Bootstrap工具包实现了租房和出租的一个平台. 佩服之极,09年跟一个哥们聊天时,他就提议过这方面的应用,终于看到有人实现了,祝贺. ...
- Html5 布局经验分享-第1集
移动端的布局与pc端的布局相比 移动端的布局就简单的多,兼容性不必考虑那么多,css3各种特性基本上是可以放肆的写:(个人看法) 本人做移动web 布局一段时间了,把这其中遇到的一些问题总结下来,均是 ...
- 【springmvc Request】 springmvc请求接收参数的几种方法
通过@PathVariabl注解获取路径中传递参数 转载请注明出处:springmvc请求接收参数的几种方法 代码下载地址:http://www.zuida@ima@com/share/1751862 ...
- org.springframework.orm.jpa.JpaTransactionManager
[第九章] Spring的事务 之 9.2 事务管理器 ——跟我学spring3 http://sishuok@com/forum/blogPost/list/0/2503.html
- Static File Middleware
[ASP.NET Core] Static File Middleware 前言 本篇文章介绍ASP.NET Core里,用来处理静态档案的Middleware,为自己留个纪录也希望能帮助到有需要 ...
- js Touch事件(向左滑动,后退)
js Touch事件(向左滑动,后退) 代码如下 var touch_p = { c_x : 0, c_y : 0, hasbacked : false }; function touches(ev) ...
- 项目的敏捷开发方法(转自MBAlib)
项目的敏捷开发方法 敏捷方法很多,包括 Scrum.极限编程.功能驱动开发以及统一过程(RUP)等多种法,这些方法本质实际上是一样的,敏捷开发小组主要的工作方式可以归纳为:作为一个整体工作: 按短迭代 ...
- java单例模式使用及注意事项
1. 说明 1)单例模式:确保一个类只有一个实例,自行实例化并向系统提供这个实例 2)单例模式分类:饿单例模式(类加载时实例化一个对象给自己的引用),懒单例模式(调用取得实例的方法如getInstan ...
- ECshop Strict Standards: Only variables should be passed by reference in解决办法
本文章来给各位同学介绍关于ECshop Strict Standards: Only variables should be passed by reference in解决办法,希望此教程 对各位同 ...
- 浏览器因cookie设置HttpOnly标志引起的安全问题
1.简介 如果cookie设置了HttpOnly标志,可以在发生XSS时避免JavaScript读取cookie,这也是HttpOnly被引入的 原因.但这种方式能防住攻击者吗?HttpOnly标志可 ...