Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание устройства. и писать в него и читать с него. 
:(
    Опции темы
Tuma
Дата 16.10.2008, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 13.10.2008

Репутация: нет
Всего: нет



Привет всем!
Задача следующая - написать модуль, который, при загрузке будет создавать устройство (не связанное с каким либо аппаратным средством). Модуль должен будет уметь принять строку записанную в это устройство, и выдать что-то при чтении из него.
При выгрузке, разумеется, удалять фаил устройства.

Простейший модуль я сделал. Он работает - загружается, выгружается и даже выводит что-то в консоль при загрузке.  smile 
Теперь нужно создать устройство (програмно). Подскажите пожалуйста какой нибудь пример или статью, откуда можно было бы взять процедуру создания устройства.

Простите, может не очень умею искать, но на форуме не нашёл тем про создания устройств.
PM MAIL   Вверх
GrayCardinal
Дата 16.10.2008, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



Tuma, 
Какая оська ?


--------------------
PM MAIL WWW   Вверх
MAKCim
Дата 17.10.2008, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін д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() создаем устройство

зы. советую ознакомится с этим


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
GrayCardinal
Дата 17.10.2008, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



MAKCim, 
Да вроде ж udev сам девайс делает апосля register_chrdev


--------------------
PM MAIL WWW   Вверх
MAKCim
Дата 17.10.2008, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(GrayCardinal @  17.10.2008,  09:35 Найти цитируемый пост)
Да вроде ж udev сам девайс делает апосля register_chrdev 

register_chrdev() девайс не создает  smile 
он даже не вызывает никаких callbcak'ов после регистрации
можешь убедится, посмотрев реализацию

а вот после device_create() udev вполне может создать устройство вызвав mknod()
но человеку, я так понял, нужна програмная реализация
одна из них как раз через сокет


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Tuma
Дата 24.10.2008, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 */
};


Но если честно пока не очень понятно.
Пока я знаю только что мне надо будет писать в устройство и читать из него.
PM MAIL   Вверх
MAKCim
Дата 24.10.2008, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(Tuma @  24.10.2008,  11:53 Найти цитируемый пост)
Ведь он не должен совпадать c major'ами других устройств, верно?

не обязательно
MAJOR номер определяет тип устройства, а конкретное устройство определяется MINOR номером
список MAJOR номеров лежит в linux/major.h
т. е если твое устройство принадлежит существующему типу, то и выбирай соответствующий тип из linux/major.h
иначе бери первый свободный номер


Цитата(Tuma @  24.10.2008,  11:53 Найти цитируемый пост)
Это адрес структуры с операциями которые будут производиться с устройством, я верно понял? И как их задавать?

верно
что значит как задавать?



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Tuma
Дата 24.10.2008, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 13.10.2008

Репутация: нет
Всего: нет



MAKCim, спасибо, понял. major.h изучил. А как мне получить первый свободный? Там нет дефайна последнего элемента.  smile 


Цитата(MAKCim @  24.10.2008,  12:42 Найти цитируемый пост)
что значит как задавать?

Ну вот мне нужно создать устройство и я хотел бы чтобы в последствии пользователи могли бы писать в него и читать из него.
Как мне правильно сформировать параметр file_operations?

PM MAIL   Вверх
MAKCim
Дата 24.10.2008, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(Tuma @  24.10.2008,  15:23 Найти цитируемый пост)
А как мне получить первый свободный? Там нет дефайна последнего элемента. 

берешь максимальный и прибавляешь 1  smile 


Цитата(Tuma @  24.10.2008,  15:23 Найти цитируемый пост)
Как мне правильно сформировать параметр file_operations?

неужели нельзя посмотреть внимательно на drivers/char/mem.c?
а именно mem_fops, kmem_fops, null_fops
тут

инициализируешь поля структуры file_operations адресами своих функций
в качестве примера реализации все там же посмотри read_zero, write_null


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Tuma
Дата 31.10.2008, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 13.10.2008

Репутация: нет
Всего: нет



Цитата(MAKCim @  24.10.2008,  21:11 Найти цитируемый пост)
берешь максимальный и прибавляешь 1


А как мне взять максимальный? Там нет дефайна обозначающего максимальный major. А если точнее - как мне узнать какой максимальный major сейчас в системе?

Так, кажется я разобрался. Если поставить желаемый MAJOR равным нулю, то функция автоматически зарезервирует для меня первый свободный MAJOR и его и вернёт.
Я прав?

Это сообщение отредактировал(а) Tuma - 31.10.2008, 12:56
PM MAIL   Вверх
MAKCim
Дата 31.10.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(Tuma @  31.10.2008,  12:47 Найти цитируемый пост)
Я прав?

прав
тут


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
MAKCim
Дата 31.10.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(Tuma @  31.10.2008,  12:47 Найти цитируемый пост)
Я прав?

прав
тут


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Tuma
Дата 31.10.2008, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 13.10.2008

Репутация: нет
Всего: нет



MAKCim, спасибо.  smile С этим понятно, работает, возвращает значение MAJOR'а.

Теперь не получается создать класс устройства.

Код

  static struct class *MathDevClass;
...
  MathDevClass = class_create (THIS_MODULE, "math");
...

Это собирается, линкуется:
Код

bash-3.1# ./build.sh
Building module:
make: Entering directory `/usr/src/linux-2.6.21.5'
  CC [M]  /root/ETU/hello-1.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /root/ETU/hello-1.mod.o
  LD [M]  /root/ETU/hello-1.ko
make: Leaving directory `/usr/src/linux-2.6.21.5'


Но модуль не грузится.
insmod: error inserting './hello-1.ko': -1 Unknown symbol in module

Что я делаю не так?
PM MAIL   Вверх
MAKCim
Дата 31.10.2008, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(Tuma @  31.10.2008,  15:50 Найти цитируемый пост)
Что я делаю не так? 

class_create - макрос, раскрывается в вызов __class_create
__class_create экспортируется как GPL символ, чтобы его заюзать, добавь в код модуля
Код

MODULE_LICENSE("GPL");



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bsa
Дата 29.4.2010, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Позволю поднять эту тему, так как мой вопрос полностью идентичен.

Я пишу драйвер для нашей платы. Модуль проприетарный, т.е. MODULE_LICENSE("Proprietary"). Будет ли мне class_create доступен? И что тогда делать? В принципе, я имею доступ к устройству, после создания какого-нибудь файла-устройства с нужным мажорным номером. Но хотелось бы сделать более правильно.

Это сообщение отредактировал(а) bsa - 29.4.2010, 20:21
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0596 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.