Ядро всегда возвращает в качестве ошибки отрицательный код - читайте текст, там всё про это есть.PaiMeiPetrovich писал(а): ↑27 авг 2022, 13:263)Что означают эти коды ошибок: -ENOENT, -EIO, -EPERM (и почему тут знак минуса тоже интересно)
Создание модуля ядра линукс и програмки к этому модулю.
Модератор: Olej
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Создание модуля ядра линукс и програмки к этому модулю.
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Создание модуля ядра линукс и програмки к этому модулю.
Это обычные (из POSIX API) флаги для файла прав доступа: читать/писать, пользователь/группа/ rootPaiMeiPetrovich писал(а): ↑27 авг 2022, 13:262)S_IRUSR | S_IRGRP | S_IROTH | S_IWUSR - Эти флаги что означают?
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Создание модуля ядра линукс и програмки к этому модулю.
Идите: https://elixir.bootlin.com/linux/latest/sourcePaiMeiPetrovich писал(а): ↑27 авг 2022, 13:241)ssize_t kernel_write(struct file *, const void *, size_t, loff_t *) - какой параметр в этой функции что означает?
Там вы можете выбирать версию ядра + поиск, где наберите: kernel_write - там много вокруг комментариев которые кое-что объясняют.
(Вот я ядром приходится обращаться только так.)
Параметры kernel_write() меняются от версии к версии ...
В процитированном прототипе:
- struct file * - файл который должен быть предварительно open()
- const void * - буфер откуда пишется
- size_t - размер того что пишется
- loff_t - смещение в файле от начала от которого писать
-
- Писатель
- Сообщения: 36
- Зарегистрирован: 26 авг 2022, 20:56
- Контактная информация:
Re: Создание модуля ядра линукс и програмки к этому модулю.
Да, я даже почитал уже эту главу, но неочень понял, как это работает..."Можно как-то усыпить" процесс?
Вот как я понимаю, как должна работать программа из первой части задания:
1) На вход, вместе с загрузкой модуля, подается имя логфайла, куда я буду записывать информацию и строка, которую я хочу записать (хотя, строку "hello from kernel" можно инициализировать уже в самой функции module_init)
2)Далее инициализируем все необходимые данные и запускаем бесконечный цикл while(1), в котором главным действующим лицом будет функция записи строки в файл, после которой как раз будет функция таймера (эти 2 функции в цикле), задающая период записи строки.
Все верно, или я что-то упускаю?
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Создание модуля ядра линукс и програмки к этому модулю.
Я бы делал так (я всегда делаю так ) - первым этапом делать упрощённую версию модуля:PaiMeiPetrovich писал(а): ↑27 авг 2022, 13:52Вот как я понимаю, как должна работать программа из первой части задания:
- Модуль после старта, в бесконечном цикле, с константным периодом T (сек.) пишет в файл с константным именем F строку вида:
Код: Выделить всё
<jiffies> "Hello from kernel module\n"
Значения константные означает что они прямо записаны константами в код модуля.
- только после того как это заработает, делаем T и F параметрами загрузки модуля, типа:
Код: Выделить всё
# insmod mymod file=./my.log period=3
-
- Писатель
- Сообщения: 36
- Зарегистрирован: 26 авг 2022, 20:56
- Контактная информация:
Re: Создание модуля ядра линукс и програмки к этому модулю.
Такс, отлично отлично отлично, картинка складывается...
Можете указать какую-нибудь конкретную функцию времени, куда этот период запихать)
А я, пока что, хочу сам поковыряться часик-полтора, шоб лучше понять как там все устроено...
Можете указать какую-нибудь конкретную функцию времени, куда этот период запихать)
А я, пока что, хочу сам поковыряться часик-полтора, шоб лучше понять как там все устроено...
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Создание модуля ядра линукс и програмки к этому модулю.
Вам по существу и таймер не нужен, просто пассивная пауза в цикле:
Код: Выделить всё
#include <linux/delay.h>
...
while (1) {
kernel_write(...);
msleep(pause);
}
-
- Писатель
- Сообщения: 36
- Зарегистрирован: 26 авг 2022, 20:56
- Контактная информация:
Re: Создание модуля ядра линукс и програмки к этому модулю.
Вот, да, пауза, это то чтот надо!
-
- Писатель
- Сообщения: 36
- Зарегистрирован: 26 авг 2022, 20:56
- Контактная информация:
Re: Создание модуля ядра линукс и програмки к этому модулю.
Ну, все супер, первая часть работает, каждую строчку в коде вразумлю! (Возможно, не так глубоко, но всё же)
Переходим ко 2-й части!
Но, для начала, давайте определимся с актерами нашей пьессы.
Во второй задаче есть 3 действующих лица: 1) Программа из пространства пользователя; 2) Модуль ядра, который мы сделали в первой задаче; 3) Символьное устройство (драйвер?!), которое должно обеспечить взаимодействие между модулем ядра и программкой.
Все верно?
Переходим ко 2-й части!
Думаю, это то что надо. По крайней мере, мне будет яснее этот вариант, поскольку о символьном устройстве я читал и имею небольшое представление. Я не понимаю как это должно все вместе взаимодействовать, поэтому у меня созрел ряд вопросов (а, как говорил Гэндальф:"Вопросы...Вопросы требуют ответов!")
Но, для начала, давайте определимся с актерами нашей пьессы.
Во второй задаче есть 3 действующих лица: 1) Программа из пространства пользователя; 2) Модуль ядра, который мы сделали в первой задаче; 3) Символьное устройство (драйвер?!), которое должно обеспечить взаимодействие между модулем ядра и программкой.
Все верно?
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Создание модуля ядра линукс и програмки к этому модулю.
Это может быть не лучший вариант ... и на нём можно застрять надолго.PaiMeiPetrovich писал(а): ↑27 авг 2022, 18:18По крайней мере, мне будет яснее этот вариант, поскольку о символьном устройстве я читал и имею небольшое представление
Операции read()/write() для него в этой задаче бессмысленны, нужно возиться с ioctl() ддя чтения (по хорошему) и записи для 2-х значений (параметров) - итого нужно определять 4 (кода) операции, и там не сильно сложно, но хлопотно...
Через /proc реализовать будет и а). проще и б). красивее.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя