Не удалось создать символьное устройство в Linux ⇐ Linux
-
Anonymous
Не удалось создать символьное устройство в Linux
Я написал вот такой демонстрационный драйвер устройства:
#include #include #include #include #include #include #define CDEV_NAME "mycdev" структура my_char_dev { беззнаковый символ *ptr; структура семафора sem; структура cdev cdev; }; структура my_char_dev *mycdev; int my_char_open(инод структуры *inode, файл структуры *filp) { printk(KERN_INFO "%s\n", __FUNCTION__); вернуть 0; } int my_char_release(инод структуры *inode, файл структуры *filp) { printk(KERN_INFO "%s\n", __FUNCTION__); вернуть 0; } ssize_t my_char_read(файл структуры *filp, char __user *buf, size_t count, loff_t *f_pos) { printk(KERN_INFO "%s\n", __FUNCTION__); вернуть 0; } ssize_t my_char_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_ops) { printk(KERN_INFO "%s\n", __FUNCTION__); вернуть 0; } struct file_operations my_char_fops = { .владелец = ЭТОТ_МОДУЛЬ, .open = my_char_open, .release = my_char_release, .read = my_char_read, .write = my_char_write, }; статический int __init my_char_init (void) { mycdev = kmalloc(sizeof(struct my_char_dev), GFP_KERNEL); если (!mycdev) { printk(KERN_INFO "не удалось выделить место для устройства\n"); возврат -ЭНОМЕМ; } if (!alloc_chrdev_region(&mycdev->cdev.dev, 0, 1, CDEV_NAME)) printk(KERN_INFO "Успешное выделение области %s\n", CDEV_NAME); еще { printk(KERN_INFO "Ошибка выделения региона %s\n", CDEV_NAME); возврат -ЭНОМЕМ; } cdev_init(&mycdev->cdev, &my_char_fops); if (!cdev_add(&mycdev->cdev, mycdev->cdev.dev, 1)) printk(KERN_INFO "%s успешно добавило устройство\n", CDEV_NAME); еще { printk(KERN_INFO "%s не удалось добавить устройство\n", CDEV_NAME); unregister_chrdev_region(mycdev->cdev.dev, 1); возврат -ЭНОМЕМ; } вернуть 0; } void __exit my_char_exit(void) { cdev_del(&mycdev->cdev); unregister_chrdev_region(mycdev->cdev.dev, 1); kfree (mycdev); printk(KERN_INFO "%s\n", __FUNCTION__); } модуль_init (my_char_init); модуль_exit (my_char_exit); MODULE_AUTHOR("xdd"); MODULE_LICENSE("GPL"); Я вставляю модуль в ядро и могу найти mycdev, когда нахожу /proc/devices, я также создал узел устройства в /dev/ mycdev успешно с помощью mknod, но когда я пытаюсь использовать созданный мною /dev/mycdev, я получаю /dev/mycdev0: Нет такого устройство или адрес.
Я понятия не имею, почему это произошло.
Я хочу знать, почему этот процесс завершится неудачно. и что мне следует сделать, чтобы исправить мою программу.
Я написал вот такой демонстрационный драйвер устройства:
#include #include #include #include #include #include #define CDEV_NAME "mycdev" структура my_char_dev { беззнаковый символ *ptr; структура семафора sem; структура cdev cdev; }; структура my_char_dev *mycdev; int my_char_open(инод структуры *inode, файл структуры *filp) { printk(KERN_INFO "%s\n", __FUNCTION__); вернуть 0; } int my_char_release(инод структуры *inode, файл структуры *filp) { printk(KERN_INFO "%s\n", __FUNCTION__); вернуть 0; } ssize_t my_char_read(файл структуры *filp, char __user *buf, size_t count, loff_t *f_pos) { printk(KERN_INFO "%s\n", __FUNCTION__); вернуть 0; } ssize_t my_char_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_ops) { printk(KERN_INFO "%s\n", __FUNCTION__); вернуть 0; } struct file_operations my_char_fops = { .владелец = ЭТОТ_МОДУЛЬ, .open = my_char_open, .release = my_char_release, .read = my_char_read, .write = my_char_write, }; статический int __init my_char_init (void) { mycdev = kmalloc(sizeof(struct my_char_dev), GFP_KERNEL); если (!mycdev) { printk(KERN_INFO "не удалось выделить место для устройства\n"); возврат -ЭНОМЕМ; } if (!alloc_chrdev_region(&mycdev->cdev.dev, 0, 1, CDEV_NAME)) printk(KERN_INFO "Успешное выделение области %s\n", CDEV_NAME); еще { printk(KERN_INFO "Ошибка выделения региона %s\n", CDEV_NAME); возврат -ЭНОМЕМ; } cdev_init(&mycdev->cdev, &my_char_fops); if (!cdev_add(&mycdev->cdev, mycdev->cdev.dev, 1)) printk(KERN_INFO "%s успешно добавило устройство\n", CDEV_NAME); еще { printk(KERN_INFO "%s не удалось добавить устройство\n", CDEV_NAME); unregister_chrdev_region(mycdev->cdev.dev, 1); возврат -ЭНОМЕМ; } вернуть 0; } void __exit my_char_exit(void) { cdev_del(&mycdev->cdev); unregister_chrdev_region(mycdev->cdev.dev, 1); kfree (mycdev); printk(KERN_INFO "%s\n", __FUNCTION__); } модуль_init (my_char_init); модуль_exit (my_char_exit); MODULE_AUTHOR("xdd"); MODULE_LICENSE("GPL"); Я вставляю модуль в ядро и могу найти mycdev, когда нахожу /proc/devices, я также создал узел устройства в /dev/ mycdev успешно с помощью mknod, но когда я пытаюсь использовать созданный мною /dev/mycdev, я получаю /dev/mycdev0: Нет такого устройство или адрес.
Я понятия не имею, почему это произошло.
Я хочу знать, почему этот процесс завершится неудачно. и что мне следует сделать, чтобы исправить мою программу.
Мобильная версия