what is difference between cdev_alloc and cdev_init

半腔热情 提交于 2019-12-01 06:13:57

you can use either:

struct cdev my_cdev;

in this case you don't need to call cdev_alloc because memory is already allocated. Instead you must call cdev_init(&my_cdev, &fops). and then my_cdev.owner = THIS_MODULE;

OR

you can use:

struct cdev *my_cdev_p;

in this case you must call cdev_alloc() to allocate memory. Then, you have to initialize my_cdev_p->ops=&fops; and my_cdev_p->owner = THIS_MODULE;. Never use cdev_init() in this case!

Note that the 2 above methods don't belong to the old mechanism.

According to linux device drivers 3rd edition .

cdev_alloc() is a older mechanism .this is used for getting cdev structure at runtime of your character driver module .then you have to manually assign operation to ops variable to cdev structure .However cdev_init is the new mechanism in this we have to pass cdev structure variable (or already initialized cdev structure pointer) and file operation variable,for information go here

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

chapter 3

According to LDD3 for using cdev_init cdev should be initialized and shouldn't be NULL, so either use struct cdev dev as suggested by kripanand or if using struct cdev *dev then allocate dev memory using kzalloc, if using kmalloc memset would be required. This is wat cdev_alloc does.

I've now replaced cdev_alloc in my code as

//vcar->dev=cdev_alloc;
vcar->dev=kzalloc(sizeof(struct cdev),GFP_KERNEL);
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!