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

Модератор: Модераторы разделов

Ответить
Аватара пользователя
жучара
Сообщения: 950
ОС: астралинукс

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

Сообщение жучара »

Друзья! Вот модуль 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.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5288
ОС: Gentoo

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

Сообщение /dev/random »

Добавьте \n в конец каждого printk. Без этого логам dmesg доверять нельзя. После этого, перед повторным экспериментом, убедитесь, что старый модуль выгружен.
Спасибо сказали:
IMB
Сообщения: 2561
ОС: Debian

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

Сообщение IMB »

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

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

Сообщение жучара »

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

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

Сообщение жучара »

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