我遇到的这个问题来自于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内核有时会定义一些新的宏替换老的方法,这也是练习提交补丁的好机会。