Quelle est la différence entre vmalloc et kmalloc?
J'ai googlé autour et a trouvé la plupart des gens prônant l'utilisation de kmalloc
, comme vous êtes garanti d'obtenir contiguë physique des blocs de mémoire. Cependant, il semble également que si kmalloc
peut échouer si une zone contiguë de physique bloc que vous voulez ne peut pas être trouvé.
Quels sont les avantages d'avoir un bloc contigu de mémoire? Plus précisément, pourquoi aurais-je besoin d'avoir une ligne de physique bloc de mémoire dans un appel système? Est-il une raison que je ne pouvais pas l'utiliser vmalloc
?
Enfin, si j'étais à allouer de la mémoire en cours de traitement d'un appel système, dois-je préciser GFP_ATOMIC
? Est un appel système exécuté dans un atomique contexte?
GFP_ATOMIC
L'allocation est de haute priorité et
ne pas dormir. C'est le drapeau de
l'utilisation de gestionnaires d'interruption, bas
les moitiés et les autres situations où vous
ne peut pas dormir.
GFP_KERNEL
C'est une répartition normale et pourrait bloquer. C'est le drapeau à utiliser
dans le contexte de processus de code quand il est sécuritaire de sommeil.
- Un bon article sur vmalloc et kmalloc http://learnlinuxconcepts.blogspot.in/2014/02/linux-memory-management.html
- Que l'article revendications absurdités comme: "Généralement une architecture 32 bits a taille de page de 4KO et une architecture en 64 bit a 8 KO taille de la page". Je n'ai pas entièrement lu, mais je n'appellerais pas ça "bien", ou même faire confiance à un mot.
- Note (semi -):
vmalloc
est plus rapide avec un Noyau 5.2 (T2 2019)
Vous devez vous connecter pour publier un commentaire.
Vous avez seulement besoin de s'inquiéter à propos de l'utilisation physiquement contigu de mémoire si la mémoire tampon sera accessible par un périphérique DMA sur un physiquement adressée bus (PCI). Le problème est que de nombreux appels système ont aucun moyen de savoir si leur tampon finira par être passé à un périphérique DMA: une fois que vous passez le tampon à l'autre sous-système du noyau, vous ne pouvez pas vraiment savoir où il va aller. Même si le noyau ne pas utiliser le tampon pour le DMA aujourd'hui, un développement futur pourrait le faire.
vmalloc est souvent plus lent que kmalloc, car elle peut avoir à reconfigurer l'espace de mémoire tampon dans une quasi-plage contiguë. kmalloc jamais reconfigure, mais si pas appelé avec GFP_ATOMIC kmalloc peut bloquer.
kmalloc est limité dans la taille de la mémoire tampon, il peut fournir: 128 kilo-octets*). Si vous avez vraiment besoin d'un gros tampon, vous devez utiliser vmalloc ou d'un autre mécanisme comme réservant élevée de la mémoire au démarrage.
Pour un appel système, vous n'avez pas besoin de passer GFP_ATOMIC à kmalloc(), vous pouvez utiliser GFP_KERNEL. Vous n'êtes pas un gestionnaire d'interruption: le code de l'application entre dans le noyau de contexte par le biais d'un piège, il n'est pas une interruption.
Réponse courte: télécharger Linux Pilotes De Périphérique et de lire le chapitre sur la gestion de la mémoire.
Sérieusement, il y a beaucoup de questions subtiles liées à noyau de gestion de la mémoire que vous avez besoin de comprendre - je passe beaucoup de mon temps de débogage de problèmes avec elle.
vmalloc() est très rarement utilisé, parce que le noyau utilise rarement la mémoire virtuelle. kmalloc() est ce qui est généralement utilisée, mais vous devez savoir quelles sont les conséquences des différents drapeaux et vous avez besoin d'une stratégie pour faire face à ce qui se passe quand il ne parvient pas - surtout si vous êtes dans un gestionnaire d'interruption, comme vous l'avez suggéré.
Noyau Linux de Développement par Robert d'Amour (Chapitre 12, page 244 3e édition) répond très clairement.
Oui, physiquement contigu de mémoire n'est pas requise dans la plupart des cas. La raison principale pour kmalloc utilisés de plus que vmalloc dans le noyau est la performance. Le livre explique, lorsque de grands segments de mémoire sont alloués à l'aide de vmalloc, le noyau de la carte de la physique non-contigus morceaux (pages) en un seul tenant de la mémoire virtuelle de la région. Puisque la mémoire est presque contigus et physiquement non contiguës, de plusieurs virtuel à l'adresse physique de mappages devra être ajouté à la page de la table. Et dans le pire des cas, il y aura (taille de la mémoire tampon/taille de la page) nombre de correspondances ajouté à la page de la table.
Cela ajoute de la pression sur TLB (les entrées du cache de stockage récente virtuelle et adresse physique de mappings) lors de l'accès à cette mémoire tampon. Cela peut conduire à dérouillée.
La
kmalloc()
&vmalloc()
fonctions sont d'une interface simple pour l'obtention de la mémoire du noyau en octet-morceaux de taille.La
kmalloc()
fonction garantit que les pages sont physiquement contigu (et presque contigus).La
vmalloc()
fonction fonctionne de manière similaire àkmalloc()
, sauf qu'il alloue de la mémoire qui n'est presque contigus et non nécessairement contiguës.Quels sont les avantages d'avoir un bloc contigu de mémoire? Plus précisément, pourquoi aurais-je besoin d'avoir une zone contiguë de physique du bloc de mémoire dans un système d'appel? Est-il une raison que je ne pouvais pas l'utiliser vmalloc?
De Google "j'ai de la Chance" sur
vmalloc
:kmalloc est la meilleure façon, tant que vous n'avez pas besoin de très grandes zones. Le problème est, si vous voulez faire un DMA à partir de/à certains périphérique matériel, vous aurez besoin d'utiliser kmalloc, et vous aurez probablement besoin d'un plus grand morceau. La solution est d'allouer de la mémoire dès que possible, avant
mémoire fragmentée.
Sur un système 32 bits, kmalloc() retourne le noyau adresse logique (son une adresse virtuelle, tout de même) qui a le mappage direct (en fait avec un décalage constant) à l'adresse physique.
Cette correspondance directe nous permet d'obtenir une zone contiguë de physique morceau de RAM. Adapté pour les DMA où nous donnons seulement l'initiale du pointeur et de s'attendre à une zone contiguë de cartographie physique par la suite, pour notre opération.
vmalloc() retourne le noyau d'adressage virtuel qui à son tour peut-être pas avoir une zone contiguë de la cartographie sur la RAM physique.
Utile pour les grands de l'allocation de mémoire et dans le cas où nous ne nous soucions pas que la mémoire allouée à notre processus est continu aussi dans la RAM Physique.
L'une des autres différences est kmalloc sera de retour l'adresse logique (sinon vous spécifiez GPF_HIGHMEM). Les adresses logiques sont placés dans la "mémoire insuffisante" (dans la première gigaoctet de mémoire physique) et sont mappées directement à des adresses physiques (utilisation __pa macro pour convertir). Cette propriété implique kmalloced mémoire est mémoire continue.
En revanche, Vmalloc est capable de rentrer des adresses virtuelles de "mémoire". Ces adresses ne peuvent pas être convertis en adresses physiques en direct de la mode (vous devez utiliser virt_to_page fonction).