私はデバイスドライバプログラムでdevm_kzalloc()
見つけました。kzalloc()
しかし、これらの機能をいつどこで使用するかわかりません。誰でもこれらの機能の重要性とその使用法を指定できますか.
質問する
27673 次
2 に答える
2
簡単に言うと、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;
}
同じことがdevm_kzalloc()によって行われるため、関数を解放するkfree()はありません
于 2016-11-01T19:59:15.890 に答える