编写 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 模块实现,欢迎任何帮助。
我正在尝试学习如何编写 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 模块实现,欢迎任何帮助。