sysfs文件系统简述

本文介绍了sysfs文件系统,它用于管理系统设备,将设备和总线组织成分级文件,展示组件层次关系,方便用户空间与内核交互。还阐述了sysfs的目录结构,如devices、bus等目录。此外,说明了应用层操控底层硬件可通过/dev/目录设备文件或/sys/目录属性文件,不同设备适用方式不同。
一 sys 文件系统

sysfs文件系统,是用来对系统的设备进行管理的,它可以产生一个包括所有系统硬件的层级视图。sysfs 文件系统把连接在系统上的设备和总线组织成为一个分级的文件,展示设备驱动模型中各组件的层次关系。用户空间的程序同样可以利用这些信息以实现和内核的交互。

sysfs 提供了一种机制,可以显式的描述内核对象、对象属性及对象间关系,用来导出内核对象(kernel object,如一个硬件设备)的数据、属性到用户空间,以文件目录结构的形式为用户空间提供对这些数据、属性的访问支持。可以简单的理解为 sysfs就是把内核中的硬件模块抽象成sysfs下的一个目录,硬件模块的属性抽象成该目录下的一个属性文件。

二 sysfs 目录结构

sysfs 文件系统与其它文件系统一样,由目录、文件、链接组成。sysfs 文件系统只存在于内存中,动态的表示着内核的数据结构。sysfs 文件系统挂接了一些子目录,这些目录代表了注册在 sysfs 中主要的子系统。

# ls /sys/
block  bus  class  dev  devices  firmware  fs  kernel  module  power

devices : 系统中所有的设备(对象)都会在 /sys/devices体现出来,是sysfs文件系统中最重要的目录结构。

dev:包括所有的块设备和字符设备,该目录下有很多以主设备号:次设备号(major:minor)命名的链接文件,这些文件都链接到 /sys/devices 目录下对应的设备。

ls /sys/dev/char/
	10:130  10:237  10:61  1:11    13:64  1:8    207:16  252:0  254:0  4:10  4:14  4:18  4:21  4:25  4:29  4:32  4:36  4:4   4:43  4:47  4:50  4:54  4:58  4:61  4:8  5:2    7:129  89:0
	10:183  10:58   10:62  116:33  13:65  189:0  207:18  252:1  29:0   4:11  4:15  4:19  4:22  4:26  4:3   4:33  4:37  4:40  4:44  4:48  4:51  4:55  4:59  4:62  4:9  7:0    7:130  89:1
	10:229  10:59   10:63  1:3     1:5    189:1  226:0   253:0  4:0    4:12  4:16  4:2   4:23  4:27  4:30  4:34  4:38  4:41  4:45  4:49  4:52  4:56  4:6   4:63  5:0  7:1    7:2
	10:235  10:60   1:1    13:63   1:7    1:9    251:0   253:1  4:1    4:13  4:17  4:20  4:24  4:28  4:31  4:35  4:39  4:42  4:46  4:5   4:53  4:57  4:60  4:7   5:1  7:128  81:0
	# ls /sys/dev/block/
	1:0  1:10  1:12  1:14  1:2  1:4  1:6  179:0  179:16  179:18  179:32  179:64  1:9  7:1  7:3  7:5  7:7
	1:1  1:11  1:13  1:15  1:3  1:5  1:7  179:1  179:17  179:2   179:48  1:8     7:0  7:2  7:4  7:6

bus: 内核设备按照总线类型分层放置的目录结构,devices中的所有设备都是链接与某种总线之下,在这里的每一种具体总线之下可以找到每一个具体设备的符号链接。
bus 目录包含了在内核中注册而得到支持的每个物理总线的子目录,例如 ide、pci、scsi、usb、i2c、sdio 总线等。

# ls /sys/bus/
clockevents  clocksource  container  cpu  event_source  hid  i2c  mdio_bus  mmc  platform  rpmsg  scsi  sdio  serio  soc  spi  usb  virtio  workqueue

其中每个目录中的结构都大同小异。这里以 usb 目录为例,分析其目录结构关系。

# ls /sys/bus/usb/
devices  drivers  drivers_autoprobe  drivers_probe  uevent

usb 目录中包含了 devices 和 drivers 目录。devices 目录包含了 USB 总线下所有的设备,这些设备实际上是指向 devices 目录中相应设备的符号链接。

# ls /sys/bus/usb/devices/ -l
total 0
drwxr-xr-x 2 root root 0 1月  25 19:52 ./
drwxr-xr-x 4 root root 0 1月  25 19:51 ../
lrwxrwxrwx 1 root root 0 1月  25 19:41 1-0:1.0 -> ../../../devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-0:1.0/
lrwxrwxrwx 1 root root 0 1月  25 19:41 2-2 -> ../../../devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb2/2-2/
lrwxrwxrwx 1 root root 0 1月  25 19:41 2-2:1.0 -> ../../../devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb2/2-2/2-2:1.0/

