Quelle est la différence entre vmalloc et kmalloc?


Answers

Réponse courte: téléchargez Linux Device Drivers et lisez le chapitre sur la gestion de la mémoire.

Sérieusement, il y a beaucoup de problèmes subtils liés à la gestion de la mémoire du noyau que vous devez comprendre - je passe beaucoup de temps à déboguer les problèmes avec.

vmalloc () est très rarement utilisé, car le noyau utilise rarement de la mémoire virtuelle. kmalloc () est ce qui est généralement utilisé, mais vous devez savoir quelles sont les conséquences des différents drapeaux et vous avez besoin d'une stratégie pour gérer ce qui se passe en cas d'échec - en particulier si vous êtes dans un gestionnaire d'interruption, comme vous l'avez suggéré.

Question

J'ai fait un tour de kmalloc et j'ai trouvé la plupart des gens qui préconisaient l'utilisation de kmalloc , car vous avez la garantie d'avoir des blocs de mémoire physiques contigus. Cependant, il semble également que kmalloc peut échouer si un bloc physique contigu que vous voulez ne peut pas être trouvé.
Quels sont les avantages d'avoir un bloc de mémoire contigu? Plus précisément, pourquoi aurais-je besoin d'avoir un bloc de mémoire physique contigu dans un appel système ? Y a-t-il une raison pour laquelle je ne pourrais pas simplement utiliser vmalloc ?
Enfin, si je devais allouer de la mémoire lors du traitement d'un appel système, devrais-je spécifier GFP_ATOMIC ? Un appel système est-il exécuté dans un contexte atomique?

GFP_ATOMIC
L'allocation est prioritaire et ne dort pas. C'est le drapeau à utiliser dans les gestionnaires d'interruption, les moitiés inférieures et d'autres situations où vous ne pouvez pas dormir.

GFP_KERNEL Ceci est une allocation normale et pourrait bloquer. C'est l'indicateur à utiliser dans le code de contexte de processus quand il est sûr de dormir.




L'une des autres différences est que kmalloc renvoie une adresse logique (sinon vous spécifiez GPF_HIGHMEM). Les adresses logiques sont placées en "mémoire insuffisante" (dans le premier gigaoctet de mémoire physique) et sont mappées directement aux adresses physiques (utilisez la macro __pa pour la convertir). Cette propriété implique que la mémoire kmalloced est une mémoire continue.

D'autre part, Vmalloc est capable de renvoyer des adresses virtuelles à partir de "haute mémoire". Ces adresses ne peuvent pas être converties directement en adresses physiques (vous devez utiliser la fonction virt_to_page).




Les fonctions kmalloc() et vmalloc() sont une interface simple pour l'obtention de la mémoire du noyau dans les blocs de taille octet.

  1. La fonction kmalloc() garantit que les pages sont physiquement contiguës (et quasiment contiguës).

  2. La fonction vmalloc() fonctionne de manière similaire à kmalloc() , sauf qu'elle alloue de la mémoire qui est seulement contiguë et pas nécessairement contiguë physiquement.