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

来源:互联网 发布:沈阳师范大学软件楼 编辑:程序博客网 时间:2024/04/29 20:48


structkobject
{
  constchar *name;
  structlist_head entry;
  structkobject *parent;
  structkset *kset;
  structkobj_type *ktype;
  structsysfs_dirent *sd;
  structkref kref;
  unsignedintstate_initialized:1;
  unsignedintstate_in_sysfs:1;
  unsignedintstate_add_uevent_sent:1;
  unsignedintstate_remove_uevent_sent:1;
  unsignedintuevent_suppress:1;
};

属性相关的成员变量

@name: 名称

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

?
structkref
{
  atomic_t refcount;
};

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

?
voidkref_set(structkref *kref, intnum);
voidkref_init(structkref *kref);
voidkref_get(structkref *kref);
intkref_put(structkref *kref, void(*release) (structkref *kref));

@ktype:

?
structkobj_type
{
  void(*release)(structkobject *kobj);
  conststruct sysfs_ops *sysfs_ops;
  structattribute **default_attrs;
  conststruct kobj_ns_type_operations *(*child_ns_type)(structkobject *kobj);
  constvoid *(*namespace)(structkobject *kobj);
};

@release:kobject的引用计数减为0时,该指针指向的函数将被调用,进行kobject的释放处理。

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

对这些值进行赋值。

?
structattribute {
  constchar *name;
  mode_t mode;
#ifdef CONFIG_DEBUG_LOCK_ALLOC
  structlock_class_key *key;
  structlock_class_key skey;
#endif
};

      @name: 属性名

      @mode: 属性模式

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

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

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

?
structsysfs_ops {
  ssize_t (*show)(structkobject *, structattribute *,char*);
  ssize_t (*store)(structkobject *,structattribute *,constchar *, size_t);
};

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

组织结构相关的成员变量

@kset: kobject所属的kset

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

操作的意思。

?
structkset {
  structlist_head list;
  spinlock_t list_lock;
  structkobject kobj;
  conststruct kset_uevent_ops *uevent_ops;
};

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

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

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

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

?
structkset_uevent_ops {
  int(* constfilter)(structkset *kset, structkobject *kobj);
  constchar *(* constname)(structkset *kset, structkobject *kobj);
  int(* constuevent)(structkset *kset, structkobject *kobj, structkobj_uevent_env *env);
};

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

      @name: 获取subsystem环境变量

      @uevent: uevent事件发送函数。

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

?
structlist_head
{
  structlist_head *prev, *next;
};

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

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

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

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

?
structsysfs_dirent {
  atomic_t s_count;
  atomic_t s_active;
#ifdef CONFIG_DEBUG_LOCK_ALLOC
  structlockdep_map dep_map;
#endif
  structsysfs_dirent *s_parent;
  structsysfs_dirent *s_sibling;
  constchar *s_name;
  constvoid *s_ns; /* namespace tag */
  union{
    structsysfs_elem_dir s_dir;
    structsysfs_elem_symlink s_symlink;
    structsysfs_elem_attr s_attr;
    structsysfs_elem_bin_attr s_bin_attr;
};
  unsignedints_flags;
  unsignedshorts_mode;
  ino_t s_ino;
  structsysfs_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节点状态改变。

原创粉丝点击