Модуль init не создает внутренне файл устройства
Я новичок в программировании драйверов устройств Linux, поэтому, возможно, мой вопрос несколько наивен.
Это относится к области символьных устройств, но, возможно, относится и к другим случаям (??).
Насколько я понимаю, в методе __init модуля должна выполняться вся необходимая инициализация модуля, и после выполнения этой функции модуль должен иметь возможность обрабатывать любые запросы, которые он получает от ядра и / или приложения пользовательского пространства., Кроме того, как часть метода __init, наш модуль должен получить старший номер (при условии, что мы выделяем его динамически), а затем создать "соответствующий" файл устройства в каталоге /dev. Есть несколько способов сделать это.
1) Сам драйвер может распечатать недавно назначенный номер, и мы можем сделать файл устройства вручную.
2) Недавно зарегистрированное устройство будет иметь запись в /proc/devices, и мы можем либо создать файл устройства вручную, либо написать сценарий оболочки для чтения файла и создания файла устройства.
3) После успешной регистрации наш драйвер может создать файл устройства с помощью системного вызова mknod и rm во время вызова cleanup_module.
Теперь, насколько я понимаю, если в методе __init нет некоторого фрагмента кода, который "приостанавливает" завершение метода __init ДО того, как мы создадим файл устройства -> это означает, что наш модуль потенциально может начать получать запросы БЕЗ устройства файл готов, не проблема ли (если мы выберем первый или второй подход)?
static int major;
static struct file_operations fops = {
.owner = THIS_MODULE,
.read = dev_read,
.write = dev_write,
.open = dev_open,
.release = dev_release
};
static int __init myModuleInitMethod()
{
major = register_chardev(0, “myChaeDev”, &fops);
// some more initialization
// ...
// yet no creation of the device file, using mknod
} // myModuleInitMethod terminates and device file isn’t ready – problem ??
Не стесняйтесь отметить некоторые другие моменты для рассмотрения в случае, если я не упомянул их. Спасибо,
Guy.