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

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

Модератор: Olej

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

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

Непрочитанное сообщение Olej » 27 авг 2022, 13:34

PaiMeiPetrovich писал(а):
27 авг 2022, 13:26
3)Что означают эти коды ошибок: -ENOENT, -EIO, -EPERM (и почему тут знак минуса тоже интересно)
Ядро всегда возвращает в качестве ошибки отрицательный код - читайте текст, там всё про это есть.

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

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

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

PaiMeiPetrovich писал(а):
27 авг 2022, 13:26
2)S_IRUSR | S_IRGRP | S_IROTH | S_IWUSR - Эти флаги что означают?
Это обычные (из POSIX API) флаги для файла прав доступа: читать/писать, пользователь/группа/ root

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

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

Непрочитанное сообщение Olej » 27 авг 2022, 13:44

PaiMeiPetrovich писал(а):
27 авг 2022, 13:24
1)ssize_t kernel_write(struct file *, const void *, size_t, loff_t *) - какой параметр в этой функции что означает?
Идите: https://elixir.bootlin.com/linux/latest/source
Там вы можете выбирать версию ядра + поиск, где наберите: kernel_write - там много вокруг комментариев которые кое-что объясняют.
(Вот я ядром приходится обращаться только так.)

Параметры kernel_write() меняются от версии к версии ...
В процитированном прототипе:
- struct file * - файл который должен быть предварительно open()
- const void * - буфер откуда пишется
- size_t - размер того что пишется
- loff_t - смещение в файле от начала от которого писать

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

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

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

Olej писал(а):
27 авг 2022, 13:16
Там же есть целая глава про таймеры... Таймеры есть разные, и это нужно читать, тут одним примером-файлом не покажешь.
Да, я даже почитал уже эту главу, но неочень понял, как это работает..."Можно как-то усыпить" процесс?
Вот как я понимаю, как должна работать программа из первой части задания:
1) На вход, вместе с загрузкой модуля, подается имя логфайла, куда я буду записывать информацию и строка, которую я хочу записать (хотя, строку "hello from kernel" можно инициализировать уже в самой функции module_init)
2)Далее инициализируем все необходимые данные и запускаем бесконечный цикл while(1), в котором главным действующим лицом будет функция записи строки в файл, после которой как раз будет функция таймера (эти 2 функции в цикле), задающая период записи строки.
Все верно, или я что-то упускаю?

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

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

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

PaiMeiPetrovich писал(а):
27 авг 2022, 13:52
Вот как я понимаю, как должна работать программа из первой части задания:
Я бы делал так (я всегда делаю так :lol: ) - первым этапом делать упрощённую версию модуля:

- Модуль после старта, в бесконечном цикле, с константным периодом T (сек.) пишет в файл с константным именем F строку вида:

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

<jiffies> "Hello from kernel module\n"
Я добавил перед текстом переменную ядра jiffies - это внутренний счётчик времени ядра ... иначе тупо выводить "Hello..." очень скучно. :lol:
Значения константные означает что они прямо записаны константами в код модуля.

- только после того как это заработает, делаем T и F параметрами загрузки модуля, типа:

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

# insmod mymod file=./my.log period=3
- и только после того как это заработает, приелываем интерфейс (на выбор) из пространства пользователя|, приложения.

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

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

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

Такс, отлично отлично отлично, картинка складывается...
Можете указать какую-нибудь конкретную функцию времени, куда этот период запихать)
А я, пока что, хочу сам поковыряться часик-полтора, шоб лучше понять как там все устроено...

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

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

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

PaiMeiPetrovich писал(а):
27 авг 2022, 13:52
после которой как раз будет функция таймера
Вам по существу и таймер не нужен, просто пассивная пауза в цикле:

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

#include <linux/delay.h>
...
while (1) {
    kernel_write(...);
    msleep(pause);
}
Только разберитесь с размерностью pause и как его вычислить (при загрузке) из вашего периода T сек.


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

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

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

Ну, все супер, первая часть работает, каждую строчку в коде вразумлю! (Возможно, не так глубоко, но всё же)
Переходим ко 2-й части!
Olej писал(а):
27 авг 2022, 13:14
а). создать символьное устройство ... /dev/mymod - которое могло бы принимать команды по ioctl();
Думаю, это то что надо. По крайней мере, мне будет яснее этот вариант, поскольку о символьном устройстве я читал и имею небольшое представление. Я не понимаю как это должно все вместе взаимодействовать, поэтому у меня созрел ряд вопросов (а, как говорил Гэндальф:"Вопросы...Вопросы требуют ответов!")
Но, для начала, давайте определимся с актерами нашей пьессы.
Во второй задаче есть 3 действующих лица: 1) Программа из пространства пользователя; 2) Модуль ядра, который мы сделали в первой задаче; 3) Символьное устройство (драйвер?!), которое должно обеспечить взаимодействие между модулем ядра и программкой.
Все верно?

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

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

Непрочитанное сообщение Olej » 27 авг 2022, 18:47

PaiMeiPetrovich писал(а):
27 авг 2022, 18:18
По крайней мере, мне будет яснее этот вариант, поскольку о символьном устройстве я читал и имею небольшое представление
Это может быть не лучший вариант ... и на нём можно застрять надолго. :-(
Операции read()/write() для него в этой задаче бессмысленны, нужно возиться с ioctl() ддя чтения (по хорошему) и записи для 2-х значений (параметров) - итого нужно определять 4 (кода) операции, и там не сильно сложно, но хлопотно...

Через /proc реализовать будет и а). проще и б). красивее. :lol:

Ответить

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

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

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