sysfs文件系统(1)

简介: sysfs是一种虚拟文件系统,旨在提供一种访问内核数据结构的方法,从而允许用户空间程序查看和控制系统的设备和资源。sysfs文件系统通常被挂载在/sys目录下。sysfs提供了一种以树状结构组织的系统信息的方式,其中每个设备都有一个唯一的目录来表示它自己,其中包含有关设备的各种属性和状态信息的文件。这些文件通常是只读的,但有些也可以用于修改设备的某些设置。sysfs还提供了一个机制来通知用户空间程序有关设备状态更改的信息,从而使其能够对这些更改做出反应。sysfs文件系统被广泛用于Linux内核中,它为开发者提供了一种简单的方式来管理和控制系统中的各种设备和资源。

sysfs系统


sysfs系统是什么?


sysfs是一种虚拟文件系统,旨在提供一种访问内核数据结构的方法,从而允许用户空间程序查看和控制系统的设备和资源。sysfs文件系统通常被挂载在/sys目录下。sysfs提供了一种以树状结构组织的系统信息的方式,其中每个设备都有一个唯一的目录来表示它自己,其中包含有关设备的各种属性和状态信息的文件。这些文件通常是只读的,但有些也可以用于修改设备的某些设置。sysfs还提供了一个机制来通知用户空间程序有关设备状态更改的信息,从而使其能够对这些更改做出反应。sysfs文件系统被广泛用于Linux内核中,它为开发者提供了一种简单的方式来管理和控制系统中的各种设备和资源。


我们知道,在linux系统下一切皆文件,所以设备也是linux下的一个文件。

由mount命令我们可以看到,sysfs挂在在sys目录下

image.png

我们可以进入下面这个文件夹查看设备驱动程序信息

总线都会放到/sys/bus这个目录下,其中设备驱动程序信息在/sys/bus/platform/drivers下

image.png

具体理解我们可以参考以下图表:

image.png

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>

image.png

如上图相当于是一种层层封装的结构


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;
};


目录
相关文章
|
存储 负载均衡 算法
p2p的文件系统
p2p的文件系统
135 4
|
12月前
|
存储 数据可视化 Linux
文件系统-
文件系统-
72 0
|
存储 缓存 算法
文件系统(上)
文件系统(上)
183 0
|
存储 缓存 算法
文件系统(下)
文件系统(下)
167 0
|
存储 Linux Windows
【文件系统】
【文件系统】
97 0
|
Linux 程序员 Shell
sysfs文件系统与kobject
sysfs文件系统与kobject
154 0
|
Unix Linux 容器
sysfs文件系统(2)
每个内核设备直接或间接嵌入kobject属性。在添加到系统之前,必须使用kobject_ create()函数分配kobject,并将已经分配但尚未初始化的kob ject指针及其kobject_type 指针作为参数。kobject_add()函数用于添加kobject并将其链接到系统,同时根据其层次结构创建目录及其默认属性。功能与之相反的函数是kobject_ del(),将kobject删除链接
115 0
|
存储 Unix Linux
|
存储 Linux 内存技术
文件系统
文件系统
129 0