Kobject/kset的使用

 

Kobject实现了基本的面向对象管理机制,是构成linux 2.6设备模型的核心结构。它与sysfs文件系统紧密相连,在内核中注册的每个kobject对象对应sysfs文件系统中的一个目录

 

作用:用来创建sysfs下面的目录和文件的,属性对应的文件。

 

<file://D:\資料\学习资料\linux相关\演示代码\kobject\kobject.c>

 

kobject操作:

void kobject_init(struct kobject *kobj)

初始化kobject结构

 

int kobject_add(struct kobject *kobj)

将kobject对象注册到linux系统

 

int kobject_init_and_add(struct kobject *kobj, struct kobj_tpye *ktype, struct kobject *parent, const char *fmt, …)

初始化并添加

 

1、struct kobj_type *ktype

一个指向kobj_type结构的指针,该结构记录了kobject对象的一些属性。

struct kobj_type{

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

   struct sysfs_ops *sysfs_ops;

   struct attribute **default_attrs;

}

 

struct atttibute{

   char *name;/*属性文件名*/

   struct module *owner;

   mode_t mode; /*属性的保护位*/

};

struct attribute(属性):对应于kobject目录下的一个文件name成员就是文件名

 

struct sysfs_ops

{

   ssize_t (*show)(struct kobject *, struct attribute *, char *);

   ssize_t (*store)(struct kobject *, struct attribute *, const char *, size_t);

};

show:当用户读属性文件时,该函数被调用,该函数将属性值存入buffer中返回给用户态。

store:当用户写属性文件时,该函数被调用,用于存储用户传入的属性值。

2、struct kobject *parent

if NULL:创建在sysfs的根目录

 

void kobject_del(struct kobject *kobj)

从linux系统中删除kobject对象

 

struct kobject *kobject_get(struct kobject *kobj)

将kobject对象的引用计数加1,同时返回该对象指针

 

void kobject_put(struct kobject *kobj)

将kobject对象的引用计数减1,如果应用计数降为0,则调用release方法释放该object对象

 

cat 来读文件信息

 

 

kset是具有相同类型的kobject的集合,在sysfs中体现成一个目录(kobject目录下只能包含文件,kset可以包含目录),在内核中用kset数据结构表示,定义为:

struct kset{

    struct list_head list;  //连接该kset中所有kobject的链表头

    spinlock_t list_lock;

   struct kobject kobj;    //内嵌的kobject

   struct kset_uevent_ops *uevent_ops; //处理热插拔事件的操作集合

}

 

kset操作:

int kset_register(struct kset *kset)

在内核中注册一个kset

 

void kset_unregister(struct kset *kset)

从内核中注销一个kset

<file://D:\資料\学习资料\linux相关\演示代码\kobject\kset.c>

 

热插拔事件:

在linux系统中,当系统配置发生变化时,如:添加kset到系统;移动kobject时。sysfs下面的文件发生变化。一个通知会从内核空间发送到用户空间,这就是热插拔事件。热插拔事件会导致用户空间中相应的处理程序(如:udev,mdev)被调用,这些处理程序会通过加载驱动程序,创建设备节点来相应热插拔事件。

 

struct kset_uevent_ops{

   int (*filter)(struct kset *kset, struct kobject *kobj);

   const char *(*name)(struct kset *kset, struct kobject *kobj);

   int (*uevent)(struct kset *kset, struct kobject *kobj, struct obj_uevent_env *env);

}

当该kset所管理的kobject 和 kset状态发生变化时(如被加入,移动),这三个函数被调用

 

filter: 决定事件产生的时候,是否将事件传递到用户空间。如果filter返回0,将不传递事件。

name: 用于将字符串传递给用户空间的热插拔处理程序。

uevent: 将用户空间需要的参数添加到环境变量中。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值