我遇到的这个问题来自于Linux内核的一个培训项目,具体可以搜索Eudyptula关键字。目的是培养更多的内核开发者,不过这个项目现在已经截止报名。
首先需要了解的是sysfs,procfs和debugfs都是内核提供的伪文件系统,实现内核/驱动和用户空间的通信。
对于sysfs来说,增加一个文件的方法如下:
第一步:分别实现读和写的方法,命名规范是"文件名_show"和"文件名_store"。
static ssize_t <filename>_show(struct device *dev, struct device_attribute *attr, char *buf)
static ssize_t <filename>_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
第二步:用宏构造相关结构体。(整体替换<filename>
为需要增加的文件名)
static DEVICE_ATTR_RW(<filename>);
这个宏的作用就是字符串的拼接,所以第一步里面的函数名要符合规范才行。
#define DEVICE_ATTR_RW(_name) \
struct device_attribute dev_attr_##_name = __ATTR_RW(_name)
#define __ATTR_RW(_name) __ATTR(_name, (S_IWUSR | S_IRUGO), \
_name##_show, _name##_store)
#define __ATTR(_name, _mode, _show, _store) { \
.attr = {.name = __stringify(_name), .mode = _mode }, \
.show = _show, \
.store = _store, \
}
第三步:在驱动程序的入口和结束的地方分别创建和删除文件,其中attr的名字应该是dev_attr_##_name处理后的名字,即dev_attr_<filename>
。
void device_remove_file (struct device * dev, struct device_attribute * attr);
int device_create_file (struct device * dev, const struct device_attribute * attr);
重新编译内核,然后安装并启动,就能看到自己建立的sysfs文件了。也有其他的方法可以实现相同的功能,但是DEVICE_ATTR_RW应该是比较简单的一种。Linux内核有时会定义一些新的宏替换老的方法,这也是练习提交补丁的好机会。