C - cdev初始化是Linux设备驱动程序:两种方法有什么区别



在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);

最新更新