本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/74838165

版权声明:本文为博主原创文章,转载请注明http://blog.csdn.net/fengyuwuzu0519。

 

目录(?)[+]

 

学习中platform平台驱动中,慢慢发现底层有一个叫做Linux设备驱动模型的东西。发现是它是底层驱动重要的组织结构,现在针对设备驱动模型进行分析。从而加深对整个设备驱动注册的理解。

用户空间程序通过sysfs虚拟文件系统访问设备的相关信息。这些信息被组织成层次结构,用sysfs虚拟文件系统来表示,用户通过对sysfs的操作,就可以控制设备或者读取设备的信息。

一、sysfs文件系统简介:

1、sysfs概述

sysfs文件系统是内核对象(kobject)、属性(kobj_type)、及它们相互关系的一种表现。
sysfs非常重要的特征:用户可以从sysfs中读出内核数据,也可以将用户数据写入内核。

2、内核结构与sysfs对应关系:

kobject    -->目录

kobj_type-->属性文件

3、特点

sysfs文件系统只存在于内存中,动态的表示内核数据结构。设备启动时,设备驱动模型会注册kobject对象,并在sysfs文件系统中产生sys下目录文件。

sys/bus:下列出了注册到系统中的总线,如USB总线、platform总线。
sys/class:注册到内核中的设备类,如声音类(sound)、输入类(input)。

二、核心数据结构

在Linux的驱动表示中,主要有三个基本的结构,分别是kobject、kset、ktype.这三个结构是设备模型中的下层架构。
模型中的每一个元素都对应一个kobject.
kset和ktype可以看成是kobject在层次结构与属性结构方面的扩充。将三者之间的关系用图的方示描述如下:
参考:http://blog.csdn.net/lizuobin2/article/details/51511336
如上图所示,sysfs中每一个目录都对应一个kobject.
这些kobject都有自己的parent。在没有指定parent的情况下,都会指向它所属的kset->object。
其次,kset也内嵌了kobject.这个kobject又可以指它上一级的parent。就这样。构成了一个空间上面的层次关系。
其实,每个对象都有属性。例如,电源管理,执插拨事性管理等等。
因为大部份的同类设备都有相同的属性,因此将这个属性隔离开来,存放在ktype中。
这样就可以灵活的管理了.记得在分析sysfs的时候。
对于sysfs中的普通文件读写操作都是由kobject->ktype->sysfs_ops来完成的.

1、kobject结构体

kobject组成设备驱动模型的基本结构。
sysfs中,设备用树形结构来表示,树形结构每一个目录对应一个kobject对象(目录组织结构和名字等信息)

  1. struct kobject {
  2. const char      *name;                 kobject的名称,显示在sysfs文件系统中,作为一个目录的名字。
  3. struct list_head    entry;                   链接下一个kobject结构
  4. struct kobject      *parent;               指向父kobject结构体
  5. struct kset     *kset;                   指向所属的kest集合
  6. struct kobj_type    *ktype;                 指向kobject的属性文件,每个对象都有属性
  7. 将属性单独组织成数据结构kobj_type存放在ktype中
  8. 对于sysfs中的普通文件读写操作都是由kobject->ktype->sysfs_ops来完成的
  9. struct sysfs_dirent *sd;                      对应sysfs的文件目录
  10. struct kref     kref;                             kobject的引用计数
  11. unsigned int state_initialized:1;           初始化状态
  12. unsigned int state_in_sysfs:1;            是否已经加入到sysfs中
  13. unsigned int state_add_uevent_sent:1;
  14. unsigned int state_remove_uevent_sent:1;
  15. unsigned int uevent_suppress:1;
  16. };

在内核中,没有用kobject直接定义的变量,kobject只是作为一个抽象的基类而存在。一般都是将kobject嵌入到另一个结构,这个结构就可以看做是kobject的一个子类。而kobject的子类会比较关心kobject的属性和方法。

内核里的设备之间是以树状形式组织的,在这种组织架构里比较靠上层的节点可以看作是下层节点的父节点,
反映到sysfs里就是上级目录和下级目录之间的关系,在内核里,正是kobject帮助我们实现这种父子关系。

kobject的成员:

name表示的是kobject在sysfs中的名字;

指针parent用来指向kobject的父对象;

Kref大家应该比较熟悉了,kobject通过它来实现引用计数;

