https://github.com/martinezjavier/ldd3/blob/master/scull/main.c#L601
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;
我们可以看到andscull_fops
赋值了两次,为什么?cdev_init()
cdev.ops
scull_fops
没有分配两次,它被使用了两次。它在同一个文件的其他地方定义 ,然后它的地址被传递给,并分配给。cdev_init
dev->cdev.ops
正如您所提到的,这种显式分配
dev->cdev.ops
是不必要的,因为cdev_init
它也是如此。正如Johan Myréen 所说,这是 LDD3 示例代码中的低效率——示例代码比 中的相应行更新cdev_init
,因此在编写时就已经没有必要了。(看看是否在其他地方重现了同样的错误,看看有多少“真实”的驱动程序代码是基于 LDD3 示例编写的,这将很有趣!)该功能可以简化为
查看此链接以确认它做了两次:
https://github.com/torvalds/linux/blob/6f0d349d922ba44e4348a17a78ea51b7135965b1/fs/char_dev.c#L656