2015-07-08 3 views
0

Я пытался изучить sysfs и пытался написать простой каталог 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, кроме перезагрузки окна.

+1

Перезагрузите коробку или обратитесь к ней, когда ваш модуль пытается загрузить и удалить и создать его снова? –

+0

О! я получаю вторую часть, любым другим способом в пользовательском пространстве? – Pradheep

+2

@Pradheep: Как правило, вы не можете исправить проблемы с кодом ядра из пользовательского пространства. В вашем случае вы не можете удалить 'kobject' в пользовательском пространстве. – Tsyvarev

ответ

0

Во-первых, просто делать kobject_put() не достаточно, вы должны использовать вместо этого kobject_del(). kobject_put() не делает полная уборка. В вашем случае, поскольку kobject_example - это файл (не каталог), просто «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. Перезагрузка проста, но это отлично, когда ваша система не имеет возможности выйти из строя.

+0

Я должен не согласиться с вами, kobject_put уменьшает счетчик ссылок для kobject и, следовательно, когда счетчик ссылок становится равным нулю, он удаляет объект. Я думаю, что это гораздо более чистое решение для его динамического удаления с помощью kobject_put. – Pradheep

+0

kobject_put достаточно хорош, если kobj не принадлежит kset. kobject_del() дополнительно вызовет kobj_kset_leave (kobj), который удалит его из kset. Надеюсь, это поможет. – user31986

+0

Кроме того, если вы новичок в программировании ядра и пробуете новые вещи, предпочитаете VM, это очень легко и быстро. Такой подход принимается, когда высокодоступная система испорчена. – user31986

Смежные вопросы