Kset指针用来指向这个kobject所属的kset;

对于ktype用来描述kobject的类型信息。

kobject的作用:

(1)kobject始终代表sysfs文件系统中的一个目录,name成员指定了目录名,不是文件。

(2)parent成员指定了kobject在sysfs中的目录,从而形成一个树形结构。

(3)ktype是kobject的属性,属性用文件来表示,放在kobject对应目录下。

2、设备属性kobj_type

每个kobject对象都有一些属性,这些属性由kobj_type表示,kobject中有指向kobj_type的指针,属性用文件来表示。

  1. struct kobj_type {
  2. void (*release)(struct kobject *kobj); 释放kobject和其占用资源的函数
  3. const struct sysfs_ops *sysfs_ops;      操作下一个属性数组的方法
  4. struct attribute **default_attrs;        属性数组
  5. const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);
  6. const void *(*namespace)(struct kobject *kobj);
  7. };

kobj_type的default_attrs成员保存了属性数组,每个kobject对象可以一个或多个属性,属性的定义如下:

  1. struct attribute {
  2. const char      *name;      属性的名称,对应目录下一个文件的名字
  3. umode_t         mode;         属性的读写权限
  4. #ifdef CONFIG_DEBUG_LOCK_ALLOC
  5. struct lock_class_key   *key;
  6. struct lock_class_key   skey;
  7. #endif
  8. };

kobj_type的default_attrs数组表明了kobject有哪些属性,但是没有说明如何操作这些属性,这个任务由kobj_type的
sysfs_ops->sysfs_ops来完成

  1. struct sysfs_ops {
  2. ssize_t (*show)(struct kobject *, struct attribute *,char *);                      读属性操作函数
  3. ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t);         写属性操作函数
  4. const void *(*namespace)(struct kobject *, const struct attribute *);
  5. };

kobject:要读写的kobject指针,attribute:要读写的属性。

3.kset结构体

之前说kobject对应文件系统/sys里的一个目录,kset中包含kobject结构体,所以kset也对应于/sys里的一个目录。
简单来说,kset 与 kobj 都是目录,既然是目录,那么在就是一个树状结构,每一个目录都将有一个父节点,
在kset中使用kset.kobj->parent 指定 
在kboject中使用  kobj->parent 指定
显然,整个树状目录结构,都是通过kobj来构建的,只不过有些kobj嵌在Kset里,分析目录结构时把kset当成一个普通的kobj会好理解很多。
kobject通过kset组织成层次化的结构,kset是具有相同类型的kobject集合。像驱动程序放在/sys/drivers目录下一样,目录drivers是一个kset对象,包含系统中驱动程序对应的目录,驱动程序的目录有kboject表示。内核将相似的kboject结构连接在kset集合中。

  1. struct kset {
  2. struct list_head list;
  3. spinlock_t list_lock;
  4. struct kobject kobj;
  5. const struct kset_uevent_ops *uevent_ops;
  6. };

kobject与kset对应关系:

目前的简单理解:

linux存在一个虚拟文件系统/sysfs,内核启动挂接文件系统后会将sysfs文件系统挂接到/sys下。内核启动时会初始化并注册一些总线、设备,这些总线、设备等会在sys下创建目录,来存储,如/sys/bus/platform 下存储了平台设备信息。如何组织管理设备,并创建目录呢,通过设备驱动模型的几个重要结构体:Kobject、kobj_type、kset来组织和管理目录及文件结构。

