风也温柔

计算机科学知识库

java 数据结构-Kernel 设备模型基础框架kobject

  Linux设备模型的基础框架是基于 , kset 和 三个基础数据结构实现的。这篇主要分析这三个基础数据结构的做用,以及相互之间的关系。node

  1,:数据结构

   {

  const char *name; // 该的名字,用于 sysfs 文件系统下的文件夹名字

   entry; // 同类型 链表节点

   *; // 指向父节点 kset 的

   kset *kset; // 同类型的集合

   *ktype; // 的属性操做方法,以及 方法

   sd; / sysfs entry */ // 该 在sysfs文件系统下的节点

   kref kref; // 引用计数

  #ifdef

   ;

  #endif

   int :1;

   int :1;

   int t:1;

   int sent:1;

   int :1;

  };框架

   是最基础的数据结构,从上述字段定义中,能够看出这个结构包含以下功能:dom

  (1)引用计数功能。一个可能表明一个总线,设备或驱动等,这些实例在内核空间可能会被多个调度实体或对象指针引用,所以用一个引用计数结构 kref 来记录当前有多少对象引用该 ,当 kref 的引用计数减为0时,内核接口自动调用用户指定的接口销毁该对象。kref 数据结构的本质就是一个类型的对象,内核提供了 () 和 () 两个接口用于对引用计数自增和自减:ui

   kref {

   ;

  };atom

   {

   refs; // 本质上就是一个 类型的字段

  } ;spa

  接口:指针

   void ( kref *kref)

  {

  (&kref->); // kref 自增

  }对象

   int ( kref kref, void ()( kref *kref))

  {

  if (t(&kref->)) { // kref 自减

  (kref); // 若是减完以后为0,释放该 kref 对象

   1;

  }

   0;

  }blog

  (2)链表组织结构功能。多个对象连接在一个kset下java 数据结构,造成一个循环双向链表。字段entry是双向链表节点,kset指向该所属的kset,通常指向kset中的。

  (3)sysfs接口。一个表示sysfs文件系统中的一个目录,方便用户在用户态访问内核态数据结构。字段sd表示该在sysfs中的入口项,name表示表示的目录名称java 数据结构,ktype表示该目录的操做接口,包含对象的接口,以及该目录下属性文件的读写接口。

  2,kset:

   kset {

   list; // 用于链接该kset下全部的链表节点

   ;

   kobj; // 一个kset本质上也是一个

  const *; // 内核事件上报用户态接口,通常用于驱动的热插拔事件上报

  } ;

  一个kset表示全部同类型的的集合。kset内部经过包含一个,用来同其下挂的全部组成一个双向循环链表。同时其下挂的全部的都指向kset中包含的这个。是内核事件上报用户态机制,多用于设备和驱动的热插拔事件上报。

  3,:

   {

  void ()( kobj); // 同类型对象的释放接口

  const *; // 属性文件的读写接口

   **; // 的属性

  const ons ()( *kobj);

  const void ()( *kobj);

  void ()( kobj, uid, gid);

  };

  一个主要用来定义的属性文件的读写接口,以及对象的释放操做。

  2,经过上述分析,咱们能够画出 ,kset 和 之间的关系:

  3,总结一下:/kset一般用于其余对象结构的内置结构java 数据结构-Kernel 设备模型基础框架kobject,如设备和驱动数据结构一般都包含一个结构,实现引用计数,设备层次结构和sysfs操做等。

  文章来源:http://www.javashuo.com/article/p-buizfygu-bm.html