Comment allouer de la mémoire à partir d’une nouvelle page virtuelle en C?

J’parsing l’effet de l’allocation sur des pages virtuelles lors de la création d’un tableau à deux dimensions de la dimension PageSize x PageSize. La taille de la page de ma machine est de 4096. J’ai un tableau de 4096 pointeurs d’entiers (colonnes), pointant vers 4096 entiers (lignes).

Je veux commencer l’allocation pour le premier pointeur entier sur une nouvelle page virtuelle. Comment puis-je identifier si l’emplacement de mémoire actuel est une nouvelle page ou non? Une fois, j’ai identifié cela, je pense pouvoir écrire des valeurs parasites et déplacer le pointeur sur une nouvelle page virtuelle. Voici comment j’alloue le tableau.

array = malloc(ncolumns * sizeof(int *)); for(j = 0; j < ncolumns; j++) { array[j] = malloc(nrows * sizeof(int)); if(array[j] == NULL) { reportError(8);} } 

Si vous connaissez la taille de votre page, vous pouvez allouer une partie de la mémoire suffisamment grande pour garantir l’alignement d’une partie de la mémoire allouée sur une limite de page. Vous aurez besoin d’allouer au moins 8 192 octets de mémoire pour garantir que vous aurez 4096 octets alignés sur une limite de 4096 octets.

Par exemple, si vous appelez malloc et qu’il vous renvoie un décalage aligné sur 0xDEAD1001 (4097), vous devrez passer à la page suivante à l’adresse mémoire 0xDEAD2000 pour obtenir un alignement de 4096 octets. Ensuite, vous aurez besoin d’au moins 4096 octets d’espace contigu. D’où la nécessité d’allouer 8192 octets.

Pour obtenir un emplacement mémoire aligné sur 4 ko, vous pouvez append 4095 à l’adresse renvoyée par malloc et masquer les 3 derniers octets.

 void *mem = malloc(8192); void *ptr = ((void *)mem+0x0FFF) & ~ (void *)0x0FFF; 

Edit: Assurez-vous de garder un pointeur sur la mémoire d’origine allouée afin de pouvoir ensuite faire demi-tour et l’utiliser pour appeler free() .

Supposons que cette fois, malloc renvoie 0xDEAD000F .

 0xDEAD000F + 0x0000FFF = 0xDEAD100E 0xDEAD100E & ~0x0000FFF = 0xDEAD1000 

Si vous ne voulez pas faire toute cette arithmétique désordonnée de pointeur, je pense que vous pourriez simplement utiliser posix_memalign . Vérifiez ici . Si vous utilisez une autre plate-forme, je suis sûr que des services d’alignement de la mémoire similaires sont disponibles.

En utilisant uniquement les fonctionnalités du langage C, vous ne pouvez pas aligner vos allocations (c’est-à-dire quelque chose qui a été renvoyé par malloc) sur le bord de la page. Votre exemple de code consiste simplement à allouer un tableau de pointeurs à des tableaux. Leur emplacement peut être n’importe où dans l’espace d’adressage virtuel. L’emplacement exact dépend du compilateur / bibliothèque / OS / etc.

Les systèmes d’exploitation ont généralement des fonctions qui permettent de faire de telles choses. Sous Windows, vous pouvez utiliser la fonction VirtualAlloc .