1. sysfs介绍
官方英文介绍如下:http://www.linux.org/threads/sysfs-and-configfs.4956/
如果有时间,还是建议看上面官网的英文原文。
以下是个人翻译:
Linux有2个虚拟文件系统:sysf和configfs。虚拟文件系统有别于其他文件系统。sysfs和configfs存在与内存中。sysfs的挂载点是/sys/或/sysfs/。然而,configs可能挂载到/config/或/sys/kernel/config/,或则也有可能没有挂载到系统上。
sysfs在kernel开发阶段,内核缺少一个通用的信息动态变化的系统,procfs包含的信息不与是动态处理的。sysfs由此产生,kernelV2.5版本以上都有sysfs。这个虚拟文件系统包含设备/驱动的信息,同时也包含各种各样的内核数据。sysfs为内核空间和用户空间提供访问的接口。尽管不同的kernel版本之间有一些修改,procfs和sysfs是一个高集成的,标准的文件系统。以下介绍sysfs的子目录:
*/sys/block/ - 此目录包含块设备的sysfs文件的快捷方式。
*/sys/bus/ - 此目录包含系统上不同总线的sysfs文件和数据。
*/sys/class/ - 此目录以设备类型命名的文件夹,如:”printers”, “mem”, “leds”, “input”,等。这些子目录包含在sysfs中与特定设备相关的快捷方式。用户通过按照类型路径来寻找指定设备是很有帮助的。
*/sys/dev/ - 内部包含2个文件目录:block和char,分别标识块设备和字符设备。
*/sys/devices/ - 包含绝大多数的sysfs系统中的设备和文件的快捷方式。
*/sys/firmware/ - 这里包含系统固件信息和配置信息的文件。
*/sys/fs/ - 包含已经挂载的文件系统的相关信息和配置。
*/sys/hypervisor/ - 与管理程序有关的信息。
*/sys/kernel/ - 设置,状态信息和安全策略。
*/sys/module/ - 所有已经加载的模块都放在这里。每一个文件夹都包含了这些模块的有关状态和配置。
*/sys/power/ - 电源状态信息,系统休眠时间等。
我们实际使用过程中最重要的功能就是:通过sysfs节点让用户空间的程序访问内核空间,从而查询/控制底层设备。
伸手党可以直接下载附件,内有readme操作方式,可以直接使用。
欢迎新手逐点阅读,动手操作,一起讨论,一起进步,高手绕道。
2. device_create_file创建sysfs节点
前一节有了sysfs的简单介绍,那么如何来创建一个sysfs节点?先看文档Documentation\filesystems\sysfs.txt目录下的资料(中文文档:Documentation\zh_CN\filesystems\sysfs.txt),有中文版本,我这里就不再翻译了,打开阅读一下,可以发现创建节点的接口有4个:
sysfs_create_file 通过kobject创建sysfs的节点(其他3个接口最终都会调用此接口,参数attr中没有读写操作的接口,所以不使用此接口)。
device_create_file 为设备创建sys的节点。
bus_create_file 为总线创建sys的节点。
driver_create_file 为驱动创建sys的节点。
这4个接口中,linux驱动开发中,用户空间操作内核空间多数都是为了控制设备,那么我们选择实际使用最多的device_create_file接口来创建sysfs节点,并通过创建出来的节点进行读写操作。
通过阅读kernel代码来实现这个接口(代码查询见文章末尾查询接口定义)。内核代码找到这个接口的定义在drivers/base/core.c中,如下:
/**
* device_create_file - create sysfs attribute file for device.
* @dev: device.
* @attr: device attribute descriptor.
*/
int device_create_file(struct device *dev,
const struct device_attribute *attr)
我们需要创建dev和attr,来填充此接口,从而实现sysfs节点创建。
2.1 创建dev
在drivers/base/core.c中找到这个创建设备的接口定义:
/**
* device_create - creates a device and registers it with sysfs
* @class: pointer to the struct class that this device should