Linux utilise un système de mémoire virtuelle où toutes les adresses sont des adresses virtuelles et non des adresses physiques. Ces adresses virtuelles sont converties en adresses physiques par le processeur.
Pour faciliter cette traduction, la mémoire virtuelle et physique est divisée en pages. Chacune de ces pages porte un numéro unique; le numéro du cadre de la page.
Certaines tailles de page peuvent être de 2 Ko, 4 Ko, etc. Mais comment ce numéro de taille de page est-il déterminé? Est-il influencé par la taille de l'architecture? Par exemple, un bus 32 bits aura un espace d'adressage de 4 Go.
Vous pouvez connaître la taille de page par défaut d'un système en interrogeant sa configuration via la commande getconf
:
$ getconf PAGE_SIZE
4096
ou
$ getconf PAGESIZE
4096
REMARQUE: Les unités ci-dessus sont généralement en octets, donc le 4096 équivaut à 4096 octets ou 4 Ko.
Ceci est câblé dans la source du noyau Linux ici:
$ more /usr/src/kernels/3.13.9-100.fc19.x86_64/include/asm-generic/page.h
...
...
/* PAGE_SHIFT determines the page size */
#define PAGE_SHIFT 12
#ifdef __Assembly__
#define PAGE_SIZE (1 << PAGE_SHIFT)
#else
#define PAGE_SIZE (1UL << PAGE_SHIFT)
#endif
#define PAGE_MASK (~(PAGE_SIZE-1))
Lorsque vous décalez des bits, vous effectuez une multiplication binaire par 2. Donc, en fait, un décalage des bits vers la gauche (1 << PAGE_SHIFT
) fait la multiplication de 2 ^ 12 = 4096.
$ echo "2^12" | bc
4096
Le matériel (en particulier, le MMU , qui fait partie du processeur) détermine les tailles de page possibles. Il n'y a aucune relation avec la taille du registre du processeur et seulement une relation indirecte avec la taille de l'espace d'adressage (en ce que le MMU détermine les deux).
Presque toutes les architectures prennent en charge une taille de page de 4 Ko. Certaines architectures prennent en charge des pages plus grandes (et certaines prennent également en charge des pages plus petites), mais 4 Ko sont une valeur par défaut très répandue.
Linux prend en charge deux tailles de page:
CONFIG_HUGETLB_PAGE
est nécessaire et CONFIG_HUGETLBFS
également pour la plupart des utilisations). Cela correspond au deuxième niveau le plus profond des descripteurs MMU (ce que Linux appelle PMD) (ou du moins il le fait généralement, je ne sais pas si cela s'applique à toutes les architectures).La taille de la page est un compromis entre l'utilisation de la mémoire, l'utilisation de la mémoire et la vitesse.
Les gains de pages de plus grande taille sont minimes pour la plupart des applications, alors que le coût est substantiel. C'est pourquoi la plupart des systèmes n'utilisent que des pages de taille normale.
Vous pouvez interroger la taille de page (normale) sur votre système avec l'utilitaire getconf
ou la fonction C sysconf
.
$ getconf PAGE_SIZE
4096
tiliser des pages énormes nécessite le montage des fichiers hugetlbfs
et mmap
ping.
La taille de la page dépend principalement de l'architecture du processeur. Sur x86, depuis l'époque du processeur 386 qui a introduit le mode protégé, la taille de la page a été de 4 Ko.
En mode x64, il peut également y avoir d'énormes pages de 2 Mo. Cependant, leur utilisation est un peu compliquée.
Vous pouvez trouver plus d'informations sur la taille de la page dans article Wikipedia
Le processeur détermine les tailles de page disponibles. Dans la plupart des cas, la taille de page implémentée par le matériel sur les processeurs x86 et x86_64 est de 4 Ko. Cependant, le système d'exploitation peut allouer plus d'une page à la fois s'il le souhaite, et ainsi implémenter efficacement des pages de 8 Ko, 16 Ko ou 32 Ko dans le logiciel.
Les processeurs x86 et x86_64 peuvent respectivement également mélanger des pages de 4 Mo et 2 Mo avec les pages standard de 4 Ko. Si cette capacité est utilisée, elle serait principalement utilisée pour allouer de l'espace au noyau.