1. sysfs文件系统---首先为应用程序提供了文件接口,其次将设备和驱动链接起来;
sysfs文件系统在 sysfs_init( )初始化
---主要的函数sysfs_init_inode( )
2 kobject 和 kset
----概述:如果将linux设备驱动模型比喻成一座大厦,那么kobject和kset就是构成这座大厦内部的钢筋和构架结构;
----由kobject和kset构成的设备驱动模型中的bus, driver, device为程序员提供了一个窗口;
2.1 关于kobject(内核对象)
/*linux内核用kobject 来表示内核的一个对象
name 表示一个内核对象的名字;
如果加入系统中,那么它的name将会出现在sysfs系统中,表现得是一个新的目录
*/
----struct kobject {
const char *name;
struct list_head entry; //用链表将内核对象链接起来
struct kobject *parent; //指向内核对象的上层节点,构建内核对象之间的层次关系
struct kset *kset; //当前内核对象所属的kset对象指针, 其容纳了一系列同类型的kobject
struct kobj_type *ktype; //定义了内核对象一组sysfs文件系统相关的操作函数和属性。
struct sysfs_dirent *sd; //表示内核对象在sysfs文件系统中对应的目录项的实例
struct kref kref; //原子类型, 表示内核对象的引用计数,可以追踪内核对象的生命周期
unsigned int state_initialized:1; //表示内核对象初始化的状态, 1表示对象被初始化,0表示尚未初始化
unsigned int state_in_sysfs:1; //表示内核对象是否在sysfs文件中建立一个入口
unsigned int state_add_uevent_sent:1;
unsigned int state_remove_uevent_sent:1;
unsigned int uevent_suppress:1; //kobject变化-->kset变化-->kset对象向用户空间发送event消息;
//1表示不让发送
----};
/*注释:内核通过ktype成员将kobject对象的sysfs文件操作与其属性文件关联起来;*/
----kobject常用函数 /*设备驱动程序都不会和其打交道, 通过上层函数调用就屏蔽掉了--cdev_add()*/
kobject常用的用法是嵌入在表示某一对象的数据结构中,比如字符设备对象--struct cdev;
/*设置kobject->name成员*/
----int kobject_set_name(struct kobject *kobj, const char *fmt, ...)
/*指定kobject->ktype成员和初始化kobject其他成员*/
----void kobject_init(struct kobject *kobj, struct kobj_type *ktype)
/*1建立kobject对象间的层次关系; 2在sysyfs文件系统中建立一个目录*/
----int kobject_add(struct kobject *kobj, struct kobject *parent, const char *fmt, ...)
/*该函数等价于 kobject_init && kobject_add*/
----int kobject_init_and_add(struct kobject *kobj, struct kobj_type *ktype, struct kobject *parent, const char *fmt, ...)
/*该函数先调用kobject_create,然后在调用kobject_add*/
----struct kobject *kobject_create_and_add(const char *name, struct kobject *parent)
/*删除kobject--首先在文件树中删除kobj对应的目录,然后再将kset中相对应的kobject删除,
在将kobject从层次关系中删除*/
----void kobject_del(struct kobject *kobj)
----/*总结:将一个kobject对象添加到系统中或者从系统中删除,主要是围绕sysfs文件系统展开的,
----对应的结果反映到/sys目录中就是一个新目录的诞生或者是一个已经存在的目录的消亡*/
****************(知道就好)**************
用户程序可以通过文件系统sysfs接口来配置内核kobject对象的某些属性----主要是通过ktype的操作方法来配置
/*下面为kobject对象创建一个属性文件*/
----/*sysfs_create_file - create an attribute file for an object.*/
----int sysfs_create_file(struct kobject * kobj, const struct attribute * attr)
****************************************
2.2 关于kset---(一组kobjcet的集合)
---kset可以认为是kobject的容器,kset本身也是一个内核对象,所以要内嵌一个kobject对象*/
/*
* ksets are used to define the attribute callbacks(struct kset_uevent_ops) and other common events that happen to a kobject. /**kset主要的作用**/
* @list: the list of all kobjects for this kset
* @list_lock: a lock for iterating over the kobjects
* @kobj: the embedded kobject for this kset (recursion, isn't it fun...)
* @uevent_ops: the set of uevent operations for this kset. These are
* called whenever a kobject has something happen to it so that the kset
* can add new environment variables, or filter out the uevents if so
* desired.
*/
---struct kset {
struct list_head list;
spinlock_t list_lock;
struct kobject kobj;
const struct kset_uevent_ops *uevent_ops;
----};