Одним из решений является заставить ваш драйвер создавать файлы в /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");
'/ dev' - динамически созданная файловая система. это не актуал на диске, поэтому он обновляется NEW каждый раз, когда вы загружаете систему. если ваше приложение не станет частью пусковой цепочки и каждый раз воссоздает свое устройство, ваш файл исчезнет. –
Итак, как я могу преодолеть эту проблему. –
http://www.linuxquestions.org/questions/linux-newbie-8/create-a-device-file-using-udev-738448/ – stark