Почему модуль не загрузился? (/ dev / scull0: нет такого устройства или адреса) - PullRequest
1 голос
/ 26 мая 2020

Из моего предыдущего вопроса: Как собрать внешние модули в ubuntu? Я думал, что не могу загрузить модуль из-за loading out-of-tree или tainting kernel, но из-за моего scull_init_module (источник ниже) у меня есть добавлен printk, поэтому я знаю, что загружаюсь из журнала ядра. Но я этого не сделал (в журнале нет вывода - журнал такой же, как по ссылке).

uname -a == 4.19.0-9-amd64 #1 SMP Debian 4.19.118-2 (2020-04-29) x86_64 GNU/Linux (без использования ubuntu - как по ссылке).

scull_init_module:

#ifndef scull_major
#define scull_major 0
#endif

#ifndef scull_nr_devs
#define scull_nr_devs 4
#endif

struct scull_dev *scull_devices; /*array of active devices */
static void scull_setup_cdev(struct scull_dev *, int); /*helper function (internal) */  
int scull_minor = 0;


int scull_init_module(void) {
   int i;
   dev_t dev = 0; 
   /* register devices */
   int result = 1;
   result = alloc_chrdev_region(&dev, scull_minor, scull_nr_devs, "scull"); /**comment later**/
   printk(KERN_ALERT"Passed %s %d \n in scull_init_module\n", __FUNCTION__, __LINE__);

   if(result < 0){
      printk(KERN_WARNING "scull: can't get major %d\n", scull_major);
      return result;
   }

   /* allocate space for devices */ 
   scull_devices = kmalloc(sizeof(struct scull_dev) * scull_nr_devs, GFP_KERNEL);
   if(!scull_devices){
      result = -1;
      goto fail;
   }

   /*initilization of devices */
   for(i=0; i<scull_nr_devs;i++){
      scull_devices[i].quantum = scull_quantum;
      scull_devices[i].qset = scull_qset;
      scull_setup_cdev(&scull_devices[i], i);
   }

   return 0;
   fail:
      scull_cleanup_module();
      return result;
}

module_init(scull_init_module);

Это в основном из Linux драйверов устройств, третье издание , глава 3. Но я пишу это от руки (без копирования / вставки). alloc_chrdev_region вызывается правильно, как и scull_setup_cdev, тогда где может быть проблема?

EDIT (вывод из dmesg): Из dmesg похоже, что он загружает модуль:

[ 2765.707018] scull: loading out-of-tree module taints kernel.
[ 2765.707106] scull: module verification failed: signature and/or required key missing - tainting kernel
[ 2765.707929] Passed scull_init_module 41 
                in scull_init_module

Но тогда все же узел в /dev/scull0 дает No such device or address

#mknod /dev/scull0 c 241 0
#cat /dev/scull0
cat: /dev/scull0: No such device or address

Итак, если устройство правильно зарегистрировано (см. Dmesg), и я создаю узел в иерархии / dev, то что означает no device or address? И почему я получаю это?

EDIT2 (функция scull_setup_cdev):

static void scull_setup_cdev(struct scull_dev *dev, int index){
    int err, devno=MKDEV(scull_major, scull_minor + index);

    cdev_init(&dev->cdev, &scull_fops);
    dev->cdev.owner = THIS_MODULE;
    dev->cdev.ops = &scull_fops; /**comment later**/
    err = cdev_add(&dev->cdev, devno, 1);   
    if (err) 
        printk(KERN_NOTICE "Error %d adding scull%d", err, index);
}
...