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


目录
相关文章
|
监控 机器人 API
Spug推送平台:开发者的消息推送神器
Spug推送平台:开发者的消息推送神器 作为开发者,一行代码搞定全渠道推,Spug推送助手场景化功能指南
615 1
|
安全 数据可视化 物联网
智慧园区解决方案:科技赋能,打造未来管理新典范
智慧园区作为城市发展的重要组成部分,借助5G、云计算、大数据、物联网等前沿技术,实现高效、活力、绿色、安全的四大核心目标。通过全场景数字化感知、统一数据模型构建、智能化管控与数据化运营、综合安防管理等手段,提升园区运营效率和管理水平,促进产业升级和可持续发展。
1313 11
|
Java 数据库连接 Apache
Java进阶-主流框架总结与详解
这些仅仅是 Java 众多框架中的一部分。每个框架都有其特定的用途和优势,了解并熟练运用这些框架,对于每一位 Java 开发者来说都至关重要。同时,选择合适框架的关键在于理解框架的设计哲学、核心功能及其在项目中的应用场景。随着技术的不断进步,这些框架也在不断更新和迭代以适应新的开发者需求。
856 1
|
存储 Linux 内存技术
深入理解bootargs
深入理解bootargs
1769 0
|
网络协议 Linux 网络安全
Linux系列——解决ping不通外网的问题
Linux系列——解决ping不通外网的问题
Linux系列——解决ping不通外网的问题
|
设计模式 人工智能 数据库
AI 驱动的开发者(MEAP)(一)(3)
AI 驱动的开发者(MEAP)(一)
433 0
|
Arthas Java 测试技术
Arthas之动态加载类(retransform)
Arthas之动态加载类(retransform)
996 0
|
Dart 开发工具 Android开发
flutter初体验demo踩坑指南
用flutter开发app客户端遇到的各种问题和解决办法
|
数据采集 传感器 算法
ENVI:如何对Landsat8影像进行辐射校正?
ENVI:如何对Landsat8影像进行辐射校正?
1291 0
|
监控 NoSQL IDE
ROS在线调试(使用GDB)
ROS在线调试(使用GDB)
1496 1
ROS在线调试(使用GDB)