Comment fonctionne l’allocation de mémoire sur Linux

Dans les systèmes informatiques, pour qu’un processus soit exécutable, il faut le mettre en mémoire. Pour cela, un champ doit être attribué à une procédure en mémoire. L’allocation de mémoire est un problème important à connaître, spécifiquement dans les styles de bits ainsi que de systèmes.

Regardons l’allocation de mémoire de Linux en détail ainsi que de comprendre ce qui se passe dans les coulisses.

Comment l’allocation de mémoire est-elle faite ?

La plupart des ingénieurs logiciels ne reconnaissent pas les détails de ce processus. Cependant, si vous êtes un candidat développeur système, vous devez en savoir plus à ce sujet. En regardant le processus d’allocation, il est nécessaire d’entrer dans un peu de détail sur Linux et la bibliothèque glibc .

Lorsque les applications ont besoin de mémoire, elles doivent la demander à l’os. Cette demande du bit appellera naturellement un appel téléphonique du système. Vous ne pouvez pas allouer vous-même de la mémoire en mode client.

Le malloc() ménage de fonctions est responsable de l’allocation de la mémoire dans le langage C. La question à poser ici est de savoir si malloc(), en tant que fonction de la glibc, fait un appel direct au système.

Il n’y a pas d’appel système appelé malloc dans le bit Linux. Néanmoins, il existe deux appels système pour les demandes de mémoire des applications, qui sont brk ainsi que mmap .

Puisque vous allez demander de la mémoire dans votre application en utilisant les fonctionnalités de la glibc, vous pourriez vous demander lequel de ces appels système la glibc utilise à ce moment-là. La solution est les deux.

Le premier appel système : brk

Chaque processus possède une zone de données contiguë. Avec l’appel système brk, la valeur de rupture du programme, qui détermine la limite de la zone d’information, est augmentée et aussi le processus d’allocation est exécuté.

Bien que l’allocation de mémoire avec cette technique soit vraiment rapide, il n’est pas toujours possible de rendre de la place supplémentaire au système.

Voir aussi :  Les 3 principaux types de distributions Linux à connaître

Par exemple, pensez que vous allouez cinq champs, chacun d’une taille de 16KB, avec l’appel système brk via la fonction malloc(). Lorsque vous avez terminé avec le numéro deux de ces champs, il n’est pas possible de retourner la ressource correspondante (deallocation) pour que le système puisse l’utiliser. Parce que si vous abaissez la valeur de l’adresse pour révéler la zone où votre zone numéro deux commence, avec un appel à brk, vous aurez fait la désallocation pour les zones numéros 3, quatre, et aussi 5.

Pour éviter la perte de mémoire dans cette situation, l’application malloc dans la glibc surveille les zones allouées tout en faisant ainsi champ d’information et définit ensuite de le retourner au système avec la fonction compliment(), afin que le système puisse utiliser le vide pour plus d’allocations de mémoire.

En d’autres termes, après l’attribution de cinq emplacements de 16 Ko, si la deuxième zone est retournée avec la fonction cost-free() et qu’une zone supplémentaire de 16 Ko est demandée une fois de plus après un certain temps, plutôt que d’agrandir la zone de données avec l’appel téléphonique du système brk, l’adresse précédente est retournée.

Cependant, si l’emplacement nouvellement demandé est plus grand que 16KB, après cela l’emplacement d’information sera certainement agrandi en allouant un nouvel emplacement avec l’appel téléphonique du système brk étant donné que l’emplacement 2 ne peut pas être utilisé. Bien que l’emplacement numéro 2 ne soit pas utilisé, l’application ne peut pas l’utiliser en raison de la différence de dimension. En raison de situations comme celle-ci, il y a une situation appelée fragmentation interne, et aussi en fait, vous pouvez rarement utiliser tous les composants de la mémoire au maximum.

Pour mieux comprendre, essayez d’assembler ainsi que d’exécuter l’exemple d’application suivant :

Lorsque vous exécutez l’application, vous obtiendrez un résultat comparable à la sortie suivante :

Le résultat pour brk avec strace sera le suivant :

Comme vous pouvez le voir, 0x21000 a été ajouté à l’adresse de fin du champ d’information. Vous pouvez reconnaître cela à la valeur 0x5608595d7000 . Donc en gros, 0x21000 , soit 132KB de mémoire ont été désignés.

