Страница 1 из 1

Функция инициализации модуля ядра работает как функция завершения и наоборот.

Добавлено: 02.08.2022 22:05
жучара
Друзья! Вот модуль my_module.c.

Код: Выделить всё

#include <linux/module.h>

int init_module (void)
{
       printk (KERN_INFO "Hello, loading!");
       return 0;
}

void cleanup_module (void)
{
       printk (KERN_INFO "Leaving");
}

MODULE_LICENSE("GPL");
То есть мы его загрузим, должно вывестись "Hello, loading!". А после выгрузки- "Leaving". Инфу взял здесь
На всякий случай, вот Makefile. Собирается нормально.
Makefile

Код: Выделить всё

obj-m += my_module.o

all:
       make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
       make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Соберём (make), загрузим модуль и посмотрим, чё он напечатал:

Shell

$ sudo dmesg -c > /dev/null
$ sudo insmod my_module.ko
$ sudo dmesg -e
[авг 2 23:51] Leaving
$
Нормально это вообще? Теперь выгружаем и опять смотрим:

Shell

$ sudo dmesg -c > /dev/null
$ sudo insmod my_module.ko
$ sudo dmesg -e
[авг 2 23:51] Leaving
$
Вот и всё, собсно. ЧЯДНТ? Можно, конечно, задействовать всякие другие функции типа
module_init и module_exit, но хотелось бы разобраться с этим вопросом. Спасибо, кто откликнется. Debian 11.

Re: Функция инициализации модуля ядра работает как функция завершения и наоборот.

Добавлено: 03.08.2022 08:05
/dev/random
Добавьте \n в конец каждого printk. Без этого логам dmesg доверять нельзя. После этого, перед повторным экспериментом, убедитесь, что старый модуль выгружен.

Re: Функция инициализации модуля ядра работает как функция завершения и наоборот.

Добавлено: 03.08.2022 09:51
IMB
Можно, конечно, задействовать всякие другие функции типа
module_init и module_exit, но хотелось бы разобраться с этим вопросом
Что значит можно? Рекомендую взять за пример текущий код linux а не примеры из интернета, у меня сейчас под рукой linux-2.6.32 и там используются module_init и module_exit

Re: Функция инициализации модуля ядра работает как функция завершения и наоборот.

Добавлено: 03.08.2022 09:57
жучара
IMB писал(а):
03.08.2022 09:51
Можно, конечно, задействовать всякие другие функции типа
module_init и module_exit, но хотелось бы разобраться с этим вопросом
Что значит можно? Рекомендую взять за пример текущий код linux а не примеры из интернета, у меня сейчас под рукой linux-2.6.32 и там используются module_init и module_exit
"Можно" это значит, что указанному источнику можно доверять. Наверное.

Re: Функция инициализации модуля ядра работает как функция завершения и наоборот.

Добавлено: 03.08.2022 09:58
жучара
/dev/random писал:
03.08.2022 08:05
Добавьте \n в конец каждого printk. Без этого логам dmesg доверять нельзя. После этого, перед повторным экспериментом, убедитесь, что старый модуль выгружен.
Помогло, спасибо.