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


43

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 sont divisées en pages. Un numéro unique est attribué à chacune de ces pages. 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-ce influencé par la taille de l'architecture? Par exemple, un bus 32 bits aura 4 Go d'espace d'adressage.

Réponses:


56

Vous pouvez connaître la taille de page par défaut d'un système en interrogeant sa configuration à l'aide de la getconfcommande suivante:

$ getconf PAGE_SIZE
4096

ou

$ getconf PAGESIZE
4096

REMARQUE: les unités ci-dessus sont généralement exprimées en octets. Par conséquent, 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 4096?

Lorsque vous décalez les bits, vous effectuez une multiplication binaire par 2. Donc, en fait, un décalage des bits vers la gauche ( 1 << PAGE_SHIFT) correspond à la multiplication de 2 ^ 12 = 4096.

$ echo "2^12" | bc
4096

2
Le matériel moderne prend en charge 2 Mo, et environ 1 Go, la taille des pages. "PAGE_SHIFT" peut-il être défini sur 21 pour les pages de 2 Mo par défaut pour la construction du noyau?
ReverseFlow

2
@ReverseFlow Pour obtenir une telle réponse, je poserais une question distincte.
Kirill Bulygin

@sim, se demandant pourquoi les manipulations de bits sont-elles utilisées ici? J'ai lu que le compilateur convertit généralement les multiplications en manipulations de bits, donnant ainsi les mêmes performances.
InAFlash

17

Le matériel (en particulier la MMU , qui fait partie de la CPU) détermine les tailles de page 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 également des pages plus petites), mais 4 Ko est un paramètre par défaut très répandu.

Linux supporte deux tailles de page:

  • Les pages de taille normale, 4 Ko par défaut sur toutes les architectures, bien que certaines architectures en autorisent d'autres, par exemple 16 Ko sur ARM64 ou 8 Ko, 16 Ko ou 64 Ko sur IA64 . Celles-ci correspondent au niveau le plus profond de descripteurs sur la MMU (ce que Linux appelle PTE ).
  • Grandes pages , si compilées dedans ( CONFIG_HUGETLB_PAGEest nécessaire, et CONFIG_HUGETLBFSaussi pour la plupart des utilisations). Cela correspond au deuxième niveau le plus profond de descripteurs MMU (ce que Linux appelle PMD) (ou du moins c'est généralement le cas, je ne sais pas si cela est valable pour 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 rapidement de mémoire.
  • Un niveau de descripteur MMU plus profond signifie plus de mémoire noyau pour les tables de pages.
  • Un niveau de descripteur MMU plus élevé signifie plus de temps passé dans le parcours de la table de pages.

Les gains de grandes tailles de page sont minimes pour la plupart des applications, alors que leur coût est considérable. C'est pourquoi la plupart des systèmes n'utilisent que des pages de taille normale.

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

$ getconf PAGE_SIZE
4096

L'utilisation de pages volumineuses nécessite de monter le hugetlbfssystème de fichiers et mmaples fichiers ping à cet endroit.


FYI: L'utilisation de pages volumineuses ne nécessite pas de montage hugetlbfs, car dans la note du noyau, vous pouvez également utiliser des appels à la mémoire partagée ou un indicateur mmap. De manière plus intéressante, vous pouvez également activer des pages énormes transparentes. Le noyau convertira automatiquement les pages normales en pages énormes lorsque cela est possible dans toutes les applications.
derobert

C'est la réponse vraiment fondamentale. Linux est juste conçu pour bien utiliser le matériel de pagination. Plus de détails sur la pagination: stackoverflow.com/questions/18431261/how-does-x86-paging-work
Ciro Santilli新疆改造中心法轮功六四事件

0

La taille de la page dépend principalement de l'architecture du processeur. Sur x86, à partir du moment où le processeur 386 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, d’une taille de 2 Mo. Cependant, les utiliser est un peu compliqué.

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


0

Le processeur détermine les formats de page disponibles. Dans la plupart des cas, la taille de page implémentée matériellement 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 implémenter ainsi efficacement des pages de 8 Ko, 16 Ko ou 32 Ko dans un logiciel.

Les processeurs x86 et x86_64 peuvent é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 sera principalement utilisée pour allouer de l’espace au noyau.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.