在Linux设备驱动程序(第三版)一书中,他们说:
有两种分配和初始化方法结构。如果您希望在运行时,您可以使用如下代码:
struct cdev *my_cdev = cdev_alloc();
my_cdev->ops = &my_fops;
然而,您可能想要嵌入cdev结构在您自己的设备特定结构中;这就是桨所做的事。在这种情况下,应该初始化现有的结构已分配:void cdev_init(struct cdev *cdev, struct file_operations *fops);
我不明白第二部分。即使我们在特定于设备的结构中拥有cdev结构,为什么我们不能使用第一种方法进行初始化?
例如,如果我有自己的设备专用结构体foo_dev,并且my_cdev是它的一部分,
struct foo_dev my_foo_dev{
cdev* my_cdev;
...
}
为什么我不能用
my_foo_dev->my_cdev = cdev_alloc( );
my_foo_dev->my_cdev->ops = &my_fops;
?
具体来说,不是使用cdev_init()函数,我们可以不只是初始化cdev结构的单个成员使用赋值吗?或者cdev_init()执行任何额外的任务?
cdev_alloc
分配一个新的struct cdev
对象并返回指向它的指针。
cdev_init
初始化一个现有的未初始化的struct cdev
,由您分配。
实际上,cdev_alloc
相当于:
struct cdev* p = malloc(sizeof(struct cdev));
cdev_init(p, opts);