sys中目录和文件的建立以及与驱动的交互

embedded/2025/1/31 18:23:42/

sys目录是利用Linux的sysfs特殊文件系统创建的,用于在用户态展示设备信息等内核数据。在sys中建立目录和文件涉及以下内容:

sysfs文件系统初始化

sysfs文件系统通过 sysfs_init 函数完成注册和初始化,其主要操作包括:

  1. 使用 kmem_cache_create 创建一个名为 sysfs_dir_cache 的memory cache对象,用于后续申请内存。
  2. 调用 sysfs_inode_init 进行inode相关初始化。
  3. 通过 register_filesystem 将sysfs文件系统插入到文件系统的总链表中。
  4. 利用 kern_mount 为sysfs文件系统创建一个vfsmount对象、根dentry和根inode结构。

具体目录和文件的创建

在驱动开发等场景下,可通过特定函数在sys目录下创建目录和文件:

  • 创建目录:可使用 kobject_create_and_add 函数在 /sys 下创建目录。该函数会创建一个kobject,并将其添加到sysfs文件系统中,从而在sys目录下呈现出对应的目录。
  • 创建文件:通常使用 sysfs_create_group 函数来创建文件。它可以将一组属性(对应文件)与特定的kobject关联起来,进而在sys目录中该kobject对应的目录下创建出相应文件。

此外,sys目录下的内容与内核中的设备模型等紧密相关。随着设备的插拔、驱动的加载卸载等操作,sys目录下的目录和文件会动态地创建、更新或消失。例如,当系统检测到新设备插入时,会在内核中创建对应的设备对象,并在sys目录的相关位置(如 /sys/devices 等)创建相应的目录和文件来展示设备信息;加载驱动模块时,也可能会在sys中创建特定的目录和文件以提供驱动相关信息。

在Linux系统中,sysfs文件系统与驱动程序之间存在着紧密的联系,操作sysfs文件可以触发驱动中的相应动作,主要体现在以下几个方面:

属性文件与驱动数据交互

  • 从驱动向sysfs输出数据:驱动程序可以通过 sysfs_create_file 等函数在sysfs中创建属性文件,并将设备的相关信息(如设备状态、寄存器值等)通过这些属性文件提供给用户空间。用户读取sysfs中的属性文件时,实际上是调用了驱动中定义的 show 函数,该函数会将驱动内部的数据转换为可读的格式返回给用户。
  • 从sysfs向驱动输入数据:当用户向sysfs中的属性文件写入数据时,会触发驱动中定义的 store 函数。通过这种方式,用户空间可以向驱动程序传递参数,从而控制驱动的行为,如设置设备的工作模式、配置寄存器等。

设备节点与驱动操作关联

  • 设备注册与节点创建:驱动程序在初始化时,会通过 platform_device_register 等函数向系统注册设备。系统会为该设备在sysfs中创建相应的设备节点。这些节点为用户空间提供了操作设备的接口,用户可以通过对这些节点执行 open 、 read 、 write 、 ioctl 等系统调用来与驱动程序进行交互,进而操作设备。
  • 热插拔事件与驱动响应:sysfs中的 uevent 机制用于通知用户空间设备的热插拔事件。当设备插入或拔出时,驱动程序会通过 kobject_uevent 等函数发送相应的热插拔事件。用户空间的 udev 等工具可以监听这些事件,并根据事件类型执行相应的操作,如加载或卸载驱动程序、创建设备节点等。

符号链接与驱动关联

  • 建立驱动与设备的联系:在sysfs中,符号链接可以用于建立驱动与设备之间的关联。例如,在 /sys/bus/platform/drivers/ 目录下,每个驱动都有一个对应的目录,其中包含了指向该驱动所管理设备的符号链接。这些符号链接使得用户可以方便地找到与特定驱动相关的设备,并且可以通过操作这些符号链接来间接操作设备,从而触发驱动中的相应操作。

http://www.ppmy.cn/embedded/158424.html

相关文章

Spark Streaming的背压机制的原理与实现代码及分析

Spark Streaming的背压机制是一种根据JobScheduler反馈的作业执行信息来动态调整Receiver数据接收率的机制。 在Spark 1.5.0及以上版本中,可以通过设置spark.streaming.backpressure.enabled为true来启用背压机制。当启用背压机制时,Spark Streaming会自…

Visual Studio使用GitHub Copilot提高.NET开发工作效率

GitHub Copilot介绍 GitHub Copilot 是一款 AI 编码助手,可帮助你更快、更省力地编写代码,从而将更多精力集中在问题解决和协作上。 GitHub Copilot Free包含哪些功能? 每月 2000 代码补全,帮助开发者快速完成代码编写。 每月 …

第 10 课 Python 内置函数 (增补)

1.enumerate enumerate() 接受一个可迭代对象作为输入,并返回一个枚举对象这个枚举对象包含了原始可迭代对象中的每个元素以及对应的索引它允许在循环中同时获取索引和值,这对于需要索引的情况非常方便 作用:在循环中需要同时访问索引和值时非…

GESP2024年3月认证C++六级( 第三部分编程题(1)游戏)

参考程序&#xff1a; #include <cstdio> using namespace std; const int N 2e5 5; const int mod 1e9 7; int n, a, b, c; int f[N << 1]; int ans; int main() {scanf("%d%d%d%d", &n, &a, &b, &c);f[N n] 1;for (int i n; i…

【Block总结】DynamicFilter,动态滤波器降低计算复杂度,替换传统的MHSA|即插即用

论文信息 标题: FFT-based Dynamic Token Mixer for Vision 论文链接: https://arxiv.org/pdf/2303.03932 关键词: 深度学习、计算机视觉、对象检测、分割 GitHub链接: https://github.com/okojoalg/dfformer 创新点 本论文提出了一种新的标记混合器&#xff08;token mix…

【Go语言圣经】第五节:函数

第五章&#xff1a;函数 5.1 函数声明 和其它语言类似&#xff0c;Golang 的函数声明包括函数名、形参列表、返回值列表&#xff08;可省略&#xff09;以及函数体&#xff1a; func name(parameter-list) (result-list) {/* ... Body ... */ }需要注意的是&#xff0c;函数…

性能优化案例:通过合理设置spark.default.parallelism参数的值来优化PySpark程序的性能

在 PySpark 中&#xff0c;spark.default.parallelism 是一个关键参数&#xff0c;直接影响作业的并行度和资源利用率。 通过合理设置 spark.default.parallelism 并结合数据特征调整&#xff0c;可显著提升 PySpark 作业的并行效率和资源利用率。建议在开发和生产环境中进行多…

F. Ira and Flamenco

题目链接&#xff1a;Problem - F - Codeforces 题目大意&#xff1a;给n,m n个数让从中选m个数满足一下条件&#xff1a; 1.m个数互不相同 2.里面的任意两个数相减的绝对值不能超过m 求这n个数有多少组数据满足。 第一行包含一个整数 t ( 1 ≤ t ≤ 1e4 ) - 测试用例数。 …