Я новичок в разработке драйверов устройств для Linux. Я не могу понять, что на самом деле делает cdev_add. Я просмотрел код простого драйвера устройства char и увидел, что функции cdev_add и device_create используются вместе. Например:
/* Create device class, visible in /sys/class */
dummy_class = class_create(THIS_MODULE, "dummy_char_class");
if (IS_ERR(dummy_class)) {
pr_err("Error creating dummy char class.\n");
unregister_chrdev_region(MKDEV(major, 0), 1);
return PTR_ERR(dummy_class);
}
/* Initialize the char device and tie a file_operations to it */
cdev_init(&dummy_cdev, &dummy_fops);
dummy_cdev.owner = THIS_MODULE;
/* Now make the device live for the users to access */
cdev_add(&dummy_cdev, devt, 1);
dummy_device = device_create(dummy_class,
NULL, /* no parent device */
devt, /* associated dev_t */
NULL, /* no additional data */
"dummy_char"); /* device name */
Что cdev_add и device_create делают в этом коде?





Чтобы использовать символьный драйвер, сначала вы должны зарегистрировать его в системе. Затем вы должны открыть его в пользовательском пространстве.
Функции cdev_init и cdev_add выполняют регистрацию символьного устройства.
cdev_add добавляет символьное устройство в систему. Когда функция cdev_add успешно завершается, устройство работает, и ядро может вызывать его операции.
Чтобы получить доступ к этому устройству из пользовательского пространства, вы должны создать узел устройства в /dev. Вы делаете это, создавая класс виртуального устройства с помощью class_create, затем создавая устройство и регистрируя его в sysfs с помощью функции device_create. device_create создаст файл устройства в /dev.
Прочтите Драйверы устройств Linux, третье издание, глава 3 (Драйверы Char), чтобы получить хорошее описание процесса (class_create и device_create не рассматриваются в книге).
Спасибо за ответ. У меня есть еще один вопрос. Должен ли я использовать cdev_init и cdev_add, если я использую атрибуты sysfs вместо open, write, read, ioctl и т. д.?
@overlord Нет, тогда вам не нужно регистрировать символьное устройство.
cdev из старой архитектуры ядра Linux, а для новых версий требуется dev_create. но dev_create по-прежнему зависит от cdev.