我正在尝试学习sysfs,并试图编写一个简单的sysfs目录。代码如下
static struct kobject *example_kobject;
static int __init mymodule_init (void)
{
pr_debug("Module initialized successfully \n");
example_kobject = kobject_create_and_add("kobject_example",
kernel_kobj);
if(!example_kobject)
return -ENOMEM;
return 0;
}
static void __exit mymodule_exit (void)
{
pr_debug ("Module un initialized successfully \n");
// kobject_put(example_kobject); <-- Forgot to delete
}
module_init(mymodule_init);
module_exit(mymodule_exit);
如mymodule_exit所示,我错误地忘记取消注释代码,然后插入并rmmod模块。
现在,当我尝试再次插入模块时,初始化失败,因为条目已经存在。
我知道,允许用户空间删除内核创建的条目是没有意义的。但是,我仍然想知道是否有任何其他方法可以删除特定的/ sys / kernel / kobject_example条目而不是重新启动该框。
答案 0 :(得分:0)
首先,仅仅执行kobject_put()
不够好,您必须使用kobject_del()
。 kobject_put()
没有完全清理。在您的情况下,由于kobject_example
是一个文件(不是dir),仅仅'put'仍会将该条目留在父目录(kset
)中。
如果必须,可以在没有重新启动的情况下移除此类条目,这是通过编写另一个模块来执行此操作。这是模块应该做的事情:
/* Find the kobj from the path and parent kset */
kobj = kset_find_obj(kernel_kobj->kset, "kobject_example");
...
/* check kobj is not null etc. */
...
/* Remove the sysfs entry */
kobject_del(kobj);
这将删除sysfs条目。重新启动很简单,但是当您的系统没有停止服务的选项时,这很有用。