Подтвердить что ты не робот

В чем разница между devm_kzalloc() и kzalloc() в программировании драйвера linux

Я нашел devm_kzalloc() и kzalloc() в драйвере драйвера устройства. Но я не знаю, когда/где использовать эти функции. Кто-нибудь может указать важность этих функций и их использование.

4b9b3361

Ответ 1

kzalloc() выделяет память ядра, например kmalloc(), но также инициализирует выделенную память. devm_kzalloc() управляется kzalloc(). Память, выделенная управляемыми функциями, связана с устройством. Когда устройство отсоединяется от системы или драйвер для устройства выгружается, эта память автоматически освобождается. Если для устройства было выделено несколько управляемых ресурсов (память или какой-либо другой ресурс), сначала выделяется выделенный ресурс.

Управляемые ресурсы очень полезны для обеспечения правильной работы драйвера как для отказа инициализации в любой момент, так и для успешной инициализации, за которой следует удаление устройства.

Обратите внимание, что управляемые ресурсы (будь то память или какой-либо другой ресурс) предназначены для использования в коде, ответственном за зондирование устройства. Они, как правило, являются неправильным выбором для кода, используемого для открытия устройства, поскольку устройство можно закрыть, не отсоединяясь от системы. Закрытие устройства требует освобождения ресурсов вручную, что приводит к победе над целями управляемых ресурсов.

Память, выделенная с помощью kzalloc(), должна быть освобождена с помощью kfree(). Память, выделенная с помощью devm_kzalloc(), автоматически освобождается. Он может быть освобожден с помощью devm_kfree(), но обычно это признак того, что распределение управляемой памяти не подходит для задачи.

Ответ 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;
}

В этом примере вы можете это сделать в funtion 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()