Vous pouvez connaître la taille de page par défaut d'un système en interrogeant sa configuration via le getconf
commande :
$ getconf PAGE_SIZE
4096
ou
$ getconf PAGESIZE
4096
REMARQUE : Les unités ci-dessus sont généralement en octets, donc 4096 équivaut à 4096 octets ou 4 Ko.
Ceci est câblé dans la source du noyau Linux ici :
Exemple
$ 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))
Comment le décalage vous donne-t-il 4 096 ?
Lorsque vous décalez des bits, vous effectuez une multiplication binaire par 2. Donc en fait un décalage de bits vers la gauche (1 << PAGE_SHIFT
) fait la multiplication de 2^12 =4096.
$ echo "2^12" | bc
4096
Le matériel (en particulier, la 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 sens que la 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 quelques-unes prennent également en charge des pages plus petites), mais 4 Ko est une valeur par défaut très répandue.
Linux prend en charge deux tailles de page :
- Des pages de taille normale, qui, je crois, font 4 Ko par défaut sur toutes les architectures, bien que certaines architectures autorisent d'autres valeurs, par ex. 16 Ko sur ARM64 ou 8 Ko, 16 Ko ou 64 Ko sur IA64. Ceux-ci correspondent au niveau le plus profond de descripteurs sur la MMU (ce que Linux appelle PTE).
- Pages volumineuses, si elles sont compilées en (
CONFIG_HUGETLB_PAGE
est nécessaire, etCONFIG_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 c'est généralement le cas, 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.
- Une taille de page plus grande signifie plus de gaspillage lorsqu'une page est partiellement utilisée, de sorte que le système manque de mémoire plus tôt.
- Un niveau de descripteur MMU plus profond signifie plus de mémoire noyau pour les tables de pages.
- Un niveau de descripteur MMU plus profond signifie plus de temps passé à parcourir la table des pages.
Les gains de tailles de page plus grandes 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 le getconf
utilitaire ou la fonction C sysconf
.
$ getconf PAGE_SIZE
4096
L'utilisation de pages volumineuses nécessite le montage du hugetlbfs
système de fichiers et mmap
ping ici.