前言

Kset和kobject是Linux设备驱动模型中的核心数据结构,其主要作用是将系统中的设备抽象出来,以树状结构组织,方便系统统一管理。

而这个统一管理的地方,就是sysfs,先放一张示例图,阐明一下kset和kobj的关系:kset指向的是设备驱动模型中sysfs中的目录

kobject指向的是目录中的子节点(注意:目录本身也是节点)

sysfs子目录每一项kobj是使用该级目录对应kset的下的链表连接

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23kset(/sys/bus)

+--------+

| kobj |

| |

+--------+

| list |

+------------+--------+

|

|

| /sys/bus/pci

v +--------+

/sys/bus/term1 /sys/bus/term2| |

+--------+ +--------+ | kobj |

| | | +--->+ |

| kobj +---->+ kobj | +--------+

| | | | | list |

+--------+ +--------+ +---+----+

|

v

/sys/bus/pci/term3

+--------+

| kobj |

+--------+

数据结构

kobject的数据结构如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17struct kobject {

const char*name;

struct list_headentry;

struct kobject*parent;

struct kset*kset;

struct kobj_type*ktype;

struct kernfs_node*sd; /* sysfs directory entry */

struct krefkref;

#ifdef CONFIG_DEBUG_KOBJECT_RELEASE

struct delayed_workrelease;

#endif

unsigned int state_initialized:1;

unsigned int state_in_sysfs:1;

unsigned int state_add_uevent_sent:1;

unsigned int state_remove_uevent_sent:1;

unsigned int uevent_suppress:1;

};

解释如下:

name: 在sysfs下的名称

entry: kobject链表项,将该kobject串入链表

parent: 父级kobject

kset: 所属的kset

ktype: kobject对应的属性

sd: sysfs对应的目录项

kref: 原子操作引用计数

state_initialized : 是否初始化

state_in_sysfs: 该Kobject是否已在sysfs中呈现

state_add_uevent_sent/state_remove_uevent_sent: 记录是否已经向用户空间发送ADD uevent,如果有,且没有发送remove uevent,则在自动注销时,补发REMOVE uevent,以便让用户空间正确处理

uevent_suppress: 是否 忽略所有上报的uevent事件

kobj_type也定义在kobject.h

1

2

3

4

5

6

7struct kobj_type {

void (*release)(struct kobject *kobj);

const struct sysfs_ops *sysfs_ops;

struct attribute **default_attrs;

const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);

const void *(*namespace)(struct kobject *kobj);

};

release: 释放kobject所使用资源的回调函数

sysfs_ops: 顾名思义,与sysfs相关的操作

default_attrs: 保存类型属性的列表

chind_ns_types/namespace: 文件系统命名空间相关参数

而kset的数据结构如下:

1

2

3

4

5

6struct kset {

struct list_head list;

spinlock_t list_lock;

struct kobject kobj;

const struct kset_uevent_ops *uevent_ops;

};

解释如下:

list: 该kset下所有的kobject的链表

list_lock: 链表访问的自旋锁

kobj: kset对应的kobject

uevent_ops: uevent事件上报相关操作

kobject和kset操作

kobject操作

kobject相关操作定义在 include/linux/kobject.h中,代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16extern void kobject_init(struct kobject *kobj, struct kobj_type *ktype);

int kobject_add(struct kobject *kobj, struct kobject *parent,

const char *fmt, ...);

int kobject_init_and_add(struct kobject *kobj,

struct kobj_type *ktype, struct kobject *parent,

const char *fmt, ...);

extern void kobject_del(struct kobject *kobj);

extern struct kobject * __must_check kobject_create(void);

extern struct kobject * __must_check kobject_create_and_add(const char *name,struct kobject *parent);

extern int __must_check kobject_rename(struct kobject *, const char *new_name);

extern int __must_check kobject_move(struct kobject *, struct kobject *);

kobject_init: 已经分配好kobject的前提下,将kobj内的相关字段初始化。ktype为kobj的属性

kobject_add: 将该kobject加入到 sysfs树里

kobject_init_and_add: 同时调用kobject_init 和 kobject_add

kobject_del:将kobject从 sysfs树里去掉

kobject_create/kobject_create_and_add:向内核申请kboject空间,ktype使用系统全局的dynamic_kobj_ktype

kobject_rename: 修改kobject在sysfs树的名称

kset操作

kset相关操作如下(同样定义在 include/linux/kobject.h 中):

1

2

3

4

5

6

7

8

9

10extern void kset_init(struct kset *kset);

extern int __must_check kset_register(struct kset *kset);

extern void kset_unregister(struct kset *kset);

extern struct kset * __must_check kset_create_and_add(const char *name,

const struct kset_uevent_ops *u,struct kobject *parent_kobj);

static inline struct kset *to_kset(struct kobject *kobj)

static inline struct kset *kset_get(struct kset *k);

static inline void kset_put(struct kset *k);

static inline struct kobj_type *get_ktype(struct kobject *kobj);

