字元裝置驅動學習之cdev_init和cdev_alloc

to_run_away發表於2018-06-17

剛開始學習字元裝置驅動,看到核心中有的程式碼使用cdev_alloc函式申請了記憶體後使用了cdev_init函式初始化,有的則是直接對結構體變數ops賦值。分別人如下

我是分割線//

為了瞭解為什麼可以不使用cdev_init函式,找到原始碼,把cdev_alloc和cdev_alloc對比後發現cdev_alloc已經處理了cdev_init中的很多事情,所以可以在使用了cdev_alloc後,只初始化在cdev_init中沒有處理的部分。

下面先看一下cdec_alloc函式原型和cdev_init函式原型

struct cdev *cdev_alloc(void)
{
	struct cdev *p = kzalloc(sizeof(struct cdev), GFP_KERNEL);
	if (p) {
		INIT_LIST_HEAD(&p->list);
		kobject_init(&p->kobj, &ktype_cdev_dynamic);
	}
	return p;
}
void cdev_init(struct cdev *cdev, const struct file_operations *fops)
{
	memset(cdev, 0, sizeof *cdev);
	INIT_LIST_HEAD(&cdev->list);
	kobject_init(&cdev->kobj, &ktype_cdev_default);
	cdev->ops = fops;
}

對比後可以發現,兩者起始非常相似。

cdev_alloc函式使用裡的kzalloc申請了記憶體並且內部把申請到的記憶體清零了。

經過對比可以發現,如果使用了cdev_alloc函式申請的記憶體,可以在下面直接對ops變數賦值,而不需要呼叫cdev_init再一次初始化,進而提高效率。

 

 

 

 

相關文章