Linux 内核中的 sysfs 文件系统从设备到用户空间引言作为一名深耕操作系统和嵌入式开发的工程师我深知设备管理的重要性。在系统开发中良好的设备管理可以提高系统的可维护性和稳定性。在 Linux 内核中sysfs 文件系统是一个虚拟文件系统它提供了一种从用户空间访问设备信息的机制。今天我们就来深入探讨 Linux 内核中的 sysfs 文件系统从技术原理到实战应用。技术原理sysfs 文件系统的核心概念Linux 内核的 sysfs 文件系统主要包括sysfs 文件系统一个虚拟文件系统用于暴露设备、驱动和总线信息到用户空间。kobject内核对象是 sysfs 的基础代表设备、驱动等实体。ksetkobject 的集合用于组织相关的 kobject。属性Attributekobject 的属性通过 sysfs 文件暴露给用户空间。设备层次结构通过 sysfs 展示的设备树结构。sysfs 文件系统的实现原理// kobject 结构体 struct kobject { const char *name; struct list_head entry; struct kobject *parent; struct kset *kset; struct kobj_type *ktype; struct kernfs_node *sd; struct kref kref; unsigned int state_initialized:1; unsigned int state_in_sysfs:1; unsigned int state_add_uevent_sent:1; unsigned int state_remove_uevent_sent:1; unsigned int uevent_suppress:1; }; // kobj_type 结构体 struct kobj_type { void (*release)(struct kobject *kobj); const struct sysfs_ops *sysfs_ops; struct attribute **default_attrs; const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj); const void *(*namespace)(struct kobject *kobj); }; // attribute 结构体 struct attribute { const char *name; umode_t mode; }; // sysfs_ops 结构体 struct sysfs_ops { ssize_t (*show)(struct kobject *kobj, struct attribute *attr, char *buf); ssize_t (*store)(struct kobject *kobj, struct attribute *attr, const char *buf, size_t count); }; // 创建 sysfs 文件 int sysfs_create_file(struct kobject *kobj, const struct attribute *attr); void sysfs_remove_file(struct kobject *kobj, const struct attribute *attr); // 创建 sysfs 目录 int sysfs_create_dir(struct kobject *kobj); void sysfs_remove_dir(struct kobject *kobj); // 创建 sysfs 组 int sysfs_create_group(struct kobject *kobj, const struct attribute_group *grp); void sysfs_remove_group(struct kobject *kobj, const struct attribute_group *grp);创业视角分析从创业者的角度来看sysfs 文件系统的设计思路与企业管理中的资产管理有着密切的联系资产透明sysfs 将设备信息公开就像企业中的资产透明化管理提高管理效率。层次管理sysfs 通过层次结构组织设备就像企业中的层级管理体系。动态交互通过 sysfs 文件实现用户空间与设备的动态交互就像企业中的动态调整机制。标准化接口sysfs 提供标准化的设备访问接口就像企业中的标准化管理流程。实用技巧sysfs 文件系统的使用场景设备管理通过 /sys 目录管理系统设备。驱动开发在设备驱动中创建 sysfs 文件暴露设备信息。总线管理通过 sysfs 管理总线设备和驱动。电源管理通过 sysfs 控制设备的电源状态。热插拔通过 sysfs 处理设备的热插拔事件。sysfs 文件系统的最佳实践合理组织层次结构根据设备的物理结构组织 sysfs 层次。使用属性组相关的属性使用属性组组织便于管理。注意权限控制合理设置 sysfs 文件的访问权限。及时清理在设备移除时清理 sysfs 条目。遵循命名规范遵循 sysfs 的命名规范提高可读性。代码示例创建 sysfs 属性#include linux/module.h #include linux/kernel.h #include linux/kobject.h #include linux/sysfs.h #include linux/slab.h static struct kobject *my_kobj; static int my_value 0; // show 函数 static ssize_t my_value_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) { return sprintf(buf, %d\n, my_value); } // store 函数 static ssize_t my_value_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count) { int ret; ret kstrtoint(buf, 10, my_value); if (ret 0) return ret; return count; } // 定义属性 static struct kobj_attribute my_value_attr __ATTR(my_value, 0664, my_value_show, my_value_store); // 属性组 static struct attribute *my_attrs[] { my_value_attr.attr, NULL, }; static struct attribute_group my_attr_group { .attrs my_attrs, }; // 模块初始化 static int __init sysfs_example_init(void) { int ret; // 创建 kobject my_kobj kobject_create_and_add(my_sysfs, kernel_kobj); if (!my_kobj) return -ENOMEM; // 创建属性组 ret sysfs_create_group(my_kobj, my_attr_group); if (ret) { kobject_put(my_kobj); return ret; } printk(KERN_INFO Sysfs example initialized\n); return 0; } // 模块退出 static void __exit sysfs_example_exit(void) { sysfs_remove_group(my_kobj, my_attr_group); kobject_put(my_kobj); printk(KERN_INFO Sysfs example exited\n); } module_init(sysfs_example_init); module_exit(sysfs_example_exit); MODULE_AUTHOR(Your Name); MODULE_DESCRIPTION(Sysfs example); MODULE_LICENSE(GPL);设备属性示例#include linux/module.h #include linux/kernel.h #include linux/device.h #include linux/sysfs.h static struct class *my_class; static struct device *my_device; // 设备属性 show 函数 static ssize_t device_info_show(struct device *dev, struct device_attribute *attr, char *buf) { return sprintf(buf, Device Name: MyDevice\nDriver Version: 1.0\n); } // 设备属性 store 函数 static ssize_t device_config_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { printk(KERN_INFO Device config received: %s\n, buf); return count; } // 定义设备属性 static DEVICE_ATTR(device_info, 0444, device_info_show, NULL); static DEVICE_ATTR(device_config, 0220, NULL, device_config_store); // 模块初始化 static int __init device_sysfs_init(void) { int ret; // 创建类 my_class class_create(THIS_MODULE, my_class); if (IS_ERR(my_class)) return PTR_ERR(my_class); // 创建设备 my_device device_create(my_class, NULL, MKDEV(0, 0), NULL, my_device); if (IS_ERR(my_device)) { class_destroy(my_class); return PTR_ERR(my_device); } // 创建设备属性 ret device_create_file(my_device, dev_attr_device_info); if (ret) goto err; ret device_create_file(my_device, dev_attr_device_config); if (ret) goto err_info; printk(KERN_INFO Device sysfs example initialized\n); return 0; err_info: device_remove_file(my_device, dev_attr_device_info); err: device_destroy(my_class, MKDEV(0, 0)); class_destroy(my_class); return ret; } // 模块退出 static void __exit device_sysfs_exit(void) { device_remove_file(my_device, dev_attr_device_config); device_remove_file(my_device, dev_attr_device_info); device_destroy(my_class, MKDEV(0, 0)); class_destroy(my_class); printk(KERN_INFO Device sysfs example exited\n); } module_init(device_sysfs_init); module_exit(device_sysfs_exit); MODULE_AUTHOR(Your Name); MODULE_DESCRIPTION(Device sysfs example); MODULE_LICENSE(GPL);常用 sysfs 文件# 查看系统设备 ls /sys/devices/ # 查看总线 ls /sys/bus/ # 查看设备类 ls /sys/class/ # 查看块设备 ls /sys/block/ # 查看模块信息 ls /sys/module/ # 查看电源管理 ls /sys/power/ # 查看 CPU 信息 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor # 查看内存信息 cat /sys/devices/system/memory/memory0/state # 查看网络设备 ls /sys/class/net/ # 查看 USB 设备 ls /sys/bus/usb/devices/总结Linux 内核中的 sysfs 文件系统是一个虚拟文件系统它提供了一种从用户空间访问设备信息的机制。sysfs 文件系统通过 kobject、属性、设备层次结构等组件实现了设备信息的透明化和用户空间与设备的交互。工作也要流程化sysfs 文件系统就像是系统中的设备管理工具它确保了设备信息的透明和用户空间与设备的灵活交互。在实际应用中我们需要合理组织层次结构使用属性组注意权限控制及时清理以及遵循命名规范以实现系统的最佳性能和可靠性。这就是生机所在通过深入理解和应用 sysfs 文件系统技术我们不仅可以构建更透明、更灵活的系统也可以从中汲取企业管理的智慧为创业之路增添一份技术的力量。
Linux 内核中的 sysfs 文件系统:从设备到用户空间
发布时间:2026/5/24 19:57:33
Linux 内核中的 sysfs 文件系统从设备到用户空间引言作为一名深耕操作系统和嵌入式开发的工程师我深知设备管理的重要性。在系统开发中良好的设备管理可以提高系统的可维护性和稳定性。在 Linux 内核中sysfs 文件系统是一个虚拟文件系统它提供了一种从用户空间访问设备信息的机制。今天我们就来深入探讨 Linux 内核中的 sysfs 文件系统从技术原理到实战应用。技术原理sysfs 文件系统的核心概念Linux 内核的 sysfs 文件系统主要包括sysfs 文件系统一个虚拟文件系统用于暴露设备、驱动和总线信息到用户空间。kobject内核对象是 sysfs 的基础代表设备、驱动等实体。ksetkobject 的集合用于组织相关的 kobject。属性Attributekobject 的属性通过 sysfs 文件暴露给用户空间。设备层次结构通过 sysfs 展示的设备树结构。sysfs 文件系统的实现原理// kobject 结构体 struct kobject { const char *name; struct list_head entry; struct kobject *parent; struct kset *kset; struct kobj_type *ktype; struct kernfs_node *sd; struct kref kref; unsigned int state_initialized:1; unsigned int state_in_sysfs:1; unsigned int state_add_uevent_sent:1; unsigned int state_remove_uevent_sent:1; unsigned int uevent_suppress:1; }; // kobj_type 结构体 struct kobj_type { void (*release)(struct kobject *kobj); const struct sysfs_ops *sysfs_ops; struct attribute **default_attrs; const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj); const void *(*namespace)(struct kobject *kobj); }; // attribute 结构体 struct attribute { const char *name; umode_t mode; }; // sysfs_ops 结构体 struct sysfs_ops { ssize_t (*show)(struct kobject *kobj, struct attribute *attr, char *buf); ssize_t (*store)(struct kobject *kobj, struct attribute *attr, const char *buf, size_t count); }; // 创建 sysfs 文件 int sysfs_create_file(struct kobject *kobj, const struct attribute *attr); void sysfs_remove_file(struct kobject *kobj, const struct attribute *attr); // 创建 sysfs 目录 int sysfs_create_dir(struct kobject *kobj); void sysfs_remove_dir(struct kobject *kobj); // 创建 sysfs 组 int sysfs_create_group(struct kobject *kobj, const struct attribute_group *grp); void sysfs_remove_group(struct kobject *kobj, const struct attribute_group *grp);创业视角分析从创业者的角度来看sysfs 文件系统的设计思路与企业管理中的资产管理有着密切的联系资产透明sysfs 将设备信息公开就像企业中的资产透明化管理提高管理效率。层次管理sysfs 通过层次结构组织设备就像企业中的层级管理体系。动态交互通过 sysfs 文件实现用户空间与设备的动态交互就像企业中的动态调整机制。标准化接口sysfs 提供标准化的设备访问接口就像企业中的标准化管理流程。实用技巧sysfs 文件系统的使用场景设备管理通过 /sys 目录管理系统设备。驱动开发在设备驱动中创建 sysfs 文件暴露设备信息。总线管理通过 sysfs 管理总线设备和驱动。电源管理通过 sysfs 控制设备的电源状态。热插拔通过 sysfs 处理设备的热插拔事件。sysfs 文件系统的最佳实践合理组织层次结构根据设备的物理结构组织 sysfs 层次。使用属性组相关的属性使用属性组组织便于管理。注意权限控制合理设置 sysfs 文件的访问权限。及时清理在设备移除时清理 sysfs 条目。遵循命名规范遵循 sysfs 的命名规范提高可读性。代码示例创建 sysfs 属性#include linux/module.h #include linux/kernel.h #include linux/kobject.h #include linux/sysfs.h #include linux/slab.h static struct kobject *my_kobj; static int my_value 0; // show 函数 static ssize_t my_value_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) { return sprintf(buf, %d\n, my_value); } // store 函数 static ssize_t my_value_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count) { int ret; ret kstrtoint(buf, 10, my_value); if (ret 0) return ret; return count; } // 定义属性 static struct kobj_attribute my_value_attr __ATTR(my_value, 0664, my_value_show, my_value_store); // 属性组 static struct attribute *my_attrs[] { my_value_attr.attr, NULL, }; static struct attribute_group my_attr_group { .attrs my_attrs, }; // 模块初始化 static int __init sysfs_example_init(void) { int ret; // 创建 kobject my_kobj kobject_create_and_add(my_sysfs, kernel_kobj); if (!my_kobj) return -ENOMEM; // 创建属性组 ret sysfs_create_group(my_kobj, my_attr_group); if (ret) { kobject_put(my_kobj); return ret; } printk(KERN_INFO Sysfs example initialized\n); return 0; } // 模块退出 static void __exit sysfs_example_exit(void) { sysfs_remove_group(my_kobj, my_attr_group); kobject_put(my_kobj); printk(KERN_INFO Sysfs example exited\n); } module_init(sysfs_example_init); module_exit(sysfs_example_exit); MODULE_AUTHOR(Your Name); MODULE_DESCRIPTION(Sysfs example); MODULE_LICENSE(GPL);设备属性示例#include linux/module.h #include linux/kernel.h #include linux/device.h #include linux/sysfs.h static struct class *my_class; static struct device *my_device; // 设备属性 show 函数 static ssize_t device_info_show(struct device *dev, struct device_attribute *attr, char *buf) { return sprintf(buf, Device Name: MyDevice\nDriver Version: 1.0\n); } // 设备属性 store 函数 static ssize_t device_config_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { printk(KERN_INFO Device config received: %s\n, buf); return count; } // 定义设备属性 static DEVICE_ATTR(device_info, 0444, device_info_show, NULL); static DEVICE_ATTR(device_config, 0220, NULL, device_config_store); // 模块初始化 static int __init device_sysfs_init(void) { int ret; // 创建类 my_class class_create(THIS_MODULE, my_class); if (IS_ERR(my_class)) return PTR_ERR(my_class); // 创建设备 my_device device_create(my_class, NULL, MKDEV(0, 0), NULL, my_device); if (IS_ERR(my_device)) { class_destroy(my_class); return PTR_ERR(my_device); } // 创建设备属性 ret device_create_file(my_device, dev_attr_device_info); if (ret) goto err; ret device_create_file(my_device, dev_attr_device_config); if (ret) goto err_info; printk(KERN_INFO Device sysfs example initialized\n); return 0; err_info: device_remove_file(my_device, dev_attr_device_info); err: device_destroy(my_class, MKDEV(0, 0)); class_destroy(my_class); return ret; } // 模块退出 static void __exit device_sysfs_exit(void) { device_remove_file(my_device, dev_attr_device_config); device_remove_file(my_device, dev_attr_device_info); device_destroy(my_class, MKDEV(0, 0)); class_destroy(my_class); printk(KERN_INFO Device sysfs example exited\n); } module_init(device_sysfs_init); module_exit(device_sysfs_exit); MODULE_AUTHOR(Your Name); MODULE_DESCRIPTION(Device sysfs example); MODULE_LICENSE(GPL);常用 sysfs 文件# 查看系统设备 ls /sys/devices/ # 查看总线 ls /sys/bus/ # 查看设备类 ls /sys/class/ # 查看块设备 ls /sys/block/ # 查看模块信息 ls /sys/module/ # 查看电源管理 ls /sys/power/ # 查看 CPU 信息 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor # 查看内存信息 cat /sys/devices/system/memory/memory0/state # 查看网络设备 ls /sys/class/net/ # 查看 USB 设备 ls /sys/bus/usb/devices/总结Linux 内核中的 sysfs 文件系统是一个虚拟文件系统它提供了一种从用户空间访问设备信息的机制。sysfs 文件系统通过 kobject、属性、设备层次结构等组件实现了设备信息的透明化和用户空间与设备的交互。工作也要流程化sysfs 文件系统就像是系统中的设备管理工具它确保了设备信息的透明和用户空间与设备的灵活交互。在实际应用中我们需要合理组织层次结构使用属性组注意权限控制及时清理以及遵循命名规范以实现系统的最佳性能和可靠性。这就是生机所在通过深入理解和应用 sysfs 文件系统技术我们不仅可以构建更透明、更灵活的系统也可以从中汲取企业管理的智慧为创业之路增添一份技术的力量。