He encontrado devm_kzalloc()
y kzalloc()
en el controlador de dispositivo programmong. Pero no sé cuándo/dónde usar estas funciones. ¿Alguien puede especificar la importancia de estas funciones y su uso?¿Cuál es la diferencia entre devm_kzalloc() y kzalloc() en la programación del controlador de Linux
¿Cuál es la diferencia entre devm_kzalloc() y kzalloc() en la programación del controlador de Linux
Respuesta
kzalloc()
asigna memoria de kernel como kmalloc()
, pero también inicializa a cero la memoria asignada. devm_kzalloc()
es administrado kzalloc()
. La memoria asignada con funciones administradas está asociada con el dispositivo. Cuando el dispositivo se desconecta del sistema o el controlador del dispositivo se descarga, esa memoria se libera automáticamente. Si se asignaron varios recursos administrados (memoria u otro recurso) para el dispositivo, el último recurso asignado se libera primero.
Los recursos administrados son muy útiles para garantizar el correcto funcionamiento del controlador tanto para la falla de inicialización en cualquier punto como para una inicialización exitosa seguida de la eliminación del dispositivo.
Tenga en cuenta que los recursos administrados (ya sea memoria u otro recurso) están destinados a ser utilizados en el código responsable de la prueba del dispositivo. En general, son una opción incorrecta para el código utilizado para abrir el dispositivo, ya que el dispositivo se puede cerrar sin desconectarse del sistema. Cerrar el dispositivo requiere liberar los recursos manualmente, lo que frustra el propósito de los recursos administrados.
La memoria asignada con kzalloc()
debe liberarse con kfree()
. La memoria asignada con devm_kzalloc()
se libera automáticamente. Se puede liberar con devm_kfree()
, pero generalmente es una señal de que la asignación de memoria administrada no es adecuada para la tarea.
Realmente vale la pena mencionar que el caso de uso para recursos gestionados es '-> sonda()' o devolución de llamada similar. Sería malo, ** mala idea ** usarlos en devoluciones de llamadas como '-> abrir()'.También hay un problema con el tiempo de vida de los objetos en caso de operaciones de archivos en uso. – 0andriy
He ampliado mi respuesta para mencionarlo, gracias. Si hay otras razones para evitar los recursos administrados en open(), publique un enlace. – proski
En palabras simples, devm_kzalloc() y kzalloc() se utilizan para la asignación de memoria en el controlador del dispositivo pero la diferencia es si asigna memoria por kzalloc() que debe liberar esa memoria cuando el ciclo de vida del dispositivo finaliza o cuando se descarga desde kernel, pero si haces lo mismo con devm_kzalloc() no tienes que preocuparte de liberar memoria, esa memoria se libera automáticamente por la propia biblioteca del dispositivo.
Ambos se hace el exactamente lo mismo pero utilizando devm_kzalloc poca sobrecarga de la memoria libera se libera de los programadores
permiten explicar dando ejemplo, primer ejemplo mediante el uso de 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;
}
En este ejemplo se puede pxa3xx_u2d_remove esto en funcion(), kfree (U2D) (línea indicada por 3) está ahí para liberar memoria asignada por U2D ahora ver el mismo código utilizando 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;
}
no hay kfree() a función libre debido a que el mismo se hace por devm_kzalloc()
- 1. ¿Cuál es la diferencia entre un controlador y un servicio?
- 2. Cuál es la diferencia entre un subproceso y un controlador
- 3. ¿Cuál es la diferencia entre Linux y Unix?
- 4. Cuál es la diferencia entre la programación de Seaside y otra programación web
- 5. Cuál es la diferencia entre = y: =
- 6. ¿cuál es la diferencia entre:.! y: r !?
- 7. ¿Cuál es la diferencia entre dict() y {}?
- 8. ¿Cuál es la diferencia entre [indefinido] y [,]?
- 9. ¿Cuál es la diferencia entre + = y = +?
- 10. ¿Cuál es la diferencia entre ".equals" y "=="?
- 11. Cuál es la diferencia entre $ y jQuery
- 12. Cuál es la diferencia entre $ (...) y `...`
- 13. ¿Cuál es la diferencia entre "$^N" y "$ +"?
- 14. ¿Cuál es la diferencia entre {0} y ""?
- 15. ¿Cuál es la diferencia entre .ToString (+) y ""
- 16. ¿Cuál es la diferencia entre `##` y `hashCode`?
- 17. ¿Cuál es la diferencia entre " " y ""?
- 18. ¿Cuál es la diferencia entre strtok_r y strtok_s en C?
- 19. ¿Cuál es la diferencia entre $ (comando) y `comando` en la programación de shell?
- 20. ¿Cuál es la diferencia entre redirigir y renderizar en CakePHP?
- 21. ¿Cuál es la diferencia entre make y gcc?
- 22. ¿Cuál es la diferencia entre CellClick y CellMouseClick?
- 23. ¿Cuál es la diferencia entre boost :: io_service poll_one y run_one?
- 24. ¿Cuál es la diferencia entre copiar y clonar?
- 25. ¿Cuál es la diferencia entre la programación declarativa y la imperativa?
- 26. ¿Cuál es la diferencia entre los operadores * y the & en la programación c?
- 27. ¿Cuál es la diferencia entre $ @ y $ * en scripts de shell?
- 28. ¿Cuál es la diferencia entre GEM_HOME y GEM_PATH?
- 29. Cuál es la diferencia entre la función() {}() y la función() {}()
- 30. ¿Cuál es la diferencia entre la abstracción y la encapsulación?
Hola, Si usamos devm_kzalloc(), entonces no hay necesidad de liberar esta memoria (ref: [link] (http://docs.blackfin.uclinux.org/kernel/generated/device-drivers/re162.html)). Entonces, ¿podemos reemplazar todas las funciones de kzalloc() con devm_kzalloc() en los programas ya que podemos reducir la carga de liberar la memoria asignada dinámicamente? –
Creo que [devres.txt] (https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/driver-model/devres.txt) responderá la mayoría de las preguntas . El 'devres.txt' debe estar actualizado para su versión de Linux (desde 2.6.31+). –