linux驱动模型(上)

原创 2011年01月08日 15:54:00

       声明:本文为作者原创,欢迎转载,但请保留作者姓名和出处,由于本人水平有限,如有错误欢迎指正 957626485@qq.com   

                                                                                       -----Charistain

                                                                                                                                                    与2.4内核相比,2.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的管理,通过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被组织成一个双向循环链表

 

 

subsystem:   kset的集合

  描述系统中某一类设备子系统,如block_subsys表示所有的块设备,对应于sysfs文件系统中的block目录。类似的,devices_subsys对应于sysfs中的devices目录,描述系统中所有的设备。Subsystem由 struct subsystem数据结构描述

struct subsystem {
struct kset kset;       内嵌的kset对象
struct rw_semaphore rwsem;  互斥访问信号量
};
每个kset必须属于某个subsystem,通过设置kset结构中的subsys域指向指定的subsystem可以将一个kset加入到该subsystem。所有挂接到同一subsystem的kset共享同一个rwsem信号量,用于同步访问kset中的链表。

 

 

device设备模型:

struct device {

 //只列出部分结构

 struct list_head g_list;   //挂接到全局设备链表
 struct list_head node;    //挂接到兄弟设备链表
    struct list_head bus_list;   //统一总线上的设备列表
    struct list_head driver_list; //统一驱动管理的设备链表
    struct list_head children;
    struct device *parent;
    struct kobject kobj;  //引用计数管理,实现层次化管理
    char bus_id[BUS_ID_SIZE];
    struct bus_type *bus;      //设备所接到的总线类型
    struct device_driver *driver;  //管理该设备驱动的对象,下面将进行说明

   void *driver_data;//设备驱动数据

}
g_list 将该device对象挂接到全局设备链表中,所有的device对象都包含在devices_subsys中,并组织成层次结构。Node域将该对象挂接到其兄弟对象的链表中,而bus_list则用于将连接到相同总线上的设备组织成链表,driver_list则将同一驱动程序管理的所有设备组织为链表。此外,children域指向该device对象子对象链表头,parent域则指向父对象。Device对象还内嵌一个kobject对象,用于引用计数管理并通过它实现设备层次结构。Driver域指向管理该设备的驱动程序对象,而driver_data则是提供给驱动程序的数据。Bus域描述设备所连接的总线类型。内核提供了相应的函数用于操作device对象。其中Device_register()函数将一个新的device对象插入设备模型,并自动在/sys/devices下创建一个对应的目录

 

设备驱动管理结构

struct device_driver {
    char *name;   设备驱动程序的名称
    struct bus_type *bus;  该驱动所管理的设备挂接的总线类型
    struct kobject kobj;    内嵌kobject对象,实现计数引用和层次化
    struct list_head devices;   该驱动所管理的设备链表头
    int (*probe)(struct device *dev); 指向设备探测函数,用于探测设备是否可以被该驱动程序管理
int (*remove)(struct device *dev); 用于删除设备的函数
/* some fields omitted*/
};

 

 

总线buses

   struct bus_type {
 const char  *name;  //总线名称
 struct bus_attribute *bus_attrs;  //总线属性
 struct device_attribute *dev_attrs; //设备属性
 struct driver_attribute *drv_attrs;   //驱动程序属性

 int (*match)(struct device *dev, struct device_driver *drv); 
 int (*uevent)(struct device *dev, struct kobj_uevent_env *env);
 int (*probe)(struct device *dev);
 int (*remove)(struct device *dev);
 void (*shutdown)(struct device *dev);

 int (*suspend)(struct device *dev, pm_message_t state);
 int (*suspend_late)(struct device *dev, pm_message_t state);
 int (*resume_early)(struct device *dev);
 int (*resume)(struct device *dev);

 struct dev_pm_ops *pm;

 struct bus_type_private *p;
};

 

 

 

linux驱动模型

linux驱动模型 在linux2.5中引入linux驱动模型,有时也叫linux设备模型,主要解决之前版本存在的以下问题: 1 没有一种统一的机制表达驱动和设备之间的关系 2 没有通用的热插拔...
  • menogen
  • menogen
  • 2013年11月18日 16:31
  • 512

Linux驱动模型

一、Linux设备驱动模型基本数据结构 Linux设备驱动模型有两个基本数据结构:kobject,kset kobject是组成设备模型的基本结构,类似于C++中的基类,它嵌入于更大的对象中用来描...
  • gongtxy
  • gongtxy
  • 2014年10月30日 10:52
  • 332

linux驱动模型---笔记

1 底层机制 Linux 的设备驱动模型的底层机制主要包括:kobject,kobj_type,kset 等几个结构。这几个 结构的定义在include/linux/kobject.h 中。 1...
  • lishaman
  • lishaman
  • 2011年08月16日 10:34
  • 959

Linux驱动模型 - 总线

Bus Types   Definition~~~~~~~~~~ See the kernel doc for the struct bus_type.(include/linux/devic...
  • TechMax
  • TechMax
  • 2014年07月11日 17:47
  • 244

Linux驱动模型(六)

Linux 3.4的设备驱动模型中,所有的device都是通过Bus相连。device_register() / driver_register()执行时通过枚举BUS上的Driver/Device来...
  • lbaihao
  • lbaihao
  • 2016年05月19日 22:41
  • 245

Linux驱动模型 - 概览

The Linux Kernel Device Model   Patrick Mochel           Drafted 26 August 2002 Updated 31 Jan...
  • TechMax
  • TechMax
  • 2014年07月11日 17:50
  • 348

Linux驱动模型 - 类

Bus Types   Definition~~~~~~~~~~ See the kernel doc for the struct bus_type.(include/linux/devic...
  • TechMax
  • TechMax
  • 2014年07月11日 17:45
  • 359

Linux驱动模型简介

Linux驱动模型可以从底层和上层两个层次来探究:  设备底层模型 和 设备模型的上层容器 Linux驱动模型和sysfs文件系统紧密相连,在内核中注册的每个kobject对象对应sysfs文件...
  • yuyin86
  • yuyin86
  • 2013年07月26日 19:04
  • 538

Linux驱动模型 - 驱动程序

Device Drivers   struct device_driver { char                  * name;         structbus_type   ...
  • TechMax
  • TechMax
  • 2014年07月11日 17:49
  • 442

linux驱动模型 - 设备

TheBasic Device Structure ~~~~~~~~~~~~~~~~~~~~~~~~~~ See the kerneldoc for the struct device.   ...
  • TechMax
  • TechMax
  • 2014年07月11日 17:48
  • 322
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux驱动模型(上)
举报原因:
原因补充:

(最多只允许输入30个字)