文章目录
本文拟对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/Linux
sysfs虚拟文件系统是随着linux统一设备驱动模型一起诞生的。这个新的设备模型是为了对计算机上的所有设备进行统一地表示和操作,包括设备本身设备之间的连接关系。
这个模型建立在PCI 和USB 的总线枚举过程的分析上,这两个总线类型能代表当前系统中的大多数设备类型。CPU 能直接控制的是PCI总线设备,而USB总线设备是一个具体的PCI设备,外部USB设备再接入到USB 总线设备上。当计算机执行挂起操作时,linux内核应该以“外部USB设备->USB总线设备->PCI总线设备”的顺序通知每一个设备将电源挂起。执行恢复时则以相反的顺序通知。sysfs是在这个linux统一设备模型的开发过程中产生的一项副产品。
在测试环境上,sysfs的挂载信息如下:
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
下面的节点:
$ ls /sys
block bus class dev devices firmware fs hypervisor kernel module power
这些节点的主要功能:
- block: 描述当前系统中所有的块设备的信息
- class:根据设备功能分类的设备模型
- devices:描述系统中所有的设备,设备根据类型分层
- fs:描述系统中所有的文件系统
- module:系统中所有模块的信息
- bus:系统中所有设备头连接到的某种总线里
- dev:维护一个按字符设备和块设备的主次号码连接到真实设备的符号连接文件
- firmware:系统加载固件相关的接口
- kernel:内核可调参数
- power:和电源管理相关的可调参数
- hypervisor:有人说是跟虚拟化hypervisor有关,目前没找到官方文档说明
sysfs接口
sysfs代码在路径fs/sysfs
下。
下面以/sys/kernel
说下在sfsfs中的接口,代码在kernel/ksysfs.c
先看其初始化入口函数:
static int __init ksysfs_init(void)
{
int error;
kernel_kobj = kobject_create_and_add("kernel", NULL);
if (!kernel_kobj) {
error = -ENOMEM;
goto exit;
}
error = sysfs_create_group(kernel_kobj, &kernel_attr_group);
if (error)
goto kset_exit;
if (notes_size > 0) {
notes_attr.size = notes_size;
error = sysfs_create_bin_file(kernel_kobj, ¬es_attr);
if (error)
goto group_exit;
}
return 0;
group_exit:
sysfs_remove_group(kernel_kobj, &kernel_attr_group);
kset_exit:
kobject_put(kernel_kobj);
exit:
return error;
}
首先,k