Linux驱动开发笔记(十三)Sysfs文件系统
文章目录
- 前言
- 一、Sysfs
- 1.1 Sysfs的引入
- 1.2 Sysfs的目录结构
- 1.2 Sysfs的目录详解
- 1.2.1 devices
- 1.2.2 bus
- 1.2.3 class
- 1.2.4 devices、bus、class目录之间的关系
- 1.2.5 其他子目录
- 二、Sysfs使用
- 2.1 核心数据结构
- 2.2 相关函数
- 2.2.1 kobject_create_and_add
- 2.2.2 kobject_put()
- 2.2.3 kobject_get()
- 2.2.4 sysfs_create_file
- 2.3 设计思路
前言
前面章节驱动学习中,我们测试驱动时经常使用/sys目录下文件,我们本章就简单介绍下Sysfs文件系统。
一、Sysfs
1.1 Sysfs的引入

sysfs则是Linux内核中的一种特殊虚拟文件系统,它用来向用户空间提供内核设备和驱动程序的信息。因此,sysfs是一种具体的文件系统实现,它利用了VFS提供的抽象接口来展示内核数据。Sysfs在Linux内核2.6版本中引入,旨在替代和扩展早期的proc文件系统。它提供了一种统一的接口,用于查看和操作设备、驱动程序、文件系统等内核对象。Sysfs采用层次化的目录结构,反映了内核对象之间的关系,目录和文件分别表示内核对象及其属性。
内核对象(如设备、驱动程序等)在sysfs中被表示为目录,目录下的文件表示对象的属性。这些文件通常是只读的,但有些也可以通过写操作进行配置。
通过sysfs,用户可以统一地访问不同类型的内核信息,而不需要关心底层实现细节。Sysfs内容会随着系统硬件配置的变化动态更新。例如,插拔设备会导致相应的sysfs目录和文件创建或删除。
1.2 Sysfs的目录结构
Sysfs文件系统是一种虚拟文件系统,也就是文件系统中文件不对应硬盘上任何文件,存在于内存中,其通常挂载在/sys目录下,主要目录包括:
/sys/devices:表示系统中的物理设备,每个子目录对应一个设备。
/sys/class:表示系统中的设备类别(如网络设备、块设备等),子目录按类别分类。
/sys/block:表示块设备(如硬盘、USB存储设备等)。
/sys/bus:表示系统总线类型(如PCI、USB等),每个子目录对应一个总线。
/sys/kernel:表示内核参数和信息,如调度器参数、内核模块等。
/sys/module:表示加载的内核模块,每个子目录对应一个模块,包含模块参数和状态信息。
Sysfs是通过内核中的对象模型(kobject)实现的。每个kobject都可以在sysfs中创建一个对应的目录,kobject的属性(kobj_attribute)则映射为sysfs中的文件。通过定义和注册kobject和kobj_attribute,内核模块可以在sysfs中创建自己的条目。这些目录是在子系统注册kobject核心的系统启动时刻产生的, 当它们被初始化以后, 它们开始搜寻在各自的目录内注册了的对象。 一个kobject对应一个目录,包含的对象属性对应一个文件,文件只支持 目录、 普通文件 (文本或二进制文件)和 符号链接文件三种类型。
1.2 Sysfs的目录详解
1.2.1 devices
devices目录反映系统中所有物理设备及其层次结构,设备按照硬件拓扑结构组织,表示设备的物理连接关系。/sys/devices是内核对系统中所有设备的分层次表达模型, 也是/sys文件系统管理设备的最重要的目录结构。其目录结构如下:
- 系统设备:如 CPU、系统内存等。
- 总线设备:例如 PCI、USB、SCSI 等设备。
- 虚拟设备:如虚拟网络设备。
1.2.2 bus
bus目录包含系统中所有已注册总线类型的子目录,每个子目录表示一种总线类型,例如 PCI、USB、I2C 等。这里是设备按照总线类型分层放置的目录结构, 每个子目录(总线类型)下包含两个子目录——devices和drivers文件夹;其中devices下是该总线类型下的所有设备, 而这些设备都是符号链接,它们分别指向真正的设备(/sys/devices/下);如下图bus下的usb总线中的device则是Devices目 录下/pci()/dev 0:10/usb2的符号链接。而drivers下是所有注册在这个总线上的驱动,每个driver子目录下 是一些可以观察和修改的driver参数。其目录结构如下:
- devices:列出所有连接到该总线的设备。
- drivers:列出与该总线相关的所有驱动程序。
- drivers_autoprobe 和 drivers_probe:用于自动或手动驱动程序绑定。
- uevent:用于触发 uevent 事件。
1.2.3 class
class 目录按设备类型对设备进行分类,每个子目录表示一种设备类型,例如网络设备、块设备、字符设备等。其目录结构如下:
- net:表示所有网络接口。
- block:表示所有块设备。
- tty:表示所有终端设备。
注:大家可能注意到在/sys/class目录下也存在一个block子目录,这是由于历史遗留因素而导致的。 块设备现在是已经移到/sys/class/block, 旧的接口/sys/block为了向后兼容保留存在,现在该目录下的都是链接文件
1.2.4 devices、bus、class目录之间的关系