linux设备驱动模型之Kobject、kobj_type、kset【转】的更多相关文章

  1. linux设备驱动模型(kobject与kset)

    Linux设备模型的目的:为内核建立一个统一的设备模型,从而又一个对系统结构的一般性抽象描述.换句话说,Linux设备模型提取了设备操作的共同属性,进行抽象,并将这部分共同的属性在内核中实现,而为需要 ...

  2. LINUX设备驱动模型之class

    转自 https://blog.csdn.net/qq_20678703/article/details/52754661 1.LINUX设备驱动模型中的bus.device.driver,.其中bu ...

  3. Linux设备驱动模型底层架构及组织方式

    1.什么是设备驱动模型? 设备驱动模型,说实话这个概念真的不好解释,他是一个比较抽象的概念,我在网上也是没有找到关于设备驱动模型的一个定义,那么今天就我所学.所了解 到的,我对设备驱动模型的一个理解: ...

  4. Linux 设备驱动模型

    Linux系统将设备和驱动归一到设备驱动模型中了来管理 设备驱动程序功能: 1,对硬件设备初始化和释放 2,对设备进行管理,包括实参设置,以及提供对设备的统一操作接口 3,读取应用程序传递给设备文件的 ...

  5. Linux设备驱动模型之platform(平台)总线详解

    /********************************************************/ 内核版本:2.6.35.7 运行平台:三星s5pv210 /*********** ...

  6. Linux设备驱动模型简述(源码剖析)

    1. Linux设备驱动模型和sysfs文件系统 Linux内核在2.6版本中引入设备驱动模型,简化了驱动程序的编写.Linux设备驱动模型包含设备(device).总线(bus).类(class)和 ...

  7. 探究linux设备驱动模型之——platform虚拟总线(一)

    说在前面的话 :      设备驱动模型系列的文章主要依据的内核版本是2.6.32的,因为我装的Linux系统差不多就是这个版本的(实际上我用的fedora 14的内核版本是2.6.35.13的.) ...

  8. linux设备驱动模型

    尽管LDD3中说对多数程序员掌握设备驱动模型不是必要的,但对于嵌入式Linux的底层程序员而言,对设备驱动模型的学习非常重要. Linux设备模型的目的:为内核建立一个统一的设备模型,从而又一个对系统 ...

  9. Linux设备驱动模型【转】

    本文转载自:http://blog.csdn.net/xiahouzuoxin/article/details/8943863 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+ ...

随机推荐

  1. 音视频】5.ffmpeg命令分类与使用

    GT其实平时也有一些处理音视频的个人或者亲人需求,熟练使用ffmpeg之后也不要借助图示化软件,一个命令基本可以搞定 G: 熟练使用ffmpeg命令!T :不要死记硬背,看一遍,自己找下规律,敲一遍, ...

  2. Java基础(五)--内部类

    内部类简单来说就是把一个类的定义放到另一个类的定义内部 内部类分为:成员内部类.局部内部类.匿名内部类.静态内部类 成员内部类:最常见的内部类 public class Outter { privat ...

  3. Spring框架系列(九)--MyBatis面试题(转载)

    1.什么是Mybatis? 1.Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动.创建 连接.创建statement ...

  4. Python爬虫:抓取手机APP的数据

    摘要 大多数APP里面返回的是json格式数据,或者一堆加密过的数据 .这里以超级课程表APP为例,抓取超级课程表里用户发的话题. 1.抓取APP数据包 表单: 表单中包括了用户名和密码,当然都是加密 ...

  5. Spring Boot 2.0的属性绑定

    Spring Boot2.0的属性绑定 原文从Spring boot第一个版本以来,我们可以使用@ConfigurationProperties注解将属性绑定到对象.也可以指定属性的各种不同格式.比如 ...

  6. 监听微信端,手机端,ios端的浏览器返回事件,pc端关闭事件

    直接上代码了,可以监听微信端,手机端,iOS端的浏览器返回事件,关闭事件不支持 当进入该页面,我们就给这个history压入一个本地的连接.当点击返回.后退及上一页的操作时,就进行监听,在监听代码中实 ...

  7. 洛谷——P1229 遍历问题

    P1229 遍历问题 题目描述 我们都很熟悉二叉树的前序.中序.后序遍历,在数据结构中常提出这样的问题:已知一棵二叉树的前序和中序遍历,求它的后序遍历,相应的,已知一棵二叉树的后序遍历和中序遍历序列你 ...

  8. poj - 3254 - Corn Fields (状态压缩)

    poj - 3254 - Corn Fields (状态压缩)超详细 参考了 @外出散步 的博客,在此基础上增加了说明 题意: 农夫有一块地,被划分为m行n列大小相等的格子,其中一些格子是可以放牧的( ...

  9. python经典书籍:Python编程实战 运用设计模式、并发和程序库创建高质量程序

    Python编程实战主要关注了四个方面 即:优雅编码设计模式.通过并发和编译后的Python(Cython)使处理速度更快.高层联网和图像.书中展示了在Python中已经过验证有用的设计模式,用专家级 ...

  10. open random

    open文件操作 f = open('文件路径',mode='rwab+',encoding='utf-8') # content = f.read(3) # 读出来的都是字符 # f.seek(3) ...