其中 1-0:1.0 和 2-2:1.0 是 USB 设备的名称,这些名称由 USB 协议规范来定义。链接的目的是为了构建 sysfs 文件系统的层次结构。

drivers 目录包含了 USB 总线下注册时所有驱动程序的目录。每个驱动目录中,有允许查看和操作设备参数的属性文件,和指向该设备所绑定的物理设备的符号链接

root@ubuntu:/sys/bus/usb/drivers/usb# ll
total 0
drwxr-xr-x 2 root root    0 1月  25 19:56 ./
drwxr-xr-x 6 root root    0 1月  25 19:52 ../
lrwxrwxrwx 1 root root    0 1月  25 19:56 2-2 -> ../../../../devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb2/2-2/
lrwxrwxrwx 1 root root    0 1月  25 19:56 3-1 -> ../../../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/usb3/3-1/
lrwxrwxrwx 1 root root    0 1月  25 19:56 3-3 -> ../../../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/usb3/3-3/
lrwxrwxrwx 1 root root    0 1月  25 19:56 3-4 -> ../../../../devices/pci0000:00/0000:00:15.0/0000:03:00.0/usb3/3-4/

class: 这是按照设备功能分类的设备模型,如系统中所有的输入设备都会出现在 /sys/class/input之下,而不论他们是以何种总线连接到系统。
例如固件类(firmware)、混杂设备类(misc)、图形类(graphics)、声音类(sound)、和输入类(input)等。

kernel: 这里是内核所有可调整参数的位置。

module: 这里有系统中所有模块的信息,不论这些模块是以内联(inlined)方式编译到内核映像文件中,还是编译为外部模块(ko文件),都可能出现在 /sys/module中

编译为外部模块(ko文件)在加载后会出现对应的 /sys/module/<module_name>/ ,并且在这个目录下会出现一些属性文件和属性目录,来表示此外部模块的一些信息,如版本号、加载状态、所提供的驱动程序等。

编译为内联方式的模块则只在当他有非0属性的模块参数时会出现的对应的 /sys/module/<module_name>/ ,这些模块的可用参数会出现在 /sys/module//parameter/<param_name>中。

如 /sys/module/printk/parameters/time这个可读写参数控制着内联模块printk在打印内核消息时 是否加上时间前缀。

没有非0属性参数的内联模块不会出现于此。

power: 这里是系统中电源选项,这个目录下有几个属性文件可以用于控制整个机器的电源状态,如可以向其写入控制指令让机器关机,重启等。

三 提供应用层的访问控制接口

应用层想要对底层硬件进行操控,通常可以通过两种方式:
1 /dev/目录下的设备文件(设备节点)
2 /sys/目录下设备的属性文件。

具体使用哪种方式需要根据不同功能类型设备进行选择,有些设备只能通过设备节点进行操控,而有些设备只能通过 sysfs 方式进行操控。

当然跟设备驱动具体的实现方式有关,通常情况下,一般简单地设备会使用 sysfs 方式操控,其设备驱动在实现时会将设备的一些属性导出到用户空间 sysfs 文件系统,以属性文件的形式为用户空间提供对这些数据、属性的访问支持,譬如 LED、GPIO 等。

但对于一些较复杂的设备通常会使用设备节点的方式,譬如 LCD 等、触摸屏、摄像头等。

