Pointeurs et mémoire virtuelle

Selon le fichier cpuinfo de mon système, chaque processeur de mon système a une taille d’adresse physique de 39 bits et une taille d’adresse virtuelle de 48 bits.

Mon système a 16 Go de RAM, donc la taille de l’adresse physique de 39 bits me convient car 39 bits sont plus que suffisants pour traiter 16 Go de RAM.

Cependant, la taille de l’adresse virtuelle 48 bits me perturbe. J’ai toujours pensé que je pouvais écrire des programmes C qui, du sharepoint vue du code source, pouvaient traiter 2 ^ 64 octets de mémoire virtuelle (un pointeur sur mon système ayant une longueur de 8 octets en fonction de la taille (void *)). Cependant, cpuinfo me dit que je n’ai que 2 ^ 48 octets de mémoire virtuelle. Cela signifie-t-il que mon programme C ne peut traiter que 2 ^ 48 octets de mémoire virtuelle?

Sur votre système 64 bits, les pointeurs ont bien une largeur de 64 bits. Cela signifie qu’il y a 2 64 valeurs possibles pour un pointeur.

Cependant, les implémentations actuelles de x86-64 (AMD64) utilisent uniquement les 48 bits inférieurs. Cela signifie que seulement 2 48 pointeurs potentiellement valides et beaucoup de pointeurs sont toujours invalides.

Manuel du programmeur AMD64 Architecture Volume 2: La programmation du système indique:

Actuellement, l’architecture AMD64 définit un mécanisme de conversion d’adresses virtuelles 48 bits en adresses physiques 52 bits. Le mécanisme utilisé pour traduire une adresse virtuelle complète à 64 bits est réservé et sera décrit dans une future spécification architecturale AMD64.

Le développement de nouveaux processeurs pour une exécution plus rapide et plus puissante a poussé à l’extension du registre de la machine, ce que l’on appelle normalement le mot machine.
La croissance des registres de données internes a commencé sur les anciens processeurs à partir de 4 bits (4004), jusqu’à 8, 16, 32, 64 et 128 bits (Alpha), et peut-être plus à l’avenir.
Les processeurs standard, dont la classe principale est la plus diffuse, définie comme l’informatique générale, ont comme caractéristique principale l’équivalence de taille du registre de pointeur d’instruction, et par conséquent la plage d’adressage, avec le mot naturel de la machine. Ainsi, sur un processeur 64bits, l’adresse IP et donc la mémoire sont étendues à 64bits.
Mais les 64 bits d’adressage sont vraiment une plage d’adressage énorme, allant jusqu’à 18.446.744.073.709.551.616 octets (16.777.216Tbytes). Quelque chose de tout simplement irréalisable avec les technologies actuelles. Pour cette raison, ils ont décidé de limiter l’adressage réel à 1Tbyte (2 ^ 40). Ce choix a réduit la complexité du processeur et sa consommation d’énergie.
Dans le même but de limiter les registres MMU (registres de l’unité de gestion de la mémoire) et la mémoire utilisée pour le répertoire de la page, il a été décidé de limiter la mémoire virtuelle à 256 octets (2 ^ 48).
Considérons que l’extension des lignes d’adressage de la mémoire rend plus complexe le décodage de l’adresse mémoire, nécessitant davantage de portes logiques, ce qui nécessite davantage de puissance et ralentit les temporisations de décodage, puis les cycles d’access à la mémoire.
Sur le système réel, chaque adresse, virtuelle ou physique, ayant les 16 derniers bits définis déclenche une exception d’access à la mémoire.
En conclusion, 64bits peuvent être bénéfiques sur le calcul général, mais ne sont pas efficaces pour l’adressage, mais memory pointer size = machine natural integer size est toujours souhaitable, donc …