宋宝华《Linux设备驱动开发详解》——sysfs文件系统与linux设备模型(5.4.2)

时间:2024-04-10 22:29:34

以下读书笔记内容,摘自宋宝华《Linux设备驱动开发详解》一书。


1、sysfs文件系统的简介

(1)linux2.6以后的内核引进syfs文件系统,是虚拟文件系统;

(2)产生一个包括所有系统硬件的层级视图。

  • 在/sys目录下运行tree可以得到树形目录;
  • 向用户空间导出内核数据结构和它们的属性;

(3)而/proc文件系统,提供进程和状态信息。


2、linux设备模型

宋宝华《Linux设备驱动开发详解》——sysfs文件系统与linux设备模型(5.4.2)

宋宝华《Linux设备驱动开发详解》——sysfs文件系统与linux设备模型(5.4.2)

宋宝华《Linux设备驱动开发详解》——sysfs文件系统与linux设备模型(5.4.2)

宋宝华《Linux设备驱动开发详解》——sysfs文件系统与linux设备模型(5.4.2)


3、linux设备模型组件:总线、设备、驱动,类

(1)分别用bus_type、device_driver,device来描述总线、设备和驱动;

  • 在include/linux/device.h中定义

(2)结构体描述

  • 设备和驱动都必须依附于一种总线,因此都包含struct bus_type指针;
  • 设备和驱动是分开注册的,通过bus_type的match()函数进行匹配;
  • 一旦匹配成功,xxx_driver的probe()函数就被执行。
  • xxx是总线名,如platform、pci、i2c、spi、usb等等,比如http://blog.csdn.net/oqqhutu12345678/article/details/72851807

(3)设备结构体

  • device 结构体用于描述设备相关的信息设备之间的层次关系,以及设备与总线、驱动的关系。
  • 内核提供了相应的函数用于操作 device 对象。其中 device_register()函数将一个新的 device 对象插入设备模型,并自动在/sys/devices 下创建一个对应的目录。device_unregister()完成相反的操作,注销设备对象。get_device()和 put_device()分别增加与减少设备对象的引用计数。
  • 通常 device 结构体不单独使用,而是包含在更大的结构体中,比如描述 PCI 设备的 struct pci_dev,其中的 dev 域就是一个 device 对象。
宋宝华《Linux设备驱动开发详解》——sysfs文件系统与linux设备模型(5.4.2)

(4)驱动结构体

  • 与 device 结构体类似,device_driver 对象依靠内嵌的 kobject 对象实现引用计数管理和层次结构组织。
  • 内核提供类似的函数用于操作 device_driver 对象。如 get_driver()增加引用计数,driver_register()用于向设备模型插入新的 driver 对象,同时在 sysfs 文件系统中创建对应的目录。
  • device_driver()结构体还包括几个函数,用于处理探测、移除和电源管理事件。

宋宝华《Linux设备驱动开发详解》——sysfs文件系统与linux设备模型(5.4.2)

(5)总线结构体

  • 每个 bus_type 对象都对应/sys/bus 目录下的一个子目录,如 PCI 总线类型对应于/sys/bus/pci。
  • 在每个这样的目录下都存在两个子目录:devices和 drivers(分别对应于 bus_type 结构中的 devices 和 drivers 域)。其中 devices 子目录描述连接在该总线上的所有设备,而 drivers 目录则描述与该总线关联的所有驱动程序。
  • 与 device_driver 对象类似,bus_type 结构还包含几个函数处理热插拔、即插即拔和电源管理事件的函数。

宋宝华《Linux设备驱动开发详解》——sysfs文件系统与linux设备模型(5.4.2)

宋宝华《Linux设备驱动开发详解》——sysfs文件系统与linux设备模型(5.4.2)


(6)sysfs中的目录来源于这三个结构体,而目录中的文件来源于attribute。

  • 总线、驱动和设备最终落实为sysfs中的一个目录,因为他们都是kobject的派生类(kobject是所有总线、设备和驱动的抽象总类,而一个kobject对应sysfs中的一个目录);
  • 三个结构体中的attribute则落实为sysfs中的一个文件。attribute会随着show()和store()两个函数,分别读写该attribute对应的文件。


(7)class结构体

  • 每个 class 对象(表示一类)包括一个 class_device 链表,每个 class_device 对象表示一个逻辑设备,并通过 struct class_device 中的 dev 成员(一个指向 struct device 的指针)关联一个物理设备。这样,一个逻辑设备总是对应于一个物理设备,但是一个物理设备却可能对应于多个逻辑设备,代码清单 5.16 给出了 class_device 的定义。此外,class 结构中还包括用于处理热插拔、即插即拔和电源管理事件的函数,这与 bus_type 对象相似。

宋宝华《Linux设备驱动开发详解》——sysfs文件系统与linux设备模型(5.4.2)

宋宝华《Linux设备驱动开发详解》——sysfs文件系统与linux设备模型(5.4.2)

宋宝华《Linux设备驱动开发详解》——sysfs文件系统与linux设备模型(5.4.2)

宋宝华《Linux设备驱动开发详解》——sysfs文件系统与linux设备模型(5.4.2)宋宝华《Linux设备驱动开发详解》——sysfs文件系统与linux设备模型(5.4.2)


(8)属性

  • 在 bus、device、driver 和 class 层次上都分别定义了其属性结构体,包括bus_attribute、driver_attribute、class_attribute、class_device_attribute;
  • 这几个结构体的定义在本质是完全相同的,如代码清单 5.18 所示。
宋宝华《Linux设备驱动开发详解》——sysfs文件系统与linux设备模型(5.4.2)宋宝华《Linux设备驱动开发详解》——sysfs文件系统与linux设备模型(5.4.2)宋宝华《Linux设备驱动开发详解》——sysfs文件系统与linux设备模型(5.4.2)