cdev初始化是linux设备驱动程序:两个方面有什么区别?

时间:2015-07-20 15:37:42

标签: c linux pointers structure linux-device-driver

在书Linux Device Drivers (third edition)中,他们说:

  

分配和初始化其中一种方法有两种方法   结构。如果您希望获得独立的cdev结构   运行时,您可以使用以下代码执行此操作:

     

struct cdev * my_cdev = cdev_alloc();

     

my_cdev-> ops =& my_fops;

     

然而,您可能希望嵌入cdev结构   在您自己的设备特定结构内;这就是scull   确实。在这种情况下,您应该初始化您拥有的结构   已经分配:

     

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结构的各个成员,而不是使用cdev_init()函数吗?或者cdev_init()执行任何额外的任务?

1 个答案:

答案 0 :(得分:3)

cdev_alloc分配一个新的struct cdev对象并返回指向它的指针。

cdev_init初始化由您分配的现有未初始化struct cdev

实际上,cdev_alloc相当于:

struct cdev* p = malloc(sizeof(struct cdev));
cdev_init(p, opts);