comment la taille de la page est-elle déterminée dans l'espace d'adressage virtuel?

Linux utilise un système de memory 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 memory virtuelle et physique sont divisées en pages. Chacune de ces pages reçoit un numéro unique; le numéro 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 find la taille de page par défaut d'un système en interrogeant sa configuration via la command getconf :

 $ getconf PAGE_SIZE 4096 

ou

 $ getconf PAGESIZE 4096 

NOTE: Les unités ci-dessus sont généralement en octets, donc le 4096 équivaut à 4096 octets ou 4kB.

Ceci est câblé dans la source du kernel 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 4096?

Lorsque vous déplacez des bits, vous effectuez une multiplication binary par 2. Ainsi, 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, la MMU , qui fait partie de la CPU) détermine quelles tailles de page sont possibles. Il n'y a pas de 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 un défaut très répandu.

Linux prend en charge deux tailles de page:

  • Les pages de taille normale, qui selon moi sont de 4kB par défaut sur toutes les architectures, bien que certaines architectures autorisent d'autres valeurs, par exemple 16kB sur ARM64 ou 8kB, 16kB ou 64kB sur IA64 . Ceux-ci correspondent au niveau le plus profond de descripteurs sur la MMU (ce que Linux appelle PTE ).
  • Des pages énormes , si elles sont compilées dans ( CONFIG_HUGETLB_PAGE est nécessaire, et CONFIG_HUGETLBFS également pour la plupart des utilisations). Cela correspond au deuxième niveau le plus profond de descripteurs MMU (ce que Linux appelle PMD) (ou du less, il le fait habituellement, je ne sais pas si cela tient sur toutes les architectures).

La taille de la page est un compromis entre l'utilisation de la memory, l'utilisation de la memory et la vitesse.

  • Une taille de page plus grande signifie plus de pertes lorsqu'une page est partiellement utilisée, de sorte que le système manque de memory plus rapidement.
  • Un niveau de descripteur MMU plus profond signifie plus de memory du kernel pour les tables de page.
  • Un niveau de descripteur MMU plus profond signifie plus de time passé dans le parcours de la table de pages.

Les gains de tailles de pages plus grandes sont minimes pour la plupart des applications, alors que le coût est important. C'est pourquoi la plupart des systèmes utilisent uniquement des pages de taille normale.

Vous pouvez interroger la taille de la page (normale) sur votre système avec l'utilitaire getconf ou la fonction C sysconf .

 $ getconf PAGE_SIZE 4096 

L'utilisation de pages hugetlbfs nécessite le assembly des files de hugetlbfs et mmap ping.

La taille de la page dépend principalement de l'architecture du processeur. Sur x86, à partir de 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 y avoir aussi d'énormes pages de 2 Mo. Cependant, les utiliser est un peu compliqué.

Vous pouvez find plus d'informations sur la taille de la page dans l'article de Wikipedia

Le processeur détermine les tailles de page disponibles. Dans la plupart des cas, la taille de page implémentée sur les processeurs x86 et x86_64 est de 4 Ko. Cependant, le operating system peut allouer plus d'une page à la fois s'il le souhaite, et ainsi mettre efficacement en œuvre des pages 8kb, 16kb ou 32kb dans le logiciel.

Les processeurs x86 et x86_64 peuvent respectivement interfacer les pages 4mb et 2mb avec les pages standard de 4kb. Si cette capacité est utilisée, elle sera principalement utilisée pour allouer l'espace kernel.