Linux设备模型基础---数据结构


struct kobject
{
   const char *name;
   struct list_head entry;
   struct kobject *parent;
   struct kset *kset;
   struct kobj_type *ktype;
   struct sysfs_dirent *sd;
   struct kref kref;
   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: 名称

@kref: 引用计数,用于统计系统中引用该对象的次数。

?
struct kref
{
   atomic_t refcount;
};

 看似多此一举,实际上是为了防止用户直接操作refcount。用struct kref进行封装后,用户须通过固定的接口来操作。如

?
void kref_set( struct kref *kref, int num);
void kref_init( struct kref *kref);
void kref_get( struct kref *kref);
int kref_put( struct kref *kref, void (*release) ( struct kref *kref));

@ktype:

?
struct 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的引用计数减为0时,该指针指向的函数将被调用,进行kobject的释放处理。

@default_attrs:kobject所具有的属性值,这些属性值通过sysfs文件系统到处到用户空间,用户也可

对这些值进行赋值。

?
struct attribute {
   const char *name;
   mode_t mode;
#ifdef CONFIG_DEBUG_LOCK_ALLOC
   struct lock_class_key *key;
   struct lock_class_key skey;
#endif
};

      @name: 属性名

      @mode: 属性模式

      其余两个属性仅在内核启动了对锁调试的支持时才有用。

@sysfs_ops: 该结构包括两个函数指针,其中show指向的函数用于向用户导出属性值,而store在用

户对属性进行赋值时被调用。

?
struct sysfs_ops {
   ssize_t (*show)( struct kobject *, struct attribute *, char *);
   ssize_t (*store)( struct kobject *, struct attribute *, const char *, size_t );
};

其余变量用于命名空间的支持,此处忽略。

组织结构相关的成员变量

@kset: kobject所属的kset

kset是用于组织属于某种特定类型的kobject对象集合,这里的类型指的是对于某些时间具有某种相同

操作的意思。

?
struct kset {
   struct list_head list;
   spinlock_t list_lock;
   struct kobject kobj;
   const struct kset_uevent_ops *uevent_ops;
};

      @list: 用于组织本kset内的kobject对象。

      @list_lock: 自旋锁,在遍历本set中的kobject对象时实现互斥操作。

      @kobj: kset作为一个内核对象,其本身也作为kobject的一个实例。

      @uevent_ops: uevent事件的响应函数。

?
struct kset_uevent_ops {
   int (* const filter)( struct kset *kset, struct kobject *kobj);
   const char *(* const name)( struct kset *kset, struct kobject *kobj);
   int (* const uevent)( struct kset *kset, struct kobject *kobj, struct kobj_uevent_env *env);
};

     @filter: 过滤掉不感兴趣的uevent事件

      @name: 获取subsystem环境变量

      @uevent: uevent事件发送函数。

@entry: 属于同一个ksetkobject对象会组织成双向链表形式,entry为相应的链接元素。

?
struct list_head
{
   struct list_head *prev, *next;
};

@parent: kobject除了根据其所属的kset进行组织以外,同时会按照父子关系组织成树形

结构,而parent则指向其父节点。

Sysfs文件系统相关的成员变量

@sysfs_dirent:Sysfs文件系统中对应的节点,该节点可能为一个目录、链接等。

?
struct sysfs_dirent {
   atomic_t s_count;
   atomic_t s_active;
#ifdef CONFIG_DEBUG_LOCK_ALLOC
   struct lockdep_map dep_map;
#endif
   struct sysfs_dirent *s_parent;
   struct sysfs_dirent *s_sibling;
   const char *s_name;
   const void *s_ns; /* namespace tag */
   union {
     struct sysfs_elem_dir s_dir;
     struct sysfs_elem_symlink s_symlink;
     struct sysfs_elem_attr s_attr;
     struct sysfs_elem_bin_attr s_bin_attr;
};
   unsigned int s_flags;
   unsigned short s_mode;
   ino_t s_ino;
   struct sysfs_inode_attrs *s_iattr;
};

     @s_count: 引用计数

      @s_active: 对成员变量解除引用时,要获得此变量的引用。

      @s_parent; 父节点

      @s_sibling: 兄弟节点

      @s_name;

      @s_ns;

      @union *: 根据s_flags有不同实现。

      @s_flags: 类型,只使用了低16位,在低16位中,低8位是节点类型,高8位是命名空间类型

      @s_mode:

      @s_ino: inode节点号

      @s_iattr: 主要用于VFS层监视inode节点状态改变。

你可能感兴趣的:(Linux设备模型基础---数据结构)