/sys目录是sysfs挂载点,通过kobject动态导出内核对象状态;模块参数用module_param导出至/sys/module/;设备属性用device_create_file或sysfs_create_group导出;总线/类/驱动参数分别通过bus_attr、class_attr、driver_attr导出;所有操作依赖kobject生命周期管理。

Linux 的 /sys 目录是 sysfs 文件系统的挂载点,它本身不存储数据,而是由内核对象(kobject)动态导出设备、驱动、总线等运行时状态和可配置参数。硬件驱动的运行参数正是通过内核对象及其属性接口(attribute)暴露到用户空间的。
驱动参数通过 module_param 导出到 /sys/module/
最常用的方式是使用 module_param() 宏声明模块级参数。内核在加载驱动模块时,会自动在 /sys/module/<module_name>/parameters/</module_name> 下创建对应文件:
- 每个参数名成为该目录下的一个普通文件(如
debug_level) - 文件权限由
perm参数控制,例如S_IRUSR | S_IWUSR表示仅所有者可读写 - 读取该文件即调用内核中对应的
get操作,写入则触发set操作(默认由内核提供,也可自定义回调) - 例如:
module_param(enable_irq, bool, 0644);加载后可通过cat /sys/module/mydrv/parameters/enable_irq查看,echo "Y" > /sys/module/mydrv/parameters/enable_irq修改
设备属性通过 device_create_file 或 sysfs_create_group 导出
若需导出与具体设备实例相关的参数(如某个 sensor 的采样率、阈值),应在驱动 probe 中为 struct device * 创建属性文件:
- 使用
device_create_file(dev, &dev_attr_xxx)单个注册,其中dev_attr_xxx是预先定义的DEVICE_ATTR_RW或DEVICE_ATTR_RO - 更推荐批量注册:定义
struct attribute_group,填充多个struct attribute *,再调用sysfs_create_group(&dev->kobj, &my_group) - 生成路径为
/sys/devices/.../<device_name>/xxx</device_name>或/sys/class/<class>/<device>/xxx</device></class>,取决于设备注册方式 - 属性的
show和store函数直接访问驱动私有数据(如container_of获取 device 结构体)
总线/类/驱动层级参数通过 BUS_ATTR、CLASS_ATTR、DRIVER_ATTR 导出
不同抽象层级的对象支持各自的属性宏:
-
BUS_ATTR_RW(name)→ 导出到/sys/bus/<bus_name>/<name></name></bus_name>,适用于总线共性控制(如 PCI bus 的资源扫描开关) -
CLASS_ATTR_RW(name)→ 导出到/sys/class/<class_name>/<name></name></class_name>,适合全类统一配置(如/sys/class/leds/trigger) -
DRIVER_ATTR_RW(name)→ 导出到/sys/bus/<bus>/drivers/<driver_name>/<name></name></driver_name></bus>,用于驱动自身行为调控(如绑定策略、调试开关) - 这些宏本质仍是封装了 kobj_attribute,最终挂载到对应 kobject 的 sysfs 目录下
关键前提:kobject 生命周期与 sysfs 同步
所有导出都依赖内核对象模型。sysfs 中的目录和文件只是 kobject 及其属性的视图:
- 驱动调用
device_register()、bus_register()、class_register()等函数时,内核自动为其分配并初始化 kobject,并挂载到 sysfs 对应位置 - 属性文件的创建必须在对应 kobject 已注册之后,否则
sysfs_create_file会失败 - 卸载驱动时须显式调用
device_remove_file()或sysfs_remove_group(),避免悬空引用或重复创建错误 - 所有 show/store 函数运行在进程上下文,不能睡眠的操作(如某些 spinlock 场景)需特别注意同步机制











