22

私はデバイスドライバプログラムでdevm_kzalloc()見つけました。kzalloc()しかし、これらの機能をいつどこで使用するかわかりません。誰でもこれらの機能の重要性とその使用法を指定できますか.

4

2 に答える 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 に答える