Déplacement de stack et réservation de la moitié de l’espace adressable sous Linux

Pour l’implémentation d’une bibliothèque de surveillance de la mémoire, j’aimerais déplacer la stack du programme surveillé et réserver la moitié supérieure de la mémoire virtuelle pour utilisation dans la bibliothèque de surveillance, conformément au modèle “half’n’half” décrit. par des outils tels que TaintTrace , LIFT et Hobbes . Cependant, il ne me semble pas clair comment faire cela. Échouer simplement la mémoire requirejse échoue (impossible d’allouer de la mémoire). Dois-je modifier le crt? Le lieur?

Je ne suis pas sûr de savoir comment allouer une mémoire corrompue ou non corrompue et optimiser à partir d’un système d’exploitation de type Unix.

L’allocation de mémoire dans un système Unix est effectuée à l’aide de brk () et de sbrk (). Il n’y a pas beaucoup plus que cela. Pour les autres espaces mémoire, vous devez utiliser des allocations de mémoire partagée (vous ne pouvez les rendre en lecture / écriture que par votre processus, il est donc “partagé” entre vous.)

Le problème que vous rencontrerez est l’allocation croissante de mémoire. Je n’en suis pas trop sûr, mais d’après ce que je me souviens de l’utilisation de la mémoire partagée, vous ne pouviez pas facilement étendre le tampon alloué. Mais les nouvelles interfaces peuvent bien fonctionner pour vous.

— Mettre à jour:

En lisant la documentation malloc (), j’ai trouvé ce qui suit:

Normalement, malloc () alloue de la mémoire à partir du tas et ajuste la taille du tas selon les besoins, à l’aide de sbrk (2). Lors de l’allocation de blocs de mémoire plus grands que MMAP_THRESHOLD octets, l’implémentation glibc malloc () alloue la mémoire en tant que mappage anonyme privé à l’aide de mmap (2). MMAP_THRESHOLD est de 128 Ko par défaut, mais il est ajustable avec mallopt (3). Les affectations effectuées à l’aide de mmap (2) ne sont pas affectées par la limite de ressources RLIMIT_DATA (voir getrlimit (2)).

Ce qui signifie que le système d’exploitation utilise déjà mmap () pour allouer des tampons supérieurs à 128 Ko par défaut. De plus, le standard malloc () est limité par le getrlimit () de RLIMIT_DATA documenté ici:

Taille maximale du segment de données du processus (données initialisées, données non initialisées et segment de mémoire). Cette limite affecte les appels à brk (2) et à sbrk (2), qui échouent avec l’erreur ENOMEM lorsqu’ils rencontrent la limite souple de cette ressource.

Cependant, comme le dit malloc (), si vous allouez des mémoires tampons volumineuses (128 Ko +), vous n’êtes pas concerné par cette limite.

Cela étant dit, une grande partie de la mémoire est allouée à des tâches telles que le kernel lui-même, votre programme, les entrées / sorties mappées vers des adresses (DMA), des tables d’interruption, des tables de mémoire (gestion de MMU) et des mémoires tampons de mémoire partagée (mmap). () en utilisant SHARED allouera des adresses de mémoire auxquelles tous les processus doivent avoir access même si vous ne les utilisez pas encore, ils sont réservés, au cas où vous y accéderiez.)

Une des choses qui utilise la mémoire partagée sont des bibliothèques partagées. (les fichiers binarys sont chargés dans la mémoire partagée, donc une fois pour tous les processus exécutés sur lesdites bibliothèques partagées.)