简而言之,devm_kzalloc() 和 kzalloc() 都用于设备驱动程序中的内存分配,但不同之处在于,如果您通过 kzalloc() 分配内存,而不是在设备驱动程序的生命周期为结束或当它从内核中卸载时,但如果您对 devm_kzalloc() 执行相同操作,则无需担心释放内存,设备库本身会自动释放该内存。
它们都做了完全相同的事情,但是通过使用 devm_kzalloc,程序员释放内存的开销很小
举个例子来解释一下,第一个例子是使用kzalloc
static int pxa3xx_u2d_probe(struct platform_device *pdev)
{
int err;
u2d = kzalloc(sizeof(struct pxa3xx_u2d_ulpi), GFP_KERNEL); 1
if (!u2d)
return -ENOMEM;
u2d->clk = clk_get(&pdev->dev, NULL);
if (IS_ERR(u2d->clk)) {
err = PTR_ERR(u2d->clk); 2
goto err_free_mem;
}
...
return 0;
err_free_mem:
kfree(u2d);
return err;
}
static int pxa3xx_u2d_remove(struct platform_device *pdev)
{
clk_put(u2d->clk);
kfree(u2d); 3
return 0;
}
在此示例中,您可以在函数 pxa3xx_u2d_remove() 中执行此操作,
kfree(u2d)(由 3 指示的行)用于释放 u2d 分配的内存
现在使用 devm_kzalloc() 查看相同的代码
static int pxa3xx_u2d_probe(struct platform_device *pdev)
{
int err;
u2d = devm_kzalloc(&pdev->dev, sizeof(struct pxa3xx_u2d_ulpi), GFP_KERNEL);
if (!u2d)
return -ENOMEM;
u2d->clk = clk_get(&pdev->dev, NULL);
if (IS_ERR(u2d->clk)) {
err = PTR_ERR(u2d->clk);
goto err_free_mem;
}
...
return 0;
err_free_mem:
return err;
}
static int pxa3xx_u2d_remove(struct platform_device *pdev)
{
clk_put(u2d->clk);
return 0;
}
没有 kfree() 来释放函数,因为 devm_kzalloc() 也是如此