Linux设备驱动模型


与2.4内核相比,Linux2.6内核最大的不同在于提供了统一的设备驱动模型,因为随着对智能电源管理,plug and play等设备支持的要求越来越高,2.4内核显得有点力不从心。为此,2.6内核开发了全新的驱动模型。

 1.sysfs文件系统

     sysfs文件系统类似于proc特殊文件系统,用于将系统中的所有设备组织成层次结构,供用户模式下的程序了解内核数据结构的信息。期目录下主要有下面的目录:

 block:包含了所有的块设备,如ram。sda,loop

bus:包含了系统中所有的总线类型,有I2c,sdio,ac97等,在每个总线设备下都有如devices(描述使用这种总线的设备信息),drivers(使用该总线的设备驱动),driver_autoprobe(用于自动探测到设备的接入),uevent(卸载设备),driver_probe.几个文件

devices:系统中所有的设备,根据设备所属的总线类型组织成了层次结构,我们可以看到熟悉的platform结构

class:系统中所有的设备类型,我们可以看到如:net,rtc,block,pci,dma这样的分类

fs:系统中现在使用的文件系统类型

dev:有block和char两个目录

2.增加了一些关键的数据结构

  kobject是2.6内核开始使用的统一设备管理模型。在以前的内核中,并没有一个独立的数据结构让内核对系统做统一的管理和配置,kobject通过对设备进行抽象,来完成了许多的任务。

  (1)对设备进行了分类,从上层的角度去看设备

  (2)对于热插拔设备,通过这个模型可以根据用户的实际需求进行卸载和安装设备

  (3)kobject中的信息可以受sysfs的管理,www.bkjia.com通过sysfs用户可以很方便的了解到设备的情况,从而实现了内核和用户空间的通信

  (4)在系统关机前,系统可以通过Kobject找到所有的设备,然后一一处理再关机。

下面来看一下Kobjec数据结构

include/linux/kobject.h

 
struct kobject {
 const char  *name;   //对象的名称
 struct list_head entry; // 列表头
 struct kobject  *parent;  //父对象
 struct kset  *kset;  //kobject集合,下面也将分析
 struct kobj_type *ktype; //对象类型 kobject将在下面分析   

 struct sysfs_dirent *sd;                            

 struct kref  kref;   //记录该对象被引用的次数,内核通过kobjetc_get(),kobject_put来增加和减少引用的次数
 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;
};

 

 对象类型:

 struct kobj_type {
 void (*release)(struct kobject *kobj); //释放kobject占用的资源
 struct sysfs_ops *sysfs_ops;  //指向sysfs操作表
 struct attribute **default_attrs;  //sysfs默认属性表指针
};

sysfs_ops结构,用户读取sysfs属性时,实现了用户空间和内核的通信

  struct sysfs_ops {
 ssize_t (*show)(struct kobject *, struct attribute *,char *);  //将属性值读入buffer
 ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t); //从用户空间都属性值
};

kset集合

  kset即为具有相同性质的kobject集合。

struct kset {
struct subsystem * subsys;   所在的subsystem的指针
struct kobj_type * ktype;   指向该kset对象类型描述符的指针
struct list_head list;      用于连接该kset中所有kobject的链表头
struct kobject kobj;     嵌入的kobject
struct kset_hotplug_ops * hotplug_ops;  指向热插拔操作表的指针
};

包含在kset中的所有kobject被组织成一个双向循环链表

  • 1
  • 2
  • 下一页

相关内容