Ho trovato devm_kzalloc()
e kzalloc()
nel programma di programmazione del driver del dispositivo. Ma non so quando/dove usare queste funzioni. Qualcuno può specificare l'importanza di queste funzioni e il loro utilizzo.Qual è la differenza tra devm_kzalloc() e kzalloc() nella programmazione del driver linux
risposta
kzalloc()
alloca la memoria del kernel come kmalloc()
, ma azzera anche la memoria allocata. devm_kzalloc()
è gestito kzalloc()
. La memoria allocata con funzioni gestite è associata al dispositivo. Quando il dispositivo viene scollegato dal sistema o il driver per il dispositivo viene scaricato, tale memoria viene liberata automaticamente. Se sono state allocate più risorse gestite (memoria o altra risorsa) per il dispositivo, la risorsa allocata per ultima viene liberata per prima.
Le risorse gestite sono molto utili per garantire il corretto funzionamento del driver sia per l'inizializzazione non riuscita in qualsiasi punto e per l'inizializzazione corretta seguita dalla rimozione del dispositivo.
Si noti che le risorse gestite (che si tratti di memoria o di altre risorse) devono essere utilizzate nel codice responsabile della verifica del dispositivo. In genere sono una scelta sbagliata per il codice utilizzato per l'apertura del dispositivo, in quanto il dispositivo può essere chiuso senza essere disconnesso dal sistema. La chiusura del dispositivo richiede la liberazione manuale delle risorse, che vanifica lo scopo delle risorse gestite.
La memoria allocata con kzalloc()
deve essere liberata con kfree()
. La memoria allocata con devm_kzalloc()
viene liberata automaticamente. Può essere liberato con devm_kfree()
, ma di solito è un segno che l'allocazione della memoria gestita non è adatta per l'attività.
Vale veramente la pena menzionare che il caso d'uso per le risorse gestite è '-> probe()' o callback simile. Sarebbe male, ** cattiva idea ** usarli in callback come '-> open()'.Inoltre c'è un problema con il tempo di vita degli oggetti in caso di operazioni sui file in uso. – 0andriy
Ho ampliato la mia risposta per dirlo, grazie. Se ci sono altri motivi per evitare le risorse gestite in open(), si prega di pubblicare un link. – proski
In parole semplici devm_kzalloc() e kzalloc() vengono entrambi utilizzati per l'allocazione di memoria nel driver di periferica, ma la differenza è se si assegna memoria a kzalloc() di quella necessaria per liberare quella memoria quando il ciclo di vita di quel driver di dispositivo è terminato o quando viene scaricato dal kernel ma se si fa lo stesso con devm_kzalloc() non è necessario preoccuparsi di liberare memoria, quella memoria viene automaticamente liberata dalla libreria del dispositivo stesso.
Entrambi di loro fa esattamente la stessa cosa, ma utilizzando devm_kzalloc poco overhead di memoria liberando viene rilasciato dai programmatori
farvi spiegare dando esempio, primo esempio utilizzando 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;
}
In questo esempio è possibile in questo funtion pxa3xx_u2d_remove(), kfree (U2D) (linea indicata con 3) v'è per liberare memoria allocata da U2D ora vedere lo stesso codice utilizzando 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;
}
non c'è kfree() per funzione libera perché lo stesso è fatto da devm_kzalloc()
- 1. Qual è la differenza tra http e https nella programmazione
- 2. Qual è la differenza tra programmazione Dataflow e programmazione reattiva?
- 3. Sviluppo driver Linux: Differenza tra driver PCI e PCIe?
- 4. Qual è la differenza tra module_init e init_module in un modulo del kernel Linux?
- 5. Qual è la differenza tra un driver WDM, un driver KMDF e un driver UMDF?
- 6. Qual è la differenza tra Linux e Unix?
- 7. qual è la differenza tra i comandi linux e unix?
- 8. qual è la differenza tra ~/e ~ in linux?
- 9. Qual è la differenza nella pratica tra inline e #define?
- 10. Differenza tra driver e provider
- 11. Qual è la differenza tra informatica e ingegneria del software?
- 12. Qual è la differenza tra trasmissione sincrona e asincrona nella programmazione socket TCP/IP?
- 13. Qual è la differenza tra tasklet e workmail
- 14. Qual è la differenza tra dict() e {}?
- 15. Qual è la differenza tra module_init e subsys_initcall durante l'inizializzazione del driver?
- 16. Qual è la differenza tra flussi e datagrammi nella programmazione di rete?
- 17. Qual è la differenza tra * e gli operatori nella programmazione c?
- 18. Qual è la differenza tra dma_mmap_coherent e remap_pfn_range?
- 19. Qual è la differenza tra {0} e +?
- 20. Qual è la differenza tra Verilog! e ~?
- 21. differenza tra programmazione socket e programmazione Http
- 22. Qual è la differenza tra = e: =
- 23. Qual è la differenza tra? : e ||
- 24. qual è la differenza tra [[], []] e [[]] * 2
- 25. Qual è la differenza tra $ e $$?
- 26. Qual è la differenza tra ("") e (null)
- 27. Qual è la differenza tra " " e ""?
- 28. Qual è la differenza tra {0} e ""?
- 29. Qual è la differenza tra `##` e `hashCode`?
- 30. Qual è la differenza tra .ToString() e + ""
Ciao, Se usiamo devm_kzalloc(), allora non c'è bisogno di liberare questa memoria (ref: [link] (http://docs.blackfin.uclinux.org/kernel/generated/device-drivers/re162.html)). Quindi possiamo sostituire tutte le funzioni di kzalloc() con devm_kzalloc() nei programmi poiché possiamo ridurre l'onere di liberare la memoria allocata dinamicamente ..? –
Credo che [devres.txt] (https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/driver-model/devres.txt) risponderà alla maggior parte delle domande . Il "devres.txt" dovrebbe essere aggiornato per la tua versione Linux (dalla 2.6.31+). –