编写 Sysfs 模块

Writing a Sysfs module

我正在尝试学习如何编写 sysfs 模块,但对基本的初始化感到困惑。在查看 kobject.h 文件的 this 文档中,有几个与创建 sysfs 条目相关的不同函数。

从外观上看,函数 "kobject_init_and_add" 似乎是正确的使用方法,它采用以下内容:

 90 int kobject_init_and_add(struct kobject *kobj,
 91                          struct kobj_type *ktype, struct kobject *parent,
 92                          const char *fmt, ...);

struct kobject 和 struct kobj_type 足够简单,但我不明白 *parent kobject 和 *fmt cstring 应该是什么。

此外,在初始化这些对象后,我需要在 exit_module 函数中删除它们,但有两个选项似乎是可行的:kobject_del 和 kobject_puts。它们之间有什么区别?

我的部分困惑来自于这样一个事实,即在谷歌搜索答案时,我看到教程说要使用 kobject_register 之类的函数,但该函数实际上并不存在。

有许多创建 sysfs 条目的内核模块。例如, http://lxr.free-electrons.com/source/net/bridge/br_sysfs_br.c 该模块使用 kobject_create_and_add(),它获取一个由 sysfs_create_group() 创建的 kobject 实例作为参数。我相信研究这样的模块,并尝试按照该模块中的模式逐步编写代码,会有所帮助。也看看 http://lxr.free-electrons.com/source/Documentation/kobject.txt

拉米·罗森

是的,主线内核上有很多示例,您可以参考这些示例来实现。对于您的疑问,我添加了一些示例代码

模块Probe/init函数

static struct kobject   *module_kobject;
module_kobject=kobject_create_and_add("module_status",NULL);
sysfs_create_group(module_kobject,&module_attr);

模块Remove/exit函数

sysfs_remove_group(module_kobject,&module_attr);
kobject_put(module_kobject);

如果要公开用户的多个属性space;比你还需要定义组

static struct attribute_group module_attr={
.attrs = module_attribute,
};

您可能需要更多的实现和功能,例如:

static ssize_t module_show_status(struct kobject *kobj,struct kobj_attribute *attr,char *buf);
static ssize_t module_store__status(struct kobject *kobj,struct kobj_attribute *attr,const char *buf,size_t len);

我认为你可以根据上面的代码开始你的 sysfs 模块实现,欢迎任何帮助。