LINUX设备驱动模型分析之一 总体概念说明

  这段时间阅读了LINUX SYSFS模块的代码,并完成了相应的学习笔记,阅读这些代码,为我们分析LINUX设备驱动模型提供了基础。下面这一段时间我将分析LINUX设备驱动模型。

     本次分析的LINUX设备驱动模型,主要涉及如下几个部分:

     一、LINUX设备驱动模型总体概述

     二、LINUX总线(BUS)接口分析

     三、LINUX设备(DEVICE)接口分析

     四、LINUX驱动(DRIVER)接口分析

     五、LINUX总线-设备-驱动接口关联说明

     六、LINUX设备类接口说明

     七、LINUX PLATFORM总线接口分析与说明

 

本章节主要对LINUX设备驱动模型相关的概念进行说明,先从整体上对LINUX设备驱动模型进

行了解,下一章节我们就进行具体内容的分析。

 

设备驱动模型说明

 

       在sysfs文件系统下,有block、dev、bus、devices、class、fs、kernel等目录,本次我们介绍设备驱动模型,主要涉及class、bus、device这三个子目录。这三个目录下的子模块之间的关联与区别即构成了设备驱动模型。

其中,class模块主要将某一类的设备聚在一起,目前内核已支持的类型包括i2c-dev、rtc、gpio、sound、tty、input等。比如rtc类,该类下汇聚了所有rtc设备,而不管该rtc设备是通过i2c总线与cpu通信还是以spi总线与cpu通信,同时一个设备可能属于多个类,如rtc设备即属于rtc类,也可能属于i2c-dev类。

而devices目录下包含所有已扫描到的设备,每一个设备目录下面包含了uevent文件(主要用于向应用层发送event,可与udev相关联),也包含了每一个设备的属性信息,可进行设备属性的读写操作。

bus目录下存放了所有已注册的总线类型,而每一个总线目录下又包含了drivers子目录、devices子目录,其中drivers子目录下包含了所有注册到该总线上的驱动程序,而devices目录下包含了所有挂载至该总线类型上的设备,其中devices目录下的所有设备类型是/sys/devices目录下的链接文件。

 

如下是这三个模块之间的关联图,BUS、CLASS模块均与DEVICES进行关联,其中系统中所有的设备目录均在/sys/devices目录下创建,而BUS->devices目录下的子设备目录、CLASS目录下子设备目录均是/sys/devices目录下子设备目录的链接。

 

LINUX设备驱动模型分析之一 总体概念说明_第1张图片

 

subsystem相关的结构体变量

     针对BUS模块和CLASS模块,它们的结构体变量(struct class、struct bus)中均包含了struct subsys_private结构体变量,而该结构体变量中又包含了kset,从而完成了kobject的关联,因此在进行具体模块的分析之前,先对这几个结构体之间的关联进行梳理与说明。

        如下所示,即为struct class、struct bus、struct subsys_private、kset、kobject、kobj_type、kref等结构体之间的关联,BUS模块和CLASS模块通过subsys_private即实现了与kset、kobject的关联,而我们在之前的分析文档《》中,已经分析了kset、kobject与sysfs文件系统的关联。由此即实现了bus模块、class模块与sysfs文件系统的关联。

而针对devices模块而言,并没有定义类似struct class、struct bus的结构体,但‘

devices模块定义了kset类型的全局变量struct kset *devices_kset,并在函数devices_init中完成了对变量devices_kset内存申请及初始化操作。


LINUX设备驱动模型分析之一 总体概念说明_第2张图片

struct subsys_private {

struct kset subsys;

struct kset *devices_kset;

struct list_head interfaces;

struct mutex mutex;



struct kset *drivers_kset;

struct klist klist_devices;

struct klist klist_drivers;

struct blocking_notifier_head bus_notifier;

unsigned int drivers_autoprobe:1;

struct bus_type *bus;



struct kset glue_dirs;

struct class *class;

};

如上即为subsys_private结构体的定义,其中kset用于将将该子系统下的kobject聚集在一起,而devices_kset则用于将所有设备对应的kobject聚集在一起,而drivers_kset则用来将所有注册的drivers链接在一起,而drivers_autoprobe则用于自动进行设备即驱动的注册操作(即在进行设备的注册以及驱动的注册时,扫描所有已经注册的驱动及设备,完成设备与驱动的匹配操作)。

 

本小节的内容比较少,主要对LINUX设备模型进行简要的介绍,以便对LINUX设备模型有一个概念,下一章将开始介绍具体的实现。

你可能感兴趣的:(Linux,内核)