- /sys/devices 目录表示设备的物理连接和层次结构,而 /sys/class 目录按设备功能或类型对设备进行逻辑分类。
- /sys/bus 目录表示系统中的各种总线类型,每种总线都有一个子目录,包含该总线上的设备(链接到 /sys/devices)和驱动程序信息。
- /sys/devices 中的设备可能会在 /sys/bus/<bus_type>/devices 下有一个符号链接,反映设备与总线的关系。/sys/class 提供了按设备类型的视图,使用户能够方便地找到特定类型的设备,而无需了解设备的具体物理连接位置。
以USB 存储设备插入系统为例,以下是目录之间关系的具体示例:
//表示 USB 存储设备的物理连接路径
ls /sys/devices/pci0000:00/0000:00:14.0/usb1/1-1//目录中包含指向上述设备的符号链接,表示它是一个 USB 设备
ls /sys/bus/usb/devices//目录中包含该设备的逻辑分类信息,表示它是一个块设备
ls /sys/class/block/sda

1.2.5 其他子目录
在Sysfs文件系统中最重要的就是以上三个子目录,其他子目录我们简单了解即可。
firmware目录
该目录包含具有固件对象和属性的子目录,关于内核的固件加载和firmware驱动,有兴趣可以自己去了解下。其目录结构如下:
- devicetree:描述加载设备树信息,根节点对应base目录,每一个设备树节点对应一个目录,每个属性对应一个文件
- fdt:原始dtb文件,是uboot传给内核的设备树文件,可以使用hexdump -C查看
fs目录
这里按照设计是用于描述系统中所有文件系统,包括文件系统本身和按文件系统分类存放的已挂载点,描述已注册的文件系统视图, 但目前只有 fuse,ext4 等少数文件系统支持 sysfs 接口,一些传统的虚拟文件系统(VFS)层次控制参数仍然在sysctl(/proc/sys/fs) 接口中。
kernel目录
该目录是内核所有可调整参数的位置,有些内核可调整参数仍然位于sysctl(/proc/sys/kernel)接口中。
module目录
该目录有系统中所有模块的信息,不论这些模块是以内联(inlined)方式编译到内核映像文件(vmlinuz)中还是编译为外部模块(.ko文件), 都可能会出现在/sys/module目录下。
编译为外部模块(.ko文件)在加载后,会/sys/module/出现对应的模块文件夹,在这个文件夹下会出现一些属性文件和属性目录, 表示此外部模块的一些信息,如版本号、加载状态、所提供的驱动程序等。
编译进内核的模块则只在当它有非0属性的模块参数时会出现对应的/sys/module/, 这些模块的可用参数会出现在/sys/modules/parameters/中, 如:/sys/module/printk/parameters/time 这个可读写参数控制着内联模块printk在打印内核消息时是否加上时间前缀。
power目录
该目录下是系统中电源选项,包含电源管理子系统提供的统一接口文件。 一些属性文件可以用于控制整个机器的电源状态,如可以向其中写入控制命令进行关机、重启等操作。
二、Sysfs使用
2.1 核心数据结构
kobject是 Linux内核中的一个核心数据结构,用于表示内核中的对象并支持内核对象的引用计数、生命周期管理和对象间关系管理。它主要用于内核的设备模型(device model)以及 sysfs 文件系统的实现。kobject 提供了一个通用的机制来管理对象,这样不同的子系统可以共享一些通用的代码来处理对象。
struct kobject {const char *name;struct list_head entry;struct kobject *parent;struct kset *kset;struct kobj_type *ktype;struct kernfs_node *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;
};
- 关键成员解释
- name:kobject 的名字,用于在 sysfs 文件系统中表示对象的名字。
- parent:指向父对象的指针,用于形成层次结构,表示对象之间的包含关系。
- kref:内核引用计数机制的对象,用于确保 kobject 在引用计数为零之前不会被释放。
- ktype:指向 kobj_type 结构体的指针,kobj_type 定义了 kobject 的特定操作,如释放函数、sysfs 文件操作等。
- kset:指向 kset 结构体的指针,一个 kset 是一组相关 kobject 的集合,可以用来组织和管理一组相关的对象。
- sd:指向 kernfs_node 结构体的指针,表示 sysfs 中的目录项。
- state_initialized 等标志位:用于跟踪对象的状态,如是否已初始化、是否已添加到 sysfs 中等。
kobj_attribute是一个用于为kobject(内核对象)创建属性的结构体。这些属性可以通过sysfs文件系统进行读取或写入,sysfs提供了一种机制,让内核子系统、设备驱动程序和其他内核模块可以向用户空间导出信息。kobj_attribute结构体定义在linux/kobject.h中,包含以成员:
- struct attribute attr: 一个通用的属性结构体,包含属性的名称和权限模式。
- ssize_t (*show)(struct kobject *kobj, struct kobj_attribute *attr, char *buf): 指向显示方法的函数指针,当读取属性时调用该方法。
- ssize_t (*store)(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count): 指向存储方法的函数指针,当写入属性时调用该方法。
__ATTR宏用于方便地定义struct attribute类型的结构体成员。它通常与kobj_attribute结构体一起使用,来定义sysfs属性。
#define __ATTR(_name, _mode, _show, _store) { \.attr = { .name = __stringify(_name), .mode = _mode }, \.show = _show, \.store = _store, \
}
- 参数说明
- _name:属性的名称。
- _mode:属性的权限模式,如0644,表示所有者可读写,组和其他用户可读。
- _show:指向显示函数的指针,该函数在读取属性时被调用。
- _store:指向存储函数的指针,该函数在写入属性时被调用。
2.2 相关函数
更多的函数可以参考内核源码include/linux/sysfs.h文件。
2.2.1 kobject_create_and_add
//函数用于创建、初始化并将kobject添加到系统中
struct kobject *kobject_create_and_add ( const char *name, struct kobject *parent);
- 参数
- name:创建kobj的名字
- parent:指定父kobject,实际就是在那个目录下创建一个目录。比如为kernel_kobj,将在/sys/kernel目录下创建目录,如果为NULL,将在/sys下创建。
- 返回值
- 成功:指向新创建并添加的 kobject 结构体的指针
- 失败:NULL
2.2.2 kobject_put()
//用于减少kobject的引用计数,当引用计数降为零时会释放该对象。
void kobject_put(struct kobject *kobj);
- 参数:
- kobj:指向要减少引用计数的 kobject 结构体。
2.2.3 kobject_get()
//用于增加kobject的引用计数
struct kobject *kobject_get(struct kobject *kobj);
- 参数:
- kobj:指向要增加引用计数的 kobject 结构体。
- 返回值:
- 成功:返回 kobj,或者如果 kobj 为 NULL 则返回 NULL。
2.2.4 sysfs_create_file
//创建一个文件
int sysfs_create_file ( struct kobject * kobj, const struct attribute * attr);
- 参数:
- kobj:我们创建的kobject
- attr:属性描述
- 返回值:
- 成功:0
- 错误:错误码
2.3 设计思路
在内核中,创建和使用 kobject 通常需要以下步骤:
- 初始化并添加到 sysfs:使用 kobject_create_and_add函数创建kobject并添加到sysfs文件系统中。
- 增加引用计数:使用 kobject_get() 增加引用计数。
- 减少引用计数并释放:使用 kobject_put() 减少引用计数,当引用计数降到零时,kobject 会被释放。
//示例
#include <linux/kobject.h>
#include <linux/sysfs.h>
#include <linux/module.h>
#include <linux/init.h>static struct kobj_attribute foo_attribute = __ATTR(foo, 0664, foo_show, foo_store);
static struct kobject *example_kobj;static ssize_t foo_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) {return sprintf(buf, "%d\n", 123); // 显示的示例值
}static ssize_t foo_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count) {// 处理存储的示例逻辑int val;sscanf(buf, "%d", &val);printk(KERN_INFO "新值: %d\n", val);return count;
}static int __init example_init(void) {int error;example_kobj = kobject_create_and_add("example_kobject", kernel_kobj);if (!example_kobj)return -ENOMEM;error = sysfs_create_file(example_kobj, &foo_attribute.attr);if (error) {kobject_put(example_kobj);}return error;
}static void __exit example_exit(void) {kobject_put(example_kobj);
}module_init(example_init);
module_exit(example_exit);
MODULE_LICENSE("GPL");
免责声明:本内容部分参考野火科技及其他相关公开资料,若有侵权或者勘误请联系作者。
相关文章:
Linux驱动开发笔记(十三)Sysfs文件系统
文章目录 前言一、Sysfs1.1 Sysfs的引入1.2 Sysfs的目录结构1.2 Sysfs的目录详解1.2.1 devices1.2.2 bus1.2.3 class1.2.4 devices、bus、class目录之间的关系1.2.5 其他子目录 二、Sysfs使用2.1 核心数据结构2.2 相关函数2.2.1 kobject_create_and_add2.2.2 kobject_put()2.2.…...
Numpy array和Pytorch tensor的区别
1.Numpy array和Pytorch tensor的区别 笔记来源: 1.Comparison between Pytorch Tensor and Numpy Array 2.numpy.array 4.Tensors for Neural Networks, Clearly Explained!!! 5.What is a Tensor in Machine Learning? 1.1 Numpy Array Numpy array can only h…...
【面试系列】数据科学家 高频面试题及详细解答
欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、…...
mysql是什么
mysql是什么 是DBMS软件系统,并不是一个数据库,管理数据库 DBMS相当于用户和数据库之间的桥梁,有超过300种不同的dbms系统 mysql是关系型数据库,关系型数据库存储模型很想excel,用行和列组织数据 sql是一门编程语言…...
【软件工程】【22.04】p1
关键字: 软件需求规约基本性质、数据字典构成、内聚程度最高功能内聚、公有属性、RUP实体类、评审、测试序列、软件确认过程、CMMI能力等级 软件需求分类、DFD数据流图组成(实体)、经典详细设计、数据耦合、关联多重性、状态图、黑盒测试、…...
简单说下GPT-4
ChatGPT 4.0,是OpenAI开发的基于GPT-4架构的大型语言模型。它在多个方面相较于前代版本有了显著的改进。以下是从专业角度对ChatGPT 4.0的详解: 架构与训练 1. **架构**:GPT-4采用的是变压器(Transformer)架构&#x…...
力扣第一道困难题《3. 无重复字符的最长子串》,c++
目录 方法一: 方法二: 方法三: 方法四: 没有讲解,但给出了优秀题解 本题链接:4. 寻找两个正序数组的中位数 - 力扣(LeetCode) 话不多说,我们直接开始进行本题的思路解…...
【ai】tx2 nx :ubuntu查找NvInfer.h 路径及哪个包、查找符号
在Ubuntu系统中,你可以使用多种方法来查找某个头文件的路径。这里有几种常用的方法: 使用find命令: find命令是一个非常强大的工具,可以在文件系统中搜索匹配特定条件的文件。例如,如果你想查找名为stdio.h的头文件,可以使用以下命令:bash 复制代码 sudo find / -name …...
C++ 运算符的优先级和结合性表
优先级和结合性表 优先级运算符描述结合性1::作用域解析运算符左到右2() [] . -> --后缀运算符左到右3 -- - ! ~ * & sizeof new delete typeid一元运算符右到左4* / %乘除取模左到右5 -加法和减法左到右6<< >>左移和右移左到右7< < > >关系…...
MySQL中SQL语句的执行过程详解
1. 客户端连接和请求 客户端连接 在MySQL中,客户端连接和请求过程是执行SQL语句的第一步。该步骤主要涉及客户端如何连接到MySQL服务器,以及如何维护和管理客户端与服务器之间的会话。 客户端连接: 连接器(Connector)…...
文心一言4.0免费使用
领取&安装链接:Baidu Comate 领取季卡 视频教程:免费使用文心一言4.0大模型_哔哩哔哩_bilibili 有图有真相 原理:百度comate使用文心一言最新的4.0模型。百度comate目前免费使用,可以借助comate达到免费使用4.0模型目的。 …...
Mongodb安装与配置
Mongodb的下载 这里下载的是MongoDB 7.0.11版本的 首先进入官网:https://www.mongodb.com/ 点击完上面两步后,加载来到该页面,选择自己的版本、系统,是压缩包(zip)还是安装包(msi)。 下载好之后能,来到安装包哪里&a…...
Java校园跑腿小程序校园代买帮忙外卖源码社区外卖源码
🔥校园跑腿与外卖源码揭秘🔥 🚀 引言:为何需要校园跑腿与外卖源码? 在快节奏的校园生活里,学生们对于便捷、高效的服务需求日益增长。校园跑腿和外卖服务成为了解决这一需求的热门选择。然而,…...
MySQL高级-MVCC-基本概念(当前读、快照读)
文章目录 1、MVCC基本概念1.1、当前读1.1.1、创建表 stu1.1.2、测试 1.2、快照读 1、MVCC基本概念 全称Multi-Version Concurrency Control,多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,快照读为MySQL实现MVCC提供了一个…...
kubernetes给指定用户分配调用k8s的api权限
文章目录 概要利用RBAC添加角色权限使用shell命令创建角色权限使用配置文件创建角色权限 调用k8s的api获取k8s账户的token 小结 概要 使用kubernetes部署项目时,有些特殊场景,我们需要在自己创建的pod里面调用k8s的api来管理k8s,但是需要使用…...
无人机的弱点和限制
1.电池和续航能力: 续航时间短:大多数无人机依赖锂电池供电,续航时间通常在30分钟至1小时之间,限制了其长时间任务的执行能力。 能量密度低:现有电池技术的能量密度无法满足长时间飞行需求,需要突破性的发…...
ElementUI的基本搭建
目录 1,首先在控制终端中输入下面代码:npm i element-ui -S 安装element UI 2,构架登录页面,login.vue编辑 3,在官网获取对应所需的代码直接复制粘贴到对应位置 4,在继续完善,从官网添加…...
Modbus TCP与TCP/IP协议间的差异与应用场景
Modbus TCP概述 Modbus协议简介 Modbus是一种专为工业自动化系统设计的通信协议,采用主从模式,即一个主设备(通常是计算机或可编程逻辑控制器)与多个从设备(如传感器、执行器等)进行通信。Modbus协议具有…...
Linux Doxygen快速生成文档
此前写过一篇编写Doxygen格式的注释以用于生成文档,点击以查阅, Doxygen常用语法与字段记录,但是当时用的windows桌面版的doxygen,最近使用ubuntu编写代码想直接使用doxygen生成,故写下此博客 Doxygen Doxygen是一个用于生成软件文档的工具,它可以从代码中提取注释…...
MobPush REST API的推送 API之批量推送
调用验证 详情参见 REST API 概述的 鉴权方式 说明。 频率控制 详情参见推送限制策略的 接口限制 说明。 调用地址 POST http://api.push.mob.com/v3/push/createMulti 推送对象 以 JSON 格式表达,表示一条推送相关的所有信息 字段类型必须说明pushWorkobje…...
腾讯VersaViT:多模态视觉理解新标杆
腾讯VersaViT:多模态视觉理解新标杆 【免费下载链接】VersaViT 项目地址: https://ai.gitcode.com/tencent_hunyuan/VersaViT 导语:腾讯最新发布的多模态视觉编码器VersaViT,通过创新的多任务协同训练策略,同时强化语言介…...
SpringBoot 3.2.0 项目里,如何优雅地引入 Flowable 7.1.0 工作流引擎?
SpringBoot 3.2.0 项目优雅集成 Flowable 7.1.0 工作流引擎实战指南 在微服务架构中引入工作流引擎,往往意味着需要在不破坏现有架构的前提下实现业务流程的自动化管理。本文将深入探讨如何在已具备MyBatis-Plus、Spring Cloud Alibaba等技术栈的SpringBoot 3.2.0项…...
黑客为什么不攻击微信钱包?
黑客为什么不攻击微信钱包? 现在人人手机里都装着微信和支付宝,里面都或多或少存了些钱。怎么从来没听说谁的钱被技术牛逼黑客惦记走? 是黑客没攻击过?还是黑客不敢攻击?其实都不是。阿里巴巴首席风险官郑俊芳就说过&…...
边缘智能部署:AI模型在边缘节点的轻量化改造
边缘智能部署:AI模型在边缘节点的轻量化改造📚 本章学习目标:深入理解AI模型在边缘节点的轻量化改造的核心概念与实践方法,掌握关键技术要点,了解实际应用场景与最佳实践。本文属于《云原生、云边端一体化与算力基建&a…...
【卷积神经网络作业实现人脸的关键点定位功能】
下面是完成这道题目的代码:import os import cv2 import numpy as np import pandas as pd import torch import torch.nn as nn from torch.utils.data import Dataset,DataLoader from torchvision import transforms import matplotlib.pyplot as plt1. 数据集定…...
保姆级教程:在Ubuntu 22.04上从Anaconda到PyTorch,一步步搞定GPU环境(含CUDA 11.7避坑指南)
保姆级教程:在Ubuntu 22.04上从Anaconda到PyTorch,一步步搞定GPU环境(含CUDA 11.7避坑指南) 刚接触深度学习的开发者们,最头疼的往往不是模型设计本身,而是环境搭建这个"拦路虎"。本文将手把手带…...
[具身智能-189]:ROS2的Node通信机制,为硬件的仿真平台与模型算法的分离以及他们之间标准化的通信提供了保障,在嵌入式系统,特别是具身智能开发中,解决“软硬耦合”这一顽疾。
ROS 2 的节点通信机制,本质上就是为了解决“软硬耦合”这一顽疾而生的。 它通过去中心化的架构和标准化的中间件(DDS),让仿真平台(如 Gazebo、Isaac Sim)和模型算法(如导航、感知)能…...
万象视界灵坛惊艳效果展示:同一张宠物图在‘金毛犬’‘幼犬’‘户外玩耍’‘毛发蓬松’多维排序
万象视界灵坛惊艳效果展示:同一张宠物图在"金毛犬""幼犬""户外玩耍""毛发蓬松"多维排序 1. 效果展示开场 今天我要向大家展示万象视界灵坛这个神奇工具的实际效果。它就像一个视觉魔法师,能够深入理解图片中的…...
本地Cookie管理工具:安全导出与高效应用指南
本地Cookie管理工具:安全导出与高效应用指南 【免费下载链接】Get-cookies.txt-LOCALLY Get cookies.txt, NEVER send information outside. 项目地址: https://gitcode.com/gh_mirrors/ge/Get-cookies.txt-LOCALLY 在当今数字化环境中,Cookie作为…...
如何快速解锁AMD 780M APU的完整AI性能?终极优化指南
如何快速解锁AMD 780M APU的完整AI性能?终极优化指南 【免费下载链接】ROCmLibs-for-gfx1103-AMD780M-APU ROCm Library Files for gfx1103 and update with others arches based on AMD GPUs for use in Windows. 项目地址: https://gitcode.com/gh_mirrors/ro/…...
