Создание модуля ядра линукс и програмки к этому модулю.

Вопросы программного кода и архитектуры Linux

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Создание модуля ядра линукс и програмки к этому модулю.

Непрочитанное сообщение Olej » 28 авг 2022, 14:51

PaiMeiPetrovich писал(а):
28 авг 2022, 13:33
но при его инициализации создается файлик (некий узел что ли), обеспечивающий взаимодействие между ним и приложением?
Не файл, как таковой, а файловое имя в файловой системе UNIX, в дереве, ... /proc/xxx - над которым можно делать то же самое, что и с дисковыми файлами.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Создание модуля ядра линукс и програмки к этому модулю.

Непрочитанное сообщение Olej » 28 авг 2022, 15:36

PaiMeiPetrovich писал(а):
28 авг 2022, 13:33
Я тестил устройство с помощью утилиты 'cat', и соответственно, cat не смог ничего считать из /proc/mod_proc!
Естественно :lol: :!:
Потому что для cat модуль должен реализовывать операцию .proc_read - что у меня в коде было, но вы же его закомментировали? :-o :lol:
Для тестирования .proc_write нужно использовать утилиту, соответственно, echo.
Точно так же вы можете тестировать свой вход /proc/xxx из файлового менеджера mc - по F3 читаем записанное значение, по F4 записываем новое значение.

1). Я попробовал собрать ваш пример, чтобы посмотреть конкретно ... но у меня он просто не собирается! (Причём я, засомневавшись, проверил свой пример procfs - всё замечательно собирается).
Возможно это связано с версией ядра ... Для какого дистрибутива и ядра вы пробуете это собирать?

2). Операцию .proc_read не нужно исключать из модуля! Нужно иметь, для тестирования, симметричную пару операций: по .proc_write мы записываем новое значение, после чего для контроля читаем его по .proc_read ... и так много раз подряд.

PaiMeiPetrovich
Писатель
Сообщения: 36
Зарегистрирован: 26 авг 2022, 20:56
Контактная информация:

Re: Создание модуля ядра линукс и програмки к этому модулю.

Непрочитанное сообщение PaiMeiPetrovich » 28 авг 2022, 15:54

Вроде бы я понял, как это должно работать. У меня есть модуль, который при выполнении команды "sudo insmod hello.ko period=n" создает точку входа и начинает записывать строки в другой файл с периодом n. Далее, у нас имеется программа, которая при запуске, записывает новый период в точку входа. И, соответственно модуль должен считать это изменение в точке входа и изменить параметр периода уже у себя в коде. Для реализации этого, я вижу только один вариант:
В созданное "файловое имя" при инициализации модуля я записываю начальное значение периода.
Далее я запускаю мой цикл по записи константной строки в этот псевдофайл и, в теле цикла, я просто считываю этот период из этого файла ( с помощью kernel_read()??), перевожу строку в число ( тот же вопрос, kernel_atoi()??) и в функцию "msleep()" уже посылаю параметром это число.
Делаю я это для того, чтобы моментально отреагировать на изменения в точке входа, которые может произвести прикладное приложение (я же постоянно буду считывать информацию из этого файла)
Как вам идея? Не удивлюсь, если делать надо все по-другому:D
Последний раз редактировалось PaiMeiPetrovich 28 авг 2022, 16:09, всего редактировалось 2 раза.

PaiMeiPetrovich
Писатель
Сообщения: 36
Зарегистрирован: 26 авг 2022, 20:56
Контактная информация:

Re: Создание модуля ядра линукс и програмки к этому модулю.

Непрочитанное сообщение PaiMeiPetrovich » 28 авг 2022, 16:03

Olej писал(а):
28 авг 2022, 15:36
Потому что для cat модуль должен реализовывать операцию .proc_read - что у меня в коде было, но вы же его закомментировали?
Да, я же специально, так как хотел проверить, сможет ли считывать cat)
Olej писал(а):
28 авг 2022, 15:36
Возможно это связано с версией ядра ... Для какого дистрибутива и ядра вы пробуете это собирать?
Для версии 5.19.
Кстати, кстати, кстати! В версии моего ядра, на вход в функцию "proc_create" последним аргументом идет структура типа "proc_ops", а у вас там другого типа структура была. (Собственно, та структура, в которой описаны поля ".read", ".write")Может из-за этого не собирается?!

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Создание модуля ядра линукс и програмки к этому модулю.

