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: 将用户空间需要的参数添加到环境变量中。