Voir aussi :  10 façons de sécuriser votre serveur Samba sous Linux

Il y a deux indications importantes à prendre en considération ici. La toute première est l’allocation d’une quantité supérieure à celle spécifiée dans l’échantillon de code. L’autre est la ligne de code qui a provoqué l’appel téléphonique brk qui a fourni l’allocation.

Address Space Layout Randomization : ASLR

Lorsque vous exécutez l’application d’instance ci-dessus l’une après l’autre, vous verrez des valeurs d’adresse différentes à chaque fois. Faire changer la zone d’adresse de façon aléatoire de cette façon rend dramatiquement complexe le travail des attaques de sûreté et de sécurité et augmente également la protection des applications logicielles.

Cependant, dans les styles 32 bits, 8 bits sont généralement utilisés pour randomiser la zone d’adresse. Augmenter le nombre de bits ne sera pas approprié car la zone adressable sur les petits bits restants sera très réduite. De plus, l’utilisation de combinaisons de 8 bits seulement ne rend pas les choses suffisamment difficiles pour l’ennemi.

Dans les conceptions 64 bits, d’autre part, étant donné qu’il y a trop de petits bits qui peuvent être désignés pour la procédure ASLR, un caractère aléatoire beaucoup plus grand est offert, et le degré de sécurité augmente.

Linux bit alimente également les gadgets basés sur Android ainsi que l’attribut ASLR est totalement activé sur Android 4.0.3 ainsi que les suivants. Aussi pour cette seule raison, il ne serait certainement pas faux de dire qu’un téléphone mobile 64 bits offre un avantage de protection substantiel par rapport aux versions 32 bits.

En désactivant brièvement la fonction ASLR avec la commande suivante, il apparaîtra que l’application d’examen précédente renvoie exactement les mêmes valeurs d’adresse à chaque fois qu’elle est exécutée :

Pour la récupérer dans son état antérieur, il suffira de créer 2 par opposition à 0 dans ce même fichier.

Le deuxième appel système : mmap

mmap est le deuxième appel téléphonique système utilisé pour l’allocation de mémoire sous Linux. Avec l’appel téléphonique mmap, le vide dans une zone quelconque de la mémoire est mappé vers l’espace d’adressage de la procédure appelante.

Voir aussi :  Comment patcher la vulnérabilité PwnKit du serveur Linux CVE-2021-4034

Dans une appropriation de mémoire faite de cette méthode, lorsque vous souhaitez retourner les 2èmes diviseurs de 16KB avec la fonction free() dans l’instance précédente de brk, il n’y a aucun système pour arrêter cette procédure. Le secteur de mémoire approprié est retiré de la salle d’adresse de la procédure. Il est marqué comme n’étant plus utilisé et retourné au système.

Parce que les appropriations de mémoire avec mmap sont vraiment lentes contrairement à celles avec brk, l’appropriation brk est nécessaire.

Avec mmap, tout emplacement libre de la mémoire est mis en correspondance avec la salle d’adresse du processus, de sorte que le contenu de la zone désignée est réinitialisé avant que ce processus ne soit terminé. Si la réinitialisation n’était pas faite de cette manière, les informations provenant de la procédure qui utilisait précédemment la zone mémoire concernée pourraient de même être accédées par la procédure suivante non associée. Il serait alors impossible de parler de protection dans les systèmes.

Importance de l’allocation de mémoire dans Linux

L’allocation de mémoire est extrêmement vitale, notamment dans les problèmes d’optimisation et de sécurité. Comme on le voit dans les exemples ci-dessus, ne pas comprendre complètement cette question peut indiquer la destruction de la sécurité de votre système.

Même les idées comparables à celles de pousser et de se démarquer qui existent dans beaucoup de langages de programmes sont basées sur des opérations d’allocation de mémoire. Avoir la capacité d’utiliser ainsi que de bien maîtriser la mémoire du système est essentiel à la fois dans les spectacles de systèmes embarqués et dans l’établissement d’un style de système sûr et sécurisé ainsi que maximisé.

Si vous avez de même l’intention de tremper vos orteils dans le développement de noyaux Linux, prenez en considération la maîtrise du langage de programmes C dans un premier temps.

Cliquez pour évaluer cet article !
[Total: Moyenne : ]

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *