LINUX sysfs的使用方法举例

1,sysfs常用到的sys目录:

/sys/devices:表示系统中的物理设备,每个子目录对应一个设备。
/sys/class:表示系统中的设备类别(如网络设备、块设备等),子目录按类别分类。
/sys/block:表示块设备(如硬盘、USB存储设备等)。
/sys/bus:表示系统总线类型(如PCI、USB等),每个子目录对应一个总线。
/sys/kernel:表示内核参数和信息,如调度器参数、内核模块等。
/sys/module:表示加载的内核模块,每个子目录对应一个模块,包含模块参数和状态信息。

代码举例:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/sysfs.h>
#include <linux/kobject.h>

#define TESTDRV_NAME "testdrv"

static int test_value = 42; // 初始化一个全局变量

// sysfs 读取回调函数
static ssize_t testdrv_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
{
    return sprintf(buf, "%d\n", test_value);
}

// sysfs 写入回调函数
static ssize_t testdrv_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count)
{
    int ret;
    ret = sscanf(buf, "%du", &test_value); // 读取用户输入的值
    if (ret != 1)
        return -EINVAL; // 如果转换失败,返回错误
    return count; // 返回写入的字节数
}

// 定义 sysfs 属性
static struct kobj_attribute testdrv_attr = __ATTR(test_value, 0664, testdrv_show, testdrv_store);

// 定义 kobject 和 kset
static struct kobject *testdrv_kobj;

static int __init testdrv_init(void)
{
    int ret;

    // 创建 kobject
    testdrv_kobj = kobject_create_and_add(TESTDRV_NAME, kernel_kobj);
    if (!mydrv_kobj) {
        pr_err("Failed to create kobject\n");
        return -ENOMEM;
    }

    // 创建 sysfs 属性
    ret = sysfs_create_file(testdrv_kobj, &testdrv_attr.attr);
    if (ret) {
        pr_err("Failed to create sysfs file\n");
        kobject_put(testdrv_kobj);
        return ret;
    }

    return 0;
}

static void __exit testdrv_exit(void)
{
    // 删除 sysfs 属性
    sysfs_remove_file(testdrv_kobj, &testdrv_attr.attr);
    // 删除 kobject
    kobject_put(mydrv_kobj);
}

module_init(mydrv_init);
module_exit(testdrv_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple sysfs example module");

代码运行:

root@ubuntu:/home/lark/share/driver/day6/sysfs# make
make -C /lib/modules/5.15.0-125-generic/build/ M=/home/lark/share/driver/day6/sysfs modules
make[1]: Entering directory '/usr/src/linux-headers-5.15.0-125-generic'
  CC [M]  /home/lark/share/driver/day6/sysfs/sysfs.o
  MODPOST /home/lark/share/driver/day6/sysfs/Module.symvers
  CC [M]  /home/lark/share/driver/day6/sysfs/sysfs.mod.o
  LD [M]  /home/lark/share/driver/day6/sysfs/sysfs.ko
  BTF [M] /home/lark/share/driver/day6/sysfs/sysfs.ko
Skipping BTF generation for /home/lark/share/driver/day6/sysfs/sysfs.ko due to unavailability of vmlinux
make[1]: Leaving directory '/usr/src/linux-headers-5.15.0-125-generic'
root@ubuntu:/home/lark/share/driver/day6/sysfs# 
root@ubuntu:/home/lark/share/driver/day6/sysfs# 
root@ubuntu:/home/lark/share/driver/day6/sysfs# ls
Makefile  modules.order  Module.symvers  sysfs.c  sysfs.ko  sysfs.mod  sysfs.mod.c  sysfs.mod.o  sysfs.o
root@ubuntu:/home/lark/share/driver/day6/sysfs# insmod sysfs.ko 
root@ubuntu:/home/lark/share/driver/day6/sysfs# lsmod | grep sysfs
sysfs                  16384  0

测试代码: 

root@ubuntu:/sys/kernel/testdrv# ls
test_value
root@ubuntu:/sys/kernel/testdrv# cat test_value 
42
root@ubuntu:/sys/kernel/testdrv# echo 1 > test_value 
root@ubuntu:/sys/kernel/testdrv# cat test_value 
1

2,字符串举例:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/sysfs.h>
#include <linux/kobject.h>
#include <linux/string.h>

#define STRDRV_NAME "testdrv"
#define STRDRV_ATTR_NAME "test_string"
#define STRDRV_ATTR_SIZE 128

static char test_string[STRDRV_ATTR_SIZE] = "Hello, World!"; // 初始化一个全局字符串变量

// sysfs 读取回调函数
static ssize_t testdrv_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
{
    return scnprintf(buf, STRDRV_ATTR_SIZE, "%s\n", test_string);
}

// sysfs 写入回调函数
static ssize_t testdrv_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count)
{
    if (count >= STRDRV_ATTR_SIZE) {
        return -EINVAL; // 如果写入的数据太长,返回错误
    }

    strncpy(test_string, buf, count); // 复制用户输入的字符串
    test_string[count - 1] = '\0'; // 确保字符串以空字符结尾

    return count; // 返回写入的字节数
}

// 定义 sysfs 属性
static struct kobj_attribute testdrv_attr = __ATTR(test_string, 0664, testdrv_show, testdrv_store);

// 定义 kobject
static struct kobject *strdrv_kobj;

static int __init strdrv_init(void)
{
    int ret;

    // 创建 kobject
    strdrv_kobj = kobject_create_and_add(STRDRV_NAME, kernel_kobj);
    if (!strdrv_kobj) {
        pr_err("Failed to create kobject\n");
        return -ENOMEM;
    }

    // 创建 sysfs 属性
    ret = sysfs_create_file(strdrv_kobj, &testdrv_attr.attr);
    if (ret) {
        pr_err("Failed to create sysfs file\n");
        kobject_put(strdrv_kobj);
        return ret;
    }

    return 0;
}

static void __exit strdrv_exit(void)
{
    // 删除 sysfs 属性
    sysfs_remove_file(strdrv_kobj, &testdrv_attr.attr);
    // 删除 kobject
    kobject_put(strdrv_kobj);
}

module_init(strdrv_init);
module_exit(strdrv_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple sysfs example module for a string attribute");

测试代码 :

root@ubuntu:/sys/kernel/testdrv# cat test_string 
Hello, World!
root@ubuntu:/sys/kernel/testdrv# 
root@ubuntu:/sys/kernel/testdrv# echo welcome > test_string 
root@ubuntu:/sys/kernel/testdrv# 
root@ubuntu:/sys/kernel/testdrv# cat test_string 
welcome
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/918797.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis学习 ——缓存

文章目录 一、Redis缓存的介绍二、Redis缓存问题2.1 缓存穿透2.2 缓存击穿2.3 缓存雪崩2.4 双写一致性2.5 缓存持久化RDBAOF 三、缓存数据管理3.1 数据过期策略3.2 数据淘汰策略 一、Redis缓存的介绍 我们在日常的代码编写中比较少使用到Redis&#xff0c;但是如果涉及到了比较…

【阅读记录-章节2】Build a Large Language Model (From Scratch)

目录 2.Working with text data2.1 Understanding word embeddings2.2 Tokenizing text通过一个简单的实验来理解文本的词元化概念关键概念 2.3 Converting tokens into token IDs实现分词器类&#xff08;Tokenizer Class&#xff09;应用分词器测试文本的编码与解码通过分词器…

etcd部署(基于v3.5.15)

etcd部署 单节点部署下载etcd&#xff0c;解压etcd二进制包&#xff0c;并进入解压后目录创建数据目录移动可执行文件到/usr/local/bin/目录测试版本配置systemd管理启动etcd&#xff0c;设置开机启动验证 集群部署(3节点)环境准备准备3台服务器配置3台服务器hosts配置3台服务器…

HTML5实现趣味飞船捡金币小游戏(附源码)

文章目录 1.设计来源1.1 主界面1.2 游戏中界面1.2 飞船边界框效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/143799554 HTML5实现趣味飞船捡金币小游戏(附源码)&…

ASP.NET Core Webapi 返回数据的三种方式

ASP.NET Core为Web API控制器方法返回类型提供了如下几个选择&#xff1a; Specific type IActionResult ActionResult<T> 1. 返回指定类型&#xff08;Specific type&#xff09; 最简单的API会返回原生的或者复杂的数据类型&#xff08;比如&#xff0c;string 或者…

汽车资讯新动力:Spring Boot技术驱动

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

Go语言跨平台桌面应用开发新纪元:LCL、CEF与Webview全解析

开篇寄语 在Go语言的广阔生态中&#xff0c;桌面应用开发一直是一个备受关注的领域。今天&#xff0c;我将为大家介绍三款基于Go语言的跨平台桌面应用开发框架——LCL、CEF与Webview&#xff0c;它们分别拥有独特的魅力和广泛的应用场景。通过这三款框架&#xff0c;你将能够轻…

如何确保爬取的数据准确性和完整性?

在数据驱动的业务环境中&#xff0c;爬虫程序的准确性和完整性至关重要。本文将探讨如何使用Java编写爬虫程序&#xff0c;并确保其在爬取数据时的准确性和完整性。 1. 精确的HTML解析 确保数据准确性的第一步是精确地解析HTML。Jsoup是Java中常用的HTML解析库&#xff0c;它提…

【linux】如何扩展磁盘容量(VMware虚拟机)-转载

如何扩展磁盘容量(VMware虚拟机) 一、前置准备工作 扩展虚拟机磁盘前&#xff0c;需要先把虚拟机关机才能进行扩展磁盘操作 1.选择虚拟机设置&#xff0c;如下图所示 2.输入你想扩展的磁盘容量&#xff0c;以本次实操为例&#xff0c;我这里输入的30G&#xff08;具体按照实…

esp32学习:windows下idf离线安装(最简单)

很多朋友学习esp32时发现&#xff0c;安装idf很麻烦&#xff0c;需要很多依赖&#xff0c;那有没有简单的方法呢&#xff0c;答案是肯定的. 乐鑫Windows 平台工具链的标准设置 - ESP32-S3 - — ESP-IDF 编程指南 release-v5.0 文档编程指南里提供了windows下离线安装包 dl.espr…

tensorflow案例6--基于VGG16的猫狗识别(准确率99.8%+),以及tqdm、train_on_batch的简介

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 本次还是学习API和如何搭建神经网络为主&#xff0c;这一次用VGG16去对猫狗分类&#xff0c;效果还是很好的&#xff0c;达到了99.8% 文章目录 1、tqdm…

Amazon Web Services (AWS)

一、Amazon Web Services (AWS)介绍 1、简介 2、产品 AWS 提供了各种云计算服务&#xff0c;包括 DynamoDB、S3、EC2、Lambda 等等。 登录aws后点击所有服务也可以看到amazon的所有服务&#xff1a; 3、免费试用产品 除了免费的Amazon Step Functions、Amazon Lambda&#…

Quartus+Nios II for eclipse问题合集

由于对于FPGANIOS II 的工作需要&#xff0c;对工作过程中遇到的问题进行记录&#xff0c;持续更新。 1、BSP directory does not exist: . Stop.Nios II使用过程中遇到的一些问题2_error executing nios2-bsp-generate-files --bsp-di-CSDN博客https://blog.csdn.net/qq_39485…

Java项目:校园宿舍管理系统(优质版)(Springboot3+Maven+Mybatis Plus+Vue3+ Element Plus+Mysql)

项目介绍 : Springboot3MavenMybatis PlusVue3 Element PlusMysql 开发的前后端分离的校园宿舍管理系统 项目演示: https://www.bilibili.com/video/BV16UmoYWEVR/ 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 IDE环境&#x…

RabbitMQ教程:发布/订阅模式(Publish/Subscribe)(三)

文章目录 RabbitMQ教程&#xff1a;发布/订阅模式&#xff08;Publish/Subscribe&#xff09;&#xff08;三&#xff09;一、引言二、简介三、准备工作3.1 说明3.2 生成项目 四、实战4.1 交换机&#xff08;Exchanges&#xff09;4.2 临时队列&#xff08;Temporary Queues&am…

SpringBoot(6)-Shiro

目录 一、是什么 二、准备工作 2.1 环境搭建 2.2 自定义Realm配置类 2.3 自定义shiro配置类 三、实践 3.1 请求拦截 3.2 用户认证 3.3 用户授权 3.4 shiro和thymeleaf整合 一、是什么 是java的一个安全框架 核心三大对象&#xff1a; 1、Subject【用户】 2、Secur…

Misc_01转二维码(不是二进制)

例题ctfhub/隐写v2.0 打开是一张图片 文件分离得到zip&#xff0c;爆破密码得到7878 打开得到0和1&#xff0c; !!!不是二进制转图片&#xff0c;直接是二维码 缩小能看到 000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000…

使用 K-means 算法进行豆瓣读书数据的文本聚类分析

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

STM32完全学习——F407ZGT6点亮LED

一、寄存器描述 我们想要点亮LED&#xff0c;无非就是对于寄存器的一些设置&#xff0c;主要分为两步&#xff0c;首先是需要打开相应GPIO的时钟&#xff0c;这是因为STM32在上电后&#xff0c;每个外设的时钟默认都是关闭的&#xff0c;需要我们手动打开。其次就是对GPIO的一…

Dubbo RPC线程模型

消费端线程模型&#xff0c;提供者端线程模型 消费端线程模型 对 2.7.5 版本之前的 Dubbo 应用&#xff0c;尤其是一些消费端应用&#xff0c;当面临需要消费大量服务且并发数比较大的大流量场景时&#xff08;典型如网关类场景&#xff09;&#xff0c;经常会出现消费端线程…