cdev_alloc和cdev_init有什么区别

时间:2013-12-26 11:16:51

标签: linux-device-driver

我正在创建一个角色设备。我发现了两种初始化char设备的方法

cdev_alloc

cdev_init

根据书,如果我在我的设备结构中嵌入struct cdev,那么我应该使用cdev_init

任何人都能告诉我他们之间有什么区别吗?

3 个答案:

答案 0 :(得分:1)

根据linux设备驱动程序第3版。

cdev_alloc()是一种较旧的机制。这用于在字符驱动程序模块的运行时获取cdev结构。然后你必须手动将操作分配给ops变量到cdev结构。但是cdev_init是我们的新机制传递cdev结构变量(或已经初始化的cdev结构指针)和文件操作变量,有关信息,请点击此处

http://lwn.net/Kernel/LDD3/

第3章

答案 1 :(得分:1)

你可以使用:

struct cdev my_cdev;

在这种情况下,您不需要调用cdev_alloc,因为已经分配了内存。相反,您必须致电cdev_init(&my_cdev, &fops)。 然后my_cdev.owner = THIS_MODULE;

OR

你可以使用:

struct cdev *my_cdev_p;

在这种情况下,您必须调用cdev_alloc()来分配内存。 然后,您必须初始化my_cdev_p->ops=&fops;my_cdev_p->owner = THIS_MODULE;。在这种情况下永远不要使用cdev_init()

请注意,上述2种方法不属于旧机制。

答案 2 :(得分:0)

根据LDD3使用cdev_init应该初始化cdev并且不应该是NULL,所以要么使用kripanand建议的struct cdev dev,要么使用struct cdev * dev然后使用kzalloc分配dev内存,如果使用kmalloc memset将是需要。这是wat cdev_alloc所做的。

我现在已将代码中的cdev_alloc替换为

//vcar->dev=cdev_alloc;
vcar->dev=kzalloc(sizeof(struct cdev),GFP_KERNEL);