【问题标题】:Deleting a sysfs entry删除 sysfs 条目
【发布时间】:2015-07-09 03:14:42
【问题描述】:

我正在尝试学习 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 条目。

【问题讨论】:

  • 当您的模块尝试加载和删除并再次创建它时,重新启动盒子或获取它的句柄?
  • 哦!!我得到了第二部分,在用户空间中还有其他方法吗?
  • @Pradheep:通常,您无法从用户空间修复内核代码问题。在你的情况下,你不能删除 kobject 在用户空间中。

标签: linux-kernel sysfs


【解决方案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 条目。重新启动很容易,但是当您的系统没有停止服务的选项时,这很不错。

【讨论】:

  • 我不同意你的观点,kobject_put 会减少 kobject 的引用计数,因此当引用计数变为零时,它会删除该对象。我认为使用 kobject_put 动态删除它是一个更干净的解决方案。
  • 如果 kobj 不属于 kset,kobject_put 就足够了。 kobject_del() 将另外调用 kobj_kset_leave(kobj) 将其从 kset 中删除。希望对您有所帮助。
  • 另外,如果您是内核编程的新手,并且正在尝试新事物,更喜欢 VM,那么它非常简单快捷。当高可用性系统出现问题时,就会采用这种方法。
  • @user31986:来自kobject_create_and_add的描述:“当你用完这个结构后,调用kobject_put(),当结构不再被使用时,它会被动态释放。”跨度>
  • 你确定在kset的情况下不需要额外处理吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多