Por que operação de arquivo foi designada duas vezes no código de exemplo ldd3?

0

link

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;

podemos ver scull_fops foi atribuído duas vezes por cdev_init() e cdev.ops , por quê?

    
por Mark 27.08.2018 / 08:07

2 respostas

3

scull_fops não é atribuído duas vezes, é usado duas vezes. É definido em outro lugar no mesmo arquivo . seu endereço é passado para cdev_init e atribuído a dev->cdev.ops .

Como você mencionou, essa atribuição explícita para dev->cdev.ops é desnecessária, pois cdev_init também faz isso. Como Johan Myréen diz , isso é uma ineficiência no código de exemplo LDD3 - o código de exemplo é mais recente que a linha correspondente em cdev_init , então já era desnecessário quando foi escrito. (Seria interessante ver se o mesmo erro é reproduzido em outro lugar, para ver quanto código de driver “real” foi escrito baseado no exemplo do LDD3!)

A função pode ser simplificada para

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;
    err = cdev_add (&dev->cdev, devno, 1);
    /* Fail gracefully if need be */
    if (err)
        printk(KERN_NOTICE "Error %d adding scull%d", err, index);
}
    
por 27.08.2018 / 08:53
0

veja este link para confirmar duas vezes:

link

void cdev_init(struct cdev *cdev, const struct file_operations *fops)
{
  memset(cdev, 0, sizeof *cdev);
  INIT_LIST_HEAD(&cdev->list);
  kobject_init(&cdev->kobj, &ktype_cdev_default);
  cdev->ops = fops;
}
    
por 29.08.2018 / 04:18

Tags