extern struct kobject *kset_find_obj(struct kset *, const char *);

kset_init: 与kobject类似,将已经分配空间的kset初始化

kset_register: 初始化一个kset,加入到sysfs树里

kset_unregister: 将kset从sysfs树里移除,并将对应kobject删除

kset_create_and_add: 创建kset并加入sysfs树里

to_kset:从kobject找到对应kset

kset_get: 增加kset对应kobject引用记数

kset_put: 释放对kset对应kobject的 引用记数

get_ktype: 从kobject得到ktype

kset_find_obj: 从set下找到对应名称的kboject

实例

待添加

Linux中kobject的作用,Linux设备驱动模型-- 数据结构Kset/KObject相关推荐

  1. Linux设备驱动模型三 kset

    Linux设备驱动模型三 kset 1 kset数据结构 kset的定义在前文已有描述,我们再回顾一下: [cpp] view plain copy struct kset { /*与子kobject ...

  2. linux设备驱动模型之 kset原理与实例分析

    1. Kset kset是具有相同类型的kobject的集合,在sysfs中体现成一个目录,在内核中用kset数据结构表示,定义为: struct kset { struct list_head li ...

  3. Linux中rootfs的作用,linux启动挂载rootfs的分析

    linux启动挂载rootfs的分析 (2009-11-07 21:54:52) 标签: 杂谈 1.linux启动时,经过一系列初始化之后,需要mount 根文件系统,为最后运行init进程等做预备, ...

  4. Linux中写入union作用,Linux进程描述符中union的用法

    首先,它是 union thread_union { struct thread_info thread_info; unsigned long stack[THREAD_SIZE/sizeof(lo ...

  5. linux中感叹号的作用,Linux - 感叹号

    在Linux命令行下令人惊叹的惊叹号(!) ! 符号在 Linux 中不但可以用作否定符号,还可以用来从历史命令记录中取出命令或不加修改的执行之前运行的命令.下面的所有命令都已经在 Bash Shel ...

  6. Linux内核移植 part2:uboot 设备驱动模型

    最近在移植uboot-2015.04的时候发现,uboot的设备驱动也带驱动模型了,第一次见到的时候还真是愣了一下,特别是调试的时候没有以前那么方便直接了.而且设备模型和设备树捆绑在一起,又得花费一番 ...

  7. linux中giep命令作用,Linux查看硬件信息以及驱动设备的命令

    用硬件检测程序kuduz探测新硬件:service kudzu start ( or restart) 查看CPU信息:cat /proc/cpuinfo 查看板卡信息:cat /proc/pci 查 ...

  8. linux中umask的作用,LINUX UMASK详解

    一 权限掩码umask umask是chmod配套的,总共为4位(gid/uid,属主,组权,其它用户的权限),不过通常用到的是后3个,例如你用chmod 755 file(此时这文件的权限是属主读( ...

  9. linux中timer的作用,linux - linux / timer.h setup_timer()到期功能不起作用? - 堆栈内存溢出...

    因此,我的setup_timer()中的TimerExpire函数会引起巨大的恐慌(将在下面发布),而对TimerExpire()的常规函数​​调用实际上将输出我的输入. void TimerExpi ...

最新文章

  1. 前台更新进度条js-4
  2. ZOC7 for Mac连接CentOS7无法输入中文问题
  3. 多款eclipse黑色坏境任你选择,只要导入配置
  4. Redis和mysql数据怎么保持数据一致的?
  5. Visual Studio 2017迎来F# 4.1
  6. C#的float、double与decimal
  7. c#日期转换周几_Java时间与日期
  8. html button跳转页面_HTML跳转到页面指定位置的几种方法
  9. CentOS 7.1 Bridge启用STP报错Master connection not found or invalid
  10. logstash grok插件语法介绍
  11. eShopOnContainers学习系列(二):数据库连接健康检查
  12. 第一章 数字图像基础
  13. CPLEX求解器入门案例
  14. 鸿蒙汽车电动尾门工厂,汽车智能电动尾门为什么能成为汽车电子行业“新宠”?...
  15. pythonlocust使用技巧_python locust 性能测试:HOOKS钩子方法
  16. springboot项目控制层的接口注入报错
  17. 程序员做好这三件事,在哪都能吃得开
  18. python之pil的使用
  19. Linux 查看quota状态,Linux命令之quota详解
  20. centos7双机搭建_CentOS 7 配置 Keepalived 实现双机热备

热门文章

  1. spring ioc控制反转
  2. iOS-集成阿里百川IMSDK的服务端及客户端
  3. layout elements
  4. Mysql报too many connections详解
  5. 企业运维经典面试题汇总(3)
  6. 创建git 远程仓库 本地仓库 (Eclipse中使用)
  7. 备份文件时,添加时间戳
  8. 关于JS特效的兼容问题。
  9. c语言if case语句怎么用,这样的case和if一起运用有问题吗?
  10. java性能调试命令_性能测试必备监控技能jvm之jdk命令行工具篇16