Непрочитанное сообщение Olej » 28 авг 2022, 16:08

Olej писал(а):
28 авг 2022, 15:36
Я попробовал собрать ваш пример, чтобы посмотреть конкретно ... но у меня он просто не собирается!
Собрал на другом компьютере:

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

olej@esprimop420:~/2022/PaiMeiPetrovich$ uname -a
Linux esprimop420 5.10.0-16-amd64 #1 SMP Debian 5.10.127-2 (2022-07-23) x86_64 GNU/Linux
Никогда не нужно убирать корректировку инструкциями препроцессора на версию ядра:

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

#if LINUX_VERSION_CODE < KERNEL_VERSION(5,9,0)
const struct file_operations node_fops = {
   .owner = THIS_MODULE,
   .read  = node_read,
   .write  = node_write
#else
const struct proc_ops node_fops = {
   .proc_read  = node_read,
   .proc_write = node_write
#endif
};

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Создание модуля ядра линукс и програмки к этому модулю.

Непрочитанное сообщение Olej » 28 авг 2022, 16:11

Olej писал(а):
28 авг 2022, 16:08
Собрал

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

olej@esprimop420:~/2022/PaiMeiPetrovich$ sudo insmod mod_proc.ko
[sudo] пароль для olej:

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

olej@esprimop420:~/2022/PaiMeiPetrovich$ sudo dmesg | tail -n1
[960494.092631] ! /proc/mod_node installed

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

olej@esprimop420:~/2022/PaiMeiPetrovich$ ls -l /proc/mod_node
-rw-rw-rw- 1 root root 0 авг 28 16:02 /proc/mod_node

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

olej@esprimop420:~/2022/PaiMeiPetrovich$ echo 12345 > /proc/mod_node

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

olej@esprimop420:~/2022/PaiMeiPetrovich$ sudo dmesg | tail -n3
[960494.092631] ! /proc/mod_node installed
[960581.515037] ! write: 6 bytes
[960581.515046] ! put 6 bytes
Писать то оно пишет ... что-то и куда-то пишет ... Но проверить это нельзя, потому что не реализована операция чтения.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Создание модуля ядра линукс и програмки к этому модулю.

Непрочитанное сообщение Olej » 28 авг 2022, 16:11

PaiMeiPetrovich писал(а):
28 авг 2022, 16:03
Для версии 5.19.
Никогда не нужно собирать на последних версиях!

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Создание модуля ядра линукс и програмки к этому модулю.

Непрочитанное сообщение Olej » 28 авг 2022, 16:12

PaiMeiPetrovich писал(а):
28 авг 2022, 16:03
Для версии 5.19.
А откуда взяли инсталляцию с 5.19?
Какой дистрибутив?

PaiMeiPetrovich
Писатель
Сообщения: 36
Зарегистрирован: 26 авг 2022, 20:56
Контактная информация:

Re: Создание модуля ядра линукс и програмки к этому модулю.

Непрочитанное сообщение PaiMeiPetrovich » 28 авг 2022, 16:13

Olej писал(а):
28 авг 2022, 16:08
Никогда не нужно убирать корректировку инструкциями препроцессора на версию ядра:
Понял, спасибо, в финальной версии вставлю!
А почему не нужно собирать на последних версиях? :geek:
Дистрибутив Ubuntu

PaiMeiPetrovich
Писатель
Сообщения: 36
Зарегистрирован: 26 авг 2022, 20:56
Контактная информация:

Re: Создание модуля ядра линукс и програмки к этому модулю.

Непрочитанное сообщение PaiMeiPetrovich » 28 авг 2022, 16:14

Аааа, нет.... Стоп! Я не о том подумал! Убунту последней версии у меня стоит, как версия ядра там, даже не знаю. 5-15 должна быть, по идее. У меня там все заголовочные файлы хранятся

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 13 гостей