sysfs系统
sysfs系统是什么?
sysfs是一种虚拟文件系统,旨在提供一种访问内核数据结构的方法,从而允许用户空间程序查看和控制系统的设备和资源。sysfs文件系统通常被挂载在/sys目录下。sysfs提供了一种以树状结构组织的系统信息的方式,其中每个设备都有一个唯一的目录来表示它自己,其中包含有关设备的各种属性和状态信息的文件。这些文件通常是只读的,但有些也可以用于修改设备的某些设置。sysfs还提供了一个机制来通知用户空间程序有关设备状态更改的信息,从而使其能够对这些更改做出反应。sysfs文件系统被广泛用于Linux内核中,它为开发者提供了一种简单的方式来管理和控制系统中的各种设备和资源。
我们知道,在linux系统下一切皆文件,所以设备也是linux下的一个文件。
由mount命令我们可以看到,sysfs挂在在sys目录下
我们可以进入下面这个文件夹查看设备驱动程序信息
总线都会放到/sys/bus这个目录下,其中设备驱动程序信息在/sys/bus/platform/drivers下
具体理解我们可以参考以下图表:
1.Bus(总线)
总线是一种用于连接多个硬件设备的物理或逻辑通道,它是计算机系统中最重要的组成部分之一,负责将各种设备连接到主板上,并通过数据传输来实现这些设备之间的通信。在 Linux 操作系统中,总线是一种抽象的概念,用于描述硬件设备之间的连接方式和通讯协议。常见的总线类型包括 PCI、USB、SATA、I2C 等。Linux 内核通过识别总线来自动发现和配置连接在总线上的硬件设备。
2.Devices(设备)
设备是指连接在总线上的硬件设备,例如磁盘驱动器、网卡、USB 设备等。在 Linux 操作系统中,每个设备都会被分配一个唯一的设备文件(device file),用于表示设备在文件系统中的位置。设备文件通常位于 /dev 目录下,例如硬盘设备文件为 /dev/sda、USB 设备文件为 /dev/usb。
3.Classes(设备类)
设备类是一种用于分类和管理设备的机制。在 Linux 操作系统中,每个设备都会被分配一个设备类,例如磁盘设备属于 block 类、网络设备属于 net 类。设备类用于将相似的设备归类到一起,并提供一组共同的属性和接口。例如,所有 block 类设备都具有读写数据的接口,所有 net 类设备都具有配置网络参数的接口,比如Block 类设备是一种按照固定大小的块(通常为512字节或4KB)来访问的存储设备,例如硬盘、闪存、光盘等。Block 类设备提供了读取和写入块数据的接口,同时也支持块设备缓存、磁盘分区、文件系统等功能。
4.总线、设备和设备类之间的链接方式如下:
每个设备都属于一个设备类,设备类定义了设备的属性和接口。
每个设备都连接到一个总线上,总线通过 ID 来唯一标识每个设备。
每个设备节点都与一个设备相关联,设备节点的名称由设备类决定。
koject的内核对象模型基础
在 Linux 内核中,kobject 是内核对象(Kernel Object)的一种抽象表示。它是内核对象模型的基础,用于表示内核中的各种资源(如设备、驱动程序、进程等),并提供统一的管理和操作接口。是设备模型的核心,引入了通用对象属性的封装概念。kobject 通常用于表示驱动程序中的设备对象,即 struct device 结构体的成员。当设备驱动程序被加载到内核中时,驱动程序会注册一个 struct device_driver 结构体,其中包含了设备对象的信息。内核将创建一个 kobject 对象来表示该设备对象,并将其添加到设备模型中。然后,用户空间可以使用 sysfs 接口来查询和配置设备对象的属性,例如设备状态、驱动程序信息等。头文件:<linux/kobject.h>
如上图相当于是一种层层封装的结构
kobject结构体定义
struct kobject { const char *name; struct list_head entry; struct kobject *parent; struct kset *kset; struct kobj_type *ktype; struct sysfs_dirent *sd; struct kref kref; 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; unsigned int uevent_suppress:1; };