sysfs 文件系统详解

Linux 文件系统与设备文件系统 (二)—— sysfs 文件系统与Linux设备模型 提到 sysfs 文件系统 ,必须先需要了解的是Linux设备模型,什么事Linux设备模型呢? 一、Linux 设备模型 1、设备模型概述      从2.6版本开始,Linux开发团队便为内核建立起一个统一的设备模型。在以前的内核中没有独立的数据结构用来让内核获得系统整体配合的信息。尽管缺乏这些信息,在多数情况下内核还是能正常工作的。然而,随着拓扑结构越来越复杂,以及要支持诸如电源管理等 阅读详情

sysfs是用于表现设备驱动模型的文件系统,它基于ramfs。要学习linux的设备驱动模型,就要先做好底层工作,总结sysfs提供给外界的API就是其中之一。sysfs文件系统中提供了四类文件的创建与管理,分别是目录、普通文件、软链接文件、二进制文件。目录层次往往代表着设备驱动模型的结构,软链接文件则代表着不同部分间的关系。比如某个设备的目录只出现在/sys/devices下,其它地方涉及到它时只好用软链接文件链接过去,保持了设备唯一的实例。而普通文件和二进制文件往往代表了设备的属性,读写这些文件需要调用相应的属性读写。

    sysfs是表现设备驱动模型的文件系统,它的目录层次实际反映的是对象的层次。为了配合这种目录,linux专门提供了两个结构作为sysfs的骨架,它们就是struct kobject和struct kset。我们知道,sysfs是完全虚拟的,它的每个目录其实都对应着一个kobject,要想知道这个目录下有哪些子目录,就要用到kset。从面向对象的角度来讲,kset继承了kobject的功能,既可以表示sysfs中的一个目录,还可以包含下层目录。对于kobject和kset,会在其它文章中专门分析到,这里简单描述只是为了更好地介绍sysfs提供的API。

    sysfs模块提供给外界的接口完全展现在include/linux/sysfs.h中。

  1. struct attribute {  
  2.     const char      *name;  
  3.     struct module       *owner;  
  4.     mode_t          mode;  
  5. };  
  6.   
  7. struct attribute_group {  
  8.     const char      *name;  
  9.     mode_t          (*is_visible)(struct kobject *,  
  10.                           struct attribute *, int);  
  11.     struct attribute    **attrs;  
  12. };  

之前说过普通文件是kobject目录的属性展现。struct attribute就是属性的通用结构,其它部分在使用时还可以把struct attribute内嵌到更大的属性结构中。struct attribute_group是提供一组属性的集合,这样集中的管理更为方便。

  1. #define __ATTR(_name,_mode,_show,_store) { \  
  2.     .attr = {.name = __stringify(_name), .mode = _mode },   \  
  3.     .show   = _show,                    \  
  4.     .store  = _store,                   \  
  5. }  
  6.   
  7. #define __ATTR_RO(_name) { \  
  8.     .attr   = { .name = __stringify(_name), .mode = 0444 }, \  
  9.     .show   = _name##_show,                 \  
  10. }  
  11.   
  12. #define __ATTR_NULL { .attr = { .name = NULL } }  
  13.   
  14. #define attr_name(_attr) (_attr).attr.name  

以上的宏是为了静态初始化属性时更为方便,我们简单将其忽略。

  1. struct bin_attribute {  
  2.     struct attribute    attr;  
  3.     size_t          size;  
  4.     void            *private;  
  5.     ssize_t (*read)(struct kobject *, struct bin_attribute *,  
  6.             char *, loff_t, size_t);  
  7.     ssize_t (*write)(struct kobject *, struct bin_attribute *,  
  8.              char *, loff_t, size_t);  
  9.     int (*mmap)(struct kobject *, struct bin_attribute *attr,  
  10.             struct vm_area_struct *vma);  
  11. };  

struct attribute是通用的属性结构,而struct bin_attribute就是为二进制属性专门设计的,它在sysfs中表现为二进制文件,大多数是设备配置参数的映射。struct bin_attribute恰恰就是把struct attribute内嵌到更大结构的样例。

  1. struct sysfs_ops {  
  2.     ssize_t (*show)(struct kobject *, struct attribute *,char *);  
  3.     ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t);  
  4. };  

struct sysfs_ops中包含show和store两个函数指针,它们分别在sysfs文件读和文件写时调用。

  1. int sysfs_schedule_callback(struct kobject *kobj, void (*func)(void *),  
  2.                 void *data, struct module *owner);  

sysfs_schedule_callback()会创建一个工作队列,稍后调用func(data)。本来sysfs中的属性读写函数是无法删除属性文件或者kobject目录的,因为调用函数时是加锁的,要删除也需要加锁。但这里可以通过工作队列回调的方式实现。

  1. int __must_check sysfs_create_dir(struct kobject *kobj);  
  2. void sysfs_remove_dir(struct kobject *kobj);  
  3. int __must_check sysfs_rename_dir(struct kobject *kobj, const char *new_name);  
  4. int __must_check sysfs_move_dir(struct kobject *kobj,  
  5.                 struct kobject *new_parent_kobj);  

sysfs_create_dir()创建一个kobject对应的目录,目录名就是kobj->name。

sysfs_remove_dir()删除kobj对应的目录。删除一个目录也会相应地删除目录下的文件及子目录。

sysfs_rename_dir()修改kobj对应目录的名称。

sysfs_move_dir()将kobj对应的目录移到new_parent_kobj对应的目录下。

 

  1. int __must_check sysfs_create_file(struct kobject *kobj,  
  2.                    const struct attribute *attr);  
  3. int __must_check sysfs_chmod_file(struct kobject *kobj, struct attribute *attr,  
  4.                   mode_t mode);  
  5. void sysfs_remove_file(struct kobject *kobj, const struct attribute *attr);  

sysfs_create_file()在kobj对应的目录下创建attr对应的属性文件。

sysfs_chmod_file()修改attr对应的属性文件的读写权限。

sysfs_remove_file()在kobj对应的目录下删除attr对应的属性文件。

 

  1. int __must_check sysfs_create_bin_file(struct kobject *kobj,  
  2.                        struct bin_attribute *attr);  
  3. void sysfs_remove_bin_file(struct kobject *kobj, struct bin_attribute *attr);  

sysfs_create_bin_file()在kobj目录下创建attr对应的二进制属性文件。

sysfs_remove_bin_file()在kobj目录下删除attr对应的二进制属性文件。

  1. int __must_check sysfs_create_link(struct kobject *kobj, struct kobject *target,  
  2.                    const char *name);  
  3. int __must_check sysfs_create_link_nowarn(struct kobject *kobj,  
  4.                       struct kobject *target,  
  5.                       const char *name);  
  6. void sysfs_remove_link(struct kobject *kobj, const char *name);  

sysfs_create_link()在kobj目录下创建指向target目录的软链接,name为软链接文件名称。

sysfs_create_link_nowarn()与sysfs_create_link()功能相同,只是在软链接文件已存在时不会出现警告。

sysfs_remove_link()删除kobj目录下名为name的软链接文件。

  1. int __must_check sysfs_create_group(struct kobject *kobj,  
  2.         const struct attribute_group *grp);  
  3. int sysfs_update_group(struct kobject *kobj,  
  4.          const struct attribute_group *grp);  
  5. void sysfs_remove_group(struct kobject *kobj,  
  6.    const struct attribute_group *grp);  
  7. int sysfs_add_file_to_group(struct kobject *kobj,  
  8.    const struct attribute *attr, const char *group);  
  9. void sysfs_remove_file_from_group(struct kobject *kobj,  
  10.    const struct attribute *attr, const char *group);  

sysfs_create_group()在kobj目录下创建一个属性集合,并显示集合中的属性文件。如果文件已存在,会报错。

sysfs_update_group()在kobj目录下创建一个属性集合,并显示集合中的属性文件。文件已存在也不会报错。sysfs_update_group()也用于group改动影响到文件显示时调用。

sysfs_remove_group()在kobj目录下删除一个属性集合,并删除集合中的属性文件。

sysfs_add_file_to_group()将一个属性attr加入kobj目录下已存在的的属性集合group。

sysfs_remove_file_from_group()将属性attr从kobj目录下的属性集合group中删除。

 

  1. void sysfs_notify(struct kobject *kobj, const char *dir, const char *attr);  
  2. void sysfs_notify_dirent(struct sysfs_dirent *sd);  

sysfs_notify()和sysfs_notify_dirent()都是用来唤醒在属性文件上调用select()或poll()而阻塞的用户进程。

  1. struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd,  
  2.                       const unsigned char *name);  
  3. struct sysfs_dirent *sysfs_get(struct sysfs_dirent *sd);  
  4. void sysfs_put(struct sysfs_dirent *sd);  

sysfs_get()增加目录或文件的引用计数。

sysfs_put()减少目录或文件的引用计数,并在降为零时删除相应的文件或目录,这种删除又会减少上层目录的引用计数。

sysfs_get_dirent()是增加目录parent_sd中名为name的目录或文件的引用计数。

虽然同样是引用计数,同样在降为零时有删除动作,但却并非使用kref。这种操作更多地继承了文件系统管理时的传统。

  1. void sysfs_printk_last_file(void);  
  2. int __must_check sysfs_init(void);  

sysfs_printk_last_file()是在sysfs崩溃时打印最后一个访问到的文件路径。

sysfs_init()是在sysfs模块初始化时调用的。

这两个函数都与我们没有什么关系。

Sysfs_notify唤醒调用epoll的用户面进程 (Sysfs_notify唤醒用户面进程) 用户进程通过select、poll、epoll监测属性文件,当被监测的属性文件未发生改变时,进程被阻塞;内核通过调用sysfs_notify、sysfs_notify_dirent来唤醒被阻塞的用户面进程。这是linux操作系统中一种很有用的、内核与用户面进程之间的异步通信机制 阅读详情

相关推荐

sysfs相关API详解及实例分析

这里定义了一个属性数组my_attributes,将其中的my_attribute属性添加到数组中,然后设置kobj_type结构体的sysfs_ops字段为my_sysfs_ops结构体,表示使用自定义的读写函数,同时设置default_attrs字段为my_attributes,表示使用自定义的属性数组。该函数用于将数据写入sysfs文件系统中的一个文件,其中file表示要写入的文件,buf表示缓冲区地址,count表示要写入的字节数,ppos表示文件偏移量。

qq_37934722的博客 245

linux 读sysfs文件,Linux设备模型(4)_sysfs

Linux设备模型(4)_sysfs作者:wowo 发布于:2014-3-14 18:31分类:统一设备模型1. 前言sysfs是一个基于RAM的文件系统,它和Kobject一起,可以将Kernel的数据结构导出到用户空间,以文件目录结构的形式,提供对这些数据结构(以及数据结构的属性)的访问支持。sysfs具备文件系统的所有属性,而本文主要侧重其设备模型的特性,因此不会涉及过多的文件系统实现细节,...

weixin_42549451的博客 518

Appsflyer S2S事件上报实战:从参数获取到避坑指南(附Firebase对比)

本文详细解析了Appsflyer S2S事件上报的实战技巧,包括核心参数获取、测试环境搭建、生产环境最佳实践以及高级场景处理。通过对比Firebase的事件上报机制,帮助开发者高效避坑并优化数据上报流程,提升应用分析与营销效果。

egg99的博客 884

Linux 内核/sys 文件系统之sysfs 属性文件

<br />以上所举的例子仅仅是一些常见的 sysfs 属性用法,实际的系统中还常常有很多其它的从未见过的 sysfs 属性,因此只有举例是不够的,即使维护了一份 sysfs 属性用法参考大全也不够,未来的内核版本还会出现新的 sysfs 属性,因此还必须了解 Linux 内核代码以找到实现这些属性的代码位置,以学会在没有相应属性文档的情况从内核源代码来分析其 sysfs 属性功能。<br />    Sysfs 源码分析和编程实践<br />    从源代码中理解 sysfs 属性的用途<br />   

嵌入精灵 1987

Sentaurus TCAD 实战指南:几何、掺杂与物理模型对Ion/Ioff的协同调控

本文详细介绍了Sentaurus TCAD在器件仿真中的实战应用,重点解析了Ion(开态电流)与Ioff(关态电流)的协同优化方法。通过几何结构设计、掺杂工程和物理模型选择三大要素的精细调整,实现器件性能的显著提升。文章结合28nm和7nm工艺案例,展示了如何平衡Ion与Ioff的矛盾关系,为TCAD工程师提供实用指导。

weixin_29159711的博客 134

【VMware篇】7-通过ISO镜像升级VMware Esxi

本文主要介绍Dell服务器上安装的ESXi升级的方法之一(采用ISO升级)。

chen_yunan的博客 5511

Linux设备模型分析之(三):sysfs

sysfs是一个基于RAM的文件系统,它和kobject一起,可以将kernel的数据结构导出到用户空间,以文件目录结构的形式,提供对这些数据结构(以及数据结构的属性)的访问支持。 sysfs目录 前面提到过,一个kobject,对应sysfs中的一个目录。因此在注册kobject添加到kernel时,会调用sysfs文件系统的创建目录接口,创建与kobject对应的目录: 创建sysfs目录,实际上就是创建kobject对应的sysfs目录项,并与父kobject的sysfs目录项建立关系。 在系统中

m0_46525308的博客 1404

【推荐100个unity插件】基于节点的程序化无限地图生成器 —— MapMagic 2

MapMagic 2是一款基于节点的程序化地形生成工具,可快速创建无限地图。主要功能包括:通过图形化节点编辑器构建地形逻辑;支持四个核心模块(对象、样条线、生物群落和笔刷);提供完整的操作指南,包括创建资产、使用编辑器窗口、节点操作等。工具具有直观的UI界面,支持节点连接、参数调整、图层管理等功能,并能实时生成地形。适合游戏开发者快速构建高质量的可玩地形环境。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3117

sysfs 文件系统

sysfs 是一个基于内存的文件系统, 同 devfs、 proc 文件系统一样,称为虚拟文件系统;它的作用是。sysfs 文件系统的主要功能便是对系统设备进行管理,它可以产生一个包含所有系统硬件层次的视图。sysfs 文件系统把连接在系统上的组织成为一个分级的文件、 展示设备驱动模型中各组件的层次关系。

weixin_58038211的博客 1030

基于YOLOv13+CBAM注意力机制

本教程详细介绍了CBAM注意力机制的原理及其在YOLOv13中的集成方法。CBAM通过通道注意力和空间注意力两个模块,动态调整特征权重以增强模型性能。通道模块利用池化操作和共享MLP生成通道权重,空间模块则通过池化和卷积生成空间权重。教程提供了在YOLOv13中实现CBAM的具体步骤,包括模块代码定义、模型配置修改等关键环节,帮助开发者在目标检测任务中提升模型表现。

FJN110的博客 305

【数据集】中国各类水文专业常用数据集合集

对中国各类水文专业常用数据集进行整理并总结

WW、forever的博客 9298

Linux sysfs虚拟文件系统

测试环境:Linux dev-PC 5.18.17-amd64-desktop-hwe #20.01.00.10 SMP PREEMPT_DYNAMIC Thu Jun 15 16:17:50 CST 2023 x86_64 GNU/Linuxsysfs虚拟文件系统是随着linux统一设备驱动模型一起诞生的。这个新的设备模型是为了对计算机上的所有设备进行统一地表示和操作,包括设备本身设备之间的连接关系。

czw 991

2026年摩尔线程数字IC面试试卷带答案

本文摘要: 该试卷为数字IC设计笔试,满分120分,时长90分钟,包含单选题、波形分析题、多选题和代码设计题。重点考察时序约束(如set_false_path)、建立/保持时间、逻辑化简、复位机制、AXI协议、半导体工艺、状态机、GPU架构等核心知识点。多选题涉及异步FIFO设计、Verilog综合、亚稳态处理、C++关键字和低功耗技术。代码题要求实现单比特信号去毛刺电路,需稳定4个时钟周期才输出。试题解析详细,标注了企业面试高频考点,如摩尔线程自研的MUSA架构和花港GPU架构特点。整体内容专业性强,覆盖

Open 98

伪文件系统sysfs

sysfs文件系统是一个伪文件系统,类似这种类型的文件系统还有proc、ramfs、tempfs等。他们的一个特点就是并不是基于物理磁盘的,而是基于内存的。这里除了sysfs很重要之外,还有一个proc文件系统也比较重要,proc文件系统主要是用来管理内核的重要数据的。

qq_49668258的博客 1112

从一个 ASIN 看透亚马逊:商品模型背后的增长飞轮

在亚马逊电商体系中,每件商品背后都有一套严密的商品建模逻辑。本篇文章以“ASIN 的一生”为线索,系统拆解了亚马逊的商品模型:从飞轮战略出发,剖析 SDP(Single Detail Page)机制如何实现标准化展示;再到 ASIN 编码、父子变体结构与 Offer 分离模型,逐层解析商品信息如何被建构、聚合与呈现。通过图解与案例,文章帮助读者理解商品建品流程、同款聚合原则、价格控制机制等核心逻辑,避免常见运营误区,是一份面向运营、产品、技术人员的实用参考指南。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 13万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

sysfs文件系统简述

当然跟设备驱动具体的实现方式有关,通常情况下,一般简单地设备会使用 sysfs 方式操控,其设备驱动在实现时会将设备的一些属性导出到用户空间 sysfs 文件系统,以属性文件的形式为用户空间提供对这些数据、属性的访问支持,譬如 LED、GPIO 等。编译为内联方式的模块则只在当他有非0属性的模块参数时会出现的对应的 /sys/module// ,这些模块的可用参数会出现在 /sys/module//parameter/中。

奶牛养殖场小马 1694

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【Linux】sysfs文件系统

理解和掌握实践sysfs文件系统。

希希雾里 2487

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Linux驱动开发笔记(十三)Sysfs文件系统

前面章节驱动学习中,我们测试驱动时经常使用/sys目录下文件,我们本章就简单介绍下Sysfs文件系统。

sincerelover的博客 3683

Linux 浅析sysfs文件系统

之说以想谈谈linux的sysfs文件系统,因为前不久写了一篇关于proc文件系统的文章,所以就顺带整理一下sysfs文件系统,那么啥事sysfs文件系统?sysfs文件系统为用户空间程序提供了一个直观和方便的方式来访问和控制内核中的设备和驱动程序信息,是Linux系统中设备管理和驱动程序开发的重要工具。设备和驱动程序信息:sysfs将设备和驱动程序的信息以文件的形式组织起来,每个设备或驱动程序都有一个对应的目录,目录下的文件表示其属性。结构组织:sysfs采用层次化的目录结构,反映了内核对象之间的关系。

hezhensheng007的专栏 590

sysfs文件系统

sysfs是一个基于内存的文件系统,它的作用是将内核信息以文件的方式提供给用户程序使用。该文件系统的目录层次结构严格按照内核的数据结构组织。除了二进制文件外(只有特殊场合才使用),sysfs文件内容均以ASCII格式保存,且一个文件只保存一个数据,另外,一个文件不可大于一个内存页(通常为4096字节)。

Sean's Blog 1万+

内存文件系统——sysfs

sysfs是一个内存虚拟文件系统,提供了一个kobject层次结构的视图。sysfs根目录下包含至少10个目录: l block:该目录包含了系统中注册的每个块设备对应的目录。这些目录中包含了块设备的任何分区。 l bus:该目录提供了系统总线的一个视图。 l class:该...

chijiandao3197的博客 321

linux 读sysfs文件,sysfs 文件系统

Sysfs 是Linux 2.6所提供的一种虚拟文件系统。这个文件系统不仅可以把设备(devices)和驱动程序(drivers)的信息从内核输出到用户空间,也可以用来对设备和驱动程序做设置。一、初识sys 文件系统简单的说,sysfs是一个基于内存的文件系统,它的作用是将内核信息以文件的方式提供给用户程序使用。sysfs可以看成与proc,devfs和devpty同类别的文件系统,该文件系统是虚...

weixin_42514222的博客 607
上一篇: 带参数的main函数
下一篇: C函数调用与堆栈的变化
计算机与认知
博客等级 码龄14年 31粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值