0

我试图学习 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 条目。

4

1 回答 1

1

首先,光做kobject_put()是不够的,你必须用它kobject_del()来代替。kobject_put()不做彻底的清理。在您的情况下,由于kobject_example是文件(不是目录),因此仅“放置”仍会将条目留在父目录(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 条目。重新启动很容易,但是当您的系统没有停止服务的选项时,这很不错。

于 2015-07-08T19:14:42.847 回答