![]() |
|
Модераторы: xvr |
![]()
|
|
| Tuma |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 13.10.2008 Репутация: нет Всего: нет |
Привет всем!
Задача следующая - написать модуль, который, при загрузке будет создавать устройство (не связанное с каким либо аппаратным средством). Модуль должен будет уметь принять строку записанную в это устройство, и выдать что-то при чтении из него. При выгрузке, разумеется, удалять фаил устройства. Простейший модуль я сделал. Он работает - загружается, выгружается и даже выводит что-то в консоль при загрузке. Теперь нужно создать устройство (програмно). Подскажите пожалуйста какой нибудь пример или статью, откуда можно было бы взять процедуру создания устройства. Простите, может не очень умею искать, но на форуме не нашёл тем про создания устройств. |
|||
|
||||
| GrayCardinal |
|
|||
|
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
Tuma,
Какая оська ? |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
1. регистрируем устройство-контейнер функцией register_chrdev()
2. создаем конкретное устройство через device_create() 3. пишем демон, который слушает AF_NETLINK сокет (протокол = NETLINK_KOBJECT_UEVENT, PID = 1) при генерации ядром KOBJ_ADD события на сокет придет пакет с MAJOR/MINOR номерами устройства через mknod() создаем устройство зы. советую ознакомится с этим -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| GrayCardinal |
|
|||
|
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
MAKCim,
Да вроде ж udev сам девайс делает апосля register_chrdev |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
register_chrdev() девайс не создает он даже не вызывает никаких callbcak'ов после регистрации можешь убедится, посмотрев реализацию а вот после device_create() udev вполне может создать устройство вызвав mknod() но человеку, я так понял, нужна програмная реализация одна из них как раз через сокет -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Tuma |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 13.10.2008 Репутация: нет Всего: нет |
Добрый день!
Спасибо за отклики. Система у меня пока Linux 2.6.х.х Появились вопросы по функции register_chrdev. register_chrdev использует три аргумента : int major - основной номер устройства. srtring name - имя устройства. адрес #DEVICE#_fops структуры file_operations. Что такое int major и srtring name я хотя бы представляю себе как пользователь. Вопрос в каком виде задаётся major? Ведь он не должен совпадать c major'ами других устройств, верно? В примере что вы мне прислали (про память) стоит просто define 1, т.е. единица. Как мне выбрать major для себя? Второе - адрес #DEVICE#_fops структуры file_operations. Это адрес структуры с операциями которые будут производиться с устройством, я верно понял? И как их задавать? В примере про память стоит static const struct file_operations memory_fops = { .open = memory_open, /* just a selector for the real open */ }; Но если честно пока не очень понятно. Пока я знаю только что мне надо будет писать в устройство и читать из него. |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
не обязательно MAJOR номер определяет тип устройства, а конкретное устройство определяется MINOR номером список MAJOR номеров лежит в linux/major.h т. е если твое устройство принадлежит существующему типу, то и выбирай соответствующий тип из linux/major.h иначе бери первый свободный номер
верно что значит как задавать? -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Tuma |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 13.10.2008 Репутация: нет Всего: нет |
MAKCim, спасибо, понял. major.h изучил. А как мне получить первый свободный? Там нет дефайна последнего элемента.
Ну вот мне нужно создать устройство и я хотел бы чтобы в последствии пользователи могли бы писать в него и читать из него. Как мне правильно сформировать параметр file_operations? |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
берешь максимальный и прибавляешь 1 неужели нельзя посмотреть внимательно на drivers/char/mem.c? а именно mem_fops, kmem_fops, null_fops тут инициализируешь поля структуры file_operations адресами своих функций в качестве примера реализации все там же посмотри read_zero, write_null -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Tuma |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 13.10.2008 Репутация: нет Всего: нет |
А как мне взять максимальный? Там нет дефайна обозначающего максимальный major. А если точнее - как мне узнать какой максимальный major сейчас в системе? Так, кажется я разобрался. Если поставить желаемый MAJOR равным нулю, то функция автоматически зарезервирует для меня первый свободный MAJOR и его и вернёт. Я прав? Это сообщение отредактировал(а) Tuma - 31.10.2008, 12:56 |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Tuma |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 13.10.2008 Репутация: нет Всего: нет |
MAKCim, спасибо.
Теперь не получается создать класс устройства.
Это собирается, линкуется:
Но модуль не грузится. insmod: error inserting './hello-1.ko': -1 Unknown symbol in module Что я делаю не так? |
||||
|
|||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
class_create - макрос, раскрывается в вызов __class_create __class_create экспортируется как GPL символ, чтобы его заюзать, добавь в код модуля
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
Позволю поднять эту тему, так как мой вопрос полностью идентичен.
Я пишу драйвер для нашей платы. Модуль проприетарный, т.е. MODULE_LICENSE("Proprietary"). Будет ли мне class_create доступен? И что тогда делать? В принципе, я имею доступ к устройству, после создания какого-нибудь файла-устройства с нужным мажорным номером. Но хотелось бы сделать более правильно. Это сообщение отредактировал(а) bsa - 29.4.2010, 20:21 |
|||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |