linux 之 struct attribute
Linux 中的 struct attribute
在 Linux 内核中,struct attribute
是用于实现 sysfs 文件系统的基本数据结构之一。sysfs 是一个虚拟文件系统,用于将内核对象(如设备、驱动、模块等)导出到用户空间,方便用户通过文件操作(如 cat
、echo
)与内核交互。
定义与结构
struct attribute
定义在头文件 <linux/sysfs.h>
中,其基本结构如下:
struct attribute {const char *name; // 属性名称,对应 sysfs 中的文件名umode_t mode; // 文件权限(如 0644)
};
name
:属性的名称,在 sysfs 中显示为文件名。mode
:文件的访问权限,通常以八进制表示(如0644
表示用户可读写,组和其他用户只读)。
扩展属性
实际使用中,通常会用更具体的结构(如 struct device_attribute
或 struct kobj_attribute
)扩展 struct attribute
。这些扩展结构包含额外的回调函数,用于实现读写操作。例如:
struct device_attribute {struct attribute attr;ssize_t (*show)(struct device *dev, struct device_attribute *attr, char *buf);ssize_t (*store)(struct device *dev, struct device_attribute *attr, const char *buf, size_t count);
};
show
:用户读取文件时调用的函数,将数据写入buf
。store
:用户写入文件时调用的函数,从buf
读取数据。
使用示例
以下是一个简单的示例,展示如何在内核模块中创建 sysfs 属性:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/device.h>
#include <linux/sysfs.h>static char my_value[32] = "default";// show 回调函数
static ssize_t my_value_show(struct device *dev, struct device_attribute *attr, char *buf) {return sprintf(buf, "%s\n", my_value);
}// store 回调函数
static ssize_t my_value_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) {snprintf(my_value, sizeof(my_value), "%s", buf);return count;
}// 定义 device_attribute
static DEVICE_ATTR(my_value, 0644, my_value_show, my_value_store);static struct device *my_device;static int __init my_module_init(void) {int ret;my_device = root_device_register("my_device");if (IS_ERR(my_device)) {return PTR_ERR(my_device);}// 创建 sysfs 属性ret = device_create_file(my_device, &dev_attr_my_value);if (ret) {device_unregister(my_device);return ret;}return 0;
}static void __exit my_module_exit(void) {device_remove_file(my_device, &dev_attr_my_value);device_unregister(my_device);
}module_init(my_module_init);
module_exit(my_module_exit);
MODULE_LICENSE("GPL");
关键点
DEVICE_ATTR
宏用于定义device_attribute
,参数依次为属性名、权限、show 和 store 函数。device_create_file
将属性绑定到设备,并在 sysfs 中创建文件。- 用户可以通过
/sys/devices/my_device/my_value
读写该属性。
常见用途
- 动态配置内核参数。
- 调试和监控设备状态。
- 实现用户空间与内核的交互接口。
通过 struct attribute
和相关机制,Linux 内核提供了灵活的方式将内部状态暴露给用户空间,便于管理和调试。