2016-09-12 9 views
0

Я только начал изучать драйверы символов персонажа Linux. Я создал простой модуль ядра, в котором я регистрирую устройство с помощью функции register_chrdev(). Я передал 0 в качестве аргумента функции, и ядро ​​возвращает мне доступное бесплатное доступное число. После этого я использую команду mknod для создания файла символьного устройства с возвращенным основным номером, и я успешно могу это сделать. Я загрузил драйвер в ядро, и связь между драйвером, файлом устройства и приложением пользовательского пространства прекрасна.Файл персонального устройства отсутствует после перезагрузки в Linux

Проблема в том, что при перезагрузке моей системы файл символьного устройства (созданный с использованием mknod) отсутствует в каталоге/dev.

Поэтому, пожалуйста, предложите решение этой проблемы, чтобы файл персонального устройства отображался в каталоге/dev даже после перезагрузки.

+2

'/ dev' - динамически созданная файловая система. это не актуал на диске, поэтому он обновляется NEW каждый раз, когда вы загружаете систему. если ваше приложение не станет частью пусковой цепочки и каждый раз воссоздает свое устройство, ваш файл исчезнет. –

+0

Итак, как я могу преодолеть эту проблему. –

+0

http://www.linuxquestions.org/questions/linux-newbie-8/create-a-device-file-using-udev-738448/ – stark

ответ

0

Одним из решений является заставить ваш драйвер создавать файлы в /dev динамически, вместо того чтобы создавать их с помощью команды mknod. Основная идея состоит в том, чтобы создать собственный класс устройства из функции инициализации модуля, вызвав class_create, а затем добавить устройства в класс, вызвав device_create.

Вам понадобится переменная типа struct class *, чтобы удерживать указатель на пользовательский класс. Эта переменная должна быть доступна различными функциями в модуле, поэтому должен быть объявлен вне каких-либо функций, и, как правило, объявляется static так:

static struct class *foo_class; 

Ваш функциональный модуль инициализации необходимо создать класс и проверить ошибки:

foo_class = class_create(THIS_MODULE, "foo"); 
    if (IS_ERR(foo_class)) { 
     /* Failed to create class. */ 
     rc = PTR_ERR(foo_class); 
     goto fail_class_create; 
    } 

(здесь goto fail_class_create переходит к метке, чтобы очистить что-либо сделано до сих пор, прежде чем вернуться ошибку Если вам не нравится это «на Goto ошибок» шаблон, не стесняйтесь, чтобы очистить здесь явно. перед возвратом ошибки.)

Если функция class_create успешно, он должен быть уничтожен, когда они больше не нужны в вашей функции модуля выхода, а также как часть очистки, если есть ошибки дальше вниз в вашем модуле функции инициализации:

class_destroy(foo_class); 

While класс создается, вы можете создавать (и уничтожать) устройства, принадлежащие этому классу (я называю это «устройством класса»), путем вызова device_create для создания устройства и device_destroy для уничтожения устройства. Обе эти функции используют номер узла устройства (комбинацию основного и младшего номера устройства), чтобы указать устройство класса, которое должно быть создано или уничтожено. Например, устройство класса может быть создан следующим образом:

struct device *csdev; 
    /* ... */ 
    csdev = device_create(foo_class, hwdev, MKDEV(foo_major, minor), privdata, "foo%u", minor); 
    if (IS_ERR(csdev)) { 
     /* Failed to create device. */ 
     rc = PTR_ERR(csdev); 
     /* Do any clean-up here. */ 
    } 

(Здесь foo_class указывает на пользовательский класс, созданный ранее; hwdev указывает на лежащего в основе «аппаратного устройства» или может быть установлен в NULL, если есть нет, лежащий в основе аппаратное устройство: foo_major - ваш основной номер устройства (выделено register_chrdev, minor - номер младшего устройства устройства, которое вы хотите создать, privdata - это частный указатель данных, обычно указывающий на некоторую личную структуру данных для вашего устройства, но он может be NULL; остальные параметры состоят из строки формата в формате printf плюс любые дополнительные параметры, необходимые для строки формата c введите имя устройства.)

В приведенном выше примере, если minor равно 0, устройство будет динамически создано как /dev/foo0.

Для того, чтобы уничтожить устройство, вызовите device_destroy следующим образом: (. Здесь, foo_class, foo_major и minor такие же, как передается device_create)

device_destroy(foo_class, MKDEV(foo_major, minor)); 

Вышеуказанные функции экспортируются как GPL только , поэтому, если вы хотите их использовать, ваш модуль должен будет объявить свою лицензию, используя следующее заявление:

MODULE_LICENSE("GPL"); 

 Смежные вопросы

  • Нет связанных вопросов^_^