<think>首先,用户的问题是:“我想了解sysfs_create_group的作用及其创建的节点类型 请问sysfs_create_group 是建立什么类型的节点”。这是关于Linux内核中的sysfs_create_group函数的。 根据系统级指令: - 所有行内数学表达式必须使用$...$格式,但在这个上下文中,可能没有数学表达式,所以我可以忽略。 - 独立公式必须使用$$...$$格式,但这里可能不需要。 - LaTeX语法正确:确保在需要时使用正确的LaTeX。 - 使用中文回答:整个回答必须用中文。 - 生成相关问题:在回答结束时,生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识:例如[^1]。参考站内引用提供了[^1],我需要自然地使用它。 用户提供的引用是:“引用[1]:sysfs_create_group的简单使用。sysfs_create_group调用internal_create_group来完成多个属性文件的创建 int sysfs_create_group(struct kobject *kobj, const struct attribute_group *grp) { return internal_create_group(kobj, 0, grp); } EXPORT_SYMBOL_GPL(sysfs_create_group); [^1]。” 这是关于sysfs_create_group的简单描述和代码片段。 我的回答需要: - 结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠:基于我的知识,sysfs_create_group用于在sysfs中创建一组属性文件,这些文件通常用于内核对象(kobject)的导出。 关键点: - sysfs_create_group的作用:它在sysfs文件系统中为给定的kobject创建一组属性文件。这允许用户空间通过文件系统接口访问内核对象的属性。 - 创建的节点类型:这些节点是sysfs文件系统中的文件或目录。具体来说,它创建的是属性文件(attribute files),这些文件通常是只读或可读写的文件,用于读取或修改内核对象的属性。 步骤回答: 1. 解释sysfs_create_group的作用。 2. 描述创建的节点类型。 3. 使用提供的引用自然地融入。 引用标识:在回答中,当提到引用内容时,添加[^1]。例如,在解释函数时,可以说“根据引用[^1],sysfs_create_group调用internal_create_group来完成多个属性文件的创建。” 生成相关问题:在最后,添加“§§相关问题§§”部分,列出2-3个相关问题。 用中文回答。 大纲回答: - 引言:简述sysfs_create_group。 - 作用:详细解释其功能。 - 节点类型:描述创建的节点。 - 总结。 - 相关问题。 最终回答: - 确保语言清晰、专业。</think>### sysfs_create_group的作用及创建的节点类型 在Linux内核开发中,`sysfs_create_group` 是一个关键函数,用于在sysfs文件系统中创建一组属性文件(attribute files)。这些文件允许用户空间(userspace)通过文件系统接口访问和操作内核对象(kobject)的属性。下面我将逐步解释其作用和创建的节点类型,确保回答基于真实的内核实现(参考Linux内核源码)。 #### 1. **sysfs_create_group的作用** - **核心功能**:`sysfs_create_group` 用于为指定的内核对象(kobject)批量创建一组属性文件。这些属性文件通常用于导出内核对象的配置、状态或统计数据到用户空间,使得用户可以通过读写文件(如`cat`或`echo`命令)来交互。 - **工作原理**:该函数接受两个参数:一个`struct kobject *kobj`(指向内核对象的指针)和一个`const struct attribute_group *grp`(指向属性组的指针)。属性组定义了多个属性文件(如读写函数、文件名等)。函数内部调用`internal_create_group`来实际创建这些文件,并处理错误检查[^1]。 - **典型应用场景**:在设备驱动或内核模块中,当需要暴露多个相关属性时(例如,一个设备的温度、电压等参数),使用`sysfs_create_group`可以一次性创建所有文件,简化代码并提高效率。例如: ```c static struct attribute *my_attrs[] = { &attr_temp.attr, // 温度属性 &attr_voltage.attr, // 电压属性 NULL, }; static struct attribute_group my_group = { .attrs = my_attrs, }; sysfs_create_group(&dev->kobj, &my_group); // 为设备创建属性组 ``` - **优势**:相比逐个创建文件(如`sysfs_create_file`),它减少了错误风险,并确保了属性文件的原子性创建(要么全部成功,要么全部失败)。 #### 2. **创建的节点类型** - **节点类型**:`sysfs_create_group` 创建的是**sysfs属性文件(attribute files)**,这些文件在sysfs文件系统中表现为普通文件(regular files),而非目录或符号链接。 - **具体特征**: - **文件路径**:这些文件通常位于`/sys/`目录下,具体路径取决于kobject的层次结构。例如,对于一个PCI设备,文件可能位于`/sys/bus/pci/devices/0000:00:01.0/`下。 - **文件属性**:这些文件可以是只读(read-only)或读写(read-write),具体取决于属性定义中的`.mode`字段。例如: - 只读文件:用于显示内核状态(如`cat /sys/.../temperature`)。 - 可写文件:用于配置内核参数(如`echo 100 > /sys/.../voltage`)。 - **文件内容**:内容通常是文本格式(如字符串或数字),由内核模块提供的回调函数(如`.show`和`.store`)动态生成或处理。 - **为什么不是目录或其他类型**:`sysfs_create_group` 本身不创建目录节点;它只在现有kobject对应的目录下创建文件。如果属性组需要子目录,可以通过嵌套属性组实现,但核心输出是文件节点[^1]。 #### 总结 `sysfs_create_group` 主要用于在sysfs中高效创建一组属性文件,便于用户空间与内核交互。根据引用[^1],它通过调用`internal_create_group`实现,简化了多个属性文件的创建过程。在Linux内核中,这常用于驱动开发,例如导出硬件状态或调试信息。如果您有具体的内核模块示例,可以提供更多细节,我可以进一步解释。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ma浩然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值