Linux设备驱动模型探究--1(kobject)



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;
----};

猜你喜欢

转载自blog.csdn.net/jun_8018/article/details/77556357
今日推荐