insmod lkm.ko вызывает cleanup_module вместо init_module в загружаемом модуле ядра

Я пытаюсь сделать свой первый загружаемый модуль ядра на debian wheezy 7.5. Я попробовал несколько примеров кода из разных руководств в Интернете, но он не работает для меня так, как я думаю.

Вот мой код:

#include <linux/module.h>
#include <linux/kernel.h>

void cleanup_module(void)
{
    printk(KERN_INFO "exit LKM...");
}

int init_module(void)
{
    printk(KERN_INFO "loading LKM...");
    return 0;
}

и я компилирую его с помощью Makefile, который выглядит так

obj-m += lkm.o
all:
    sudo make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

Таким образом, он компилируется нормально, но когда я загружаю LKM с помощью "$ sudo insmod lkm.ko", а затем просматриваю сообщения журнала, он возвращает "exit LKM ..." < / strong>, поэтому кажется, что insmod вызывает системный вызов cleanup_module вместо init_module. То же самое происходит, когда я использую «$ sudo rmmod lkm», я возвращаю «загрузка LKM ..» в сообщениях журнала. Так что я действительно не знаю, почему это так, и все, что я нашел в сети, это то, что insmod загружает LKM через init_module () и так далее ...

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

Спасибо


person henk    schedule 13.06.2014    source источник
comment
Попробуйте еще раз, но поместите символы новой строки в конец строк printk.   -  person Zan Lynx    schedule 14.06.2014
comment
Решил! Большое спасибо! Думаю, это была ошибка новичка ... @ZanLynx Не могли бы вы объяснить, зачем мне их ставить?   -  person henk    schedule 14.06.2014


Ответы (1)


Поместите символы новой строки или \n в конец ваших строк printk.

Проблема, которую вы видите, вызвана отложенной печатью. Готов поспорить, что при первом запуске insmod вы вообще не увидели никаких результатов. Затем вы проделали еще кое-что, а затем выгрузили модуль. В этот момент буфер очистил предыдущее сообщение, заставив его СМОТРЕТЬ, как если бы он печатал сообщение инициализации во время выгрузки.

На самом деле происходило то, что ядро ​​сохраняло строку, чтобы вывести полную строку, как только оно увидит новую строку. Эта новая строка появилась позже.

person Zan Lynx    schedule 14.06.2014