Pourquoi les systèmes x86-64 n'ont-ils qu'un espace d'adressage virtuel de 48 bits?

97

Dans un livre, j'ai lu ce qui suit:

Les processeurs 32 bits ont 2 ^ 32 adresses possibles, tandis que les processeurs 64 bits actuels ont un espace d'adressage de 48 bits

Je m'attendais à ce que s'il s'agissait d'un processeur 64 bits, l'espace d'adressage devrait également être de 2 ^ 64.

Alors je me demandais quelle est la raison de cette limitation?

er4z0r
la source
11
Le livre doit avoir parlé spécifiquement de l'implémentation actuelle de l'architecture AMD64 (x86-64). Seuls les 48 bits de poids faible sont utilisés. Ce n'est cependant pas une limitation matérielle - les 64 bits sont tous disponibles.
Cody Gray
7
Toujours une bonne idée pour identifier le livre.
Henk Holterman
1
Je suppose que les lignes d'adresse physique ne sont pas gratuites (vous avez au moins besoin de 16 broches de processeur supplémentaires). Et je ne connais pas encore de matériel capable de remplir un espace de 48 bits avec des puces de RAM physiques sur le même processeur. Quand cela deviendra réalisable, je suis sûr qu'AMD ajoutera les 16 broches manquantes :)
Torp
7
même, ce The 32-bit processors have 2^32 possible addressesn'est pas forcément vrai, il peut exister un processeur 32 bits avec seulement 24 "broches" pour la mémoire d'adressage. Par exemple, 68EC020 (version 68020 moins chère) est un processeur 32 bits mais avec 24 bits pour la mémoire d'adressage.
ShinTakezou
21
Il y a un problème très réel avec l'adressage physique 64 bits, la taille de la page de mémoire virtuelle est trop petite. Ce qui crée d'énormes répertoires de pages et des vidages de cache TLB extrêmement coûteux à chaque changement de contexte. Passer des pages de 4 Ko à 4 Mo est une option mais très incompatible avec les systèmes d'exploitation actuels.
Hans Passant

Réponses:

134

Parce que c'est tout ce dont vous avez besoin. 48 bits vous donnent un espace d'adressage de 256 téraoctets. C'est beaucoup. Vous n'allez pas voir un système qui a besoin de plus que cela de si tôt.

Les fabricants de processeurs ont donc pris un raccourci. Ils utilisent un jeu d'instructions qui autorise un espace d'adressage complet de 64 bits, mais les processeurs actuels n'utilisent que les 48 bits inférieurs. L'alternative était de gaspiller des transistors pour gérer un plus grand espace d'adressage qui ne serait pas nécessaire pendant de nombreuses années.

Ainsi, une fois que nous approchons de la limite de 48 bits, il ne s'agit que de libérer des processeurs qui gèrent tout l'espace d'adressage, mais cela ne nécessitera aucune modification du jeu d'instructions et ne rompra pas la compatibilité.

jalf
la source
118
640kb est suffisant pour tout le monde.
7
Utilisez-vous toujours un système 8088, bdares?
Joe
23
@bdares: Mauvaise analogie. Le jeu d'instructions de l'arc 8088/8086 a une limite de 640k intégrée. Seul un nouvel ISA (386) a permis de briser la barrière. x86_64, d'autre part, prend en charge les 64 bits de l'ISA. C'est juste le matériel de la génération actuelle qui ne peut pas tous les utiliser ...
R .. GitHub STOP AIDING ICE
16
@R. En fait, la limitation du processeur était d'un mégaoctet. L'IBM PC a désigné une section de celui pour les périphériques mappés en mémoire, le BIOS, etc. Certains autres modèles 8088/8086 (Zenith Z100, si la mémoire sert) désignaient moins pour les périphériques et autres, et par conséquent plus pour les programmes d'application.
Jerry Coffin le
25
lwn.net/SubscriberLink/655437/9a48cd3e7a8cbe8a <- trois ans après cette réponse, nous atteignons déjà ces limites :) La machine HP aura 320 To de mémoire et ils ne peuvent pas le fournir comme un espace d'adressage plat à cause des 48 limitation d'adressage-bits.
Agam
18

Toute réponse faisant référence à la taille du bus et à la mémoire physique est légèrement erronée, puisque la question de OP portait sur l' espace d'adressage virtuel et non sur l'espace d'adressage physique . Par exemple, la limite supposée analogue sur certains 386 était une limite de la mémoire physique qu'ils pouvaient utiliser, et non de l'espace d'adressage virtuel, qui était toujours de 32 bits complets. En principe, vous pouvez utiliser 64 bits d'espace d'adressage virtuel, même avec seulement quelques Mo de mémoire physique; bien sûr, vous pouvez le faire en permutant, ou pour des tâches spécialisées où vous souhaitez mapper la même page à la plupart des adresses (par exemple, certaines opérations de données rares).

Je pense que la vraie réponse est qu'AMD était juste bon marché et espérait que personne ne s'en soucierait pour l'instant, mais je n'ai pas de références à citer.

R .. GitHub STOP AIDING ICE
la source
14
«Être bon marché» Je suppose que vous voulez dire ne pas ajouter de broches qui ne seront jamais utilisées, ne pas prendre de place sur la puce pour des transistors qui ne seront pas utilisés et utiliser l'espace libéré pour accélérer les instructions existantes? Si c'est bon marché, j'y suis!
Olof Forshell
Le 80386 autorise 2 * 4096 sélecteurs contenant chacun jusqu'à 4 Go de mémoire (32 To au total). Le 80286 autorisait 2 * 4096 sélecteurs contenant chacun jusqu'à 64 Ko (1 Go).
Olof Forshell
Les hacks segmentés non linéaires ne comptent pas comme espace d'adressage dans mon livre. Il n'y a aucun moyen pour les logiciels portables de les utiliser.
R .. GitHub STOP HELPING ICE
@R .. - Je pensais que la définition d'un logiciel portable est qu'il le peut . :-) Par exemple, C ++ interdit de comparer des pointeurs dans différents tableaux afin qu'ils puissent être dans des segments séparés de 4 Go.
Bo Persson
Si votre compilation génère en fait d'énormes pointeurs et charge un registre de segment pour chaque déréférence de mémoire, alors oui. Mais en réalité, c'est horriblement lent, et à la place tout le monde a utilisé de petits modèles de mémoire et __far(ou pire encore, FAR/ far!) Des pointeurs ...
R .. GitHub STOP HELPING ICE
10

Lisez la section des limitations de l' article wikipedia :

Un PC ne peut pas contenir 4 pétaoctets de mémoire (en raison de la taille des puces de mémoire actuelles si rien d'autre) mais AMD envisageait de grands serveurs, des clusters de mémoire partagée et d'autres utilisations de l'espace d'adressage physique qui pourraient approcher cela dans un avenir prévisible, et le 52 L'adresse physique de bits offre amplement d'espace pour l'expansion sans encourir le coût de mise en œuvre d'adresses physiques 64 bits

Autrement dit, il ne sert à rien d'implémenter un adressage 64 bits complet à ce stade, car nous ne pouvons pas construire un système qui pourrait utiliser un tel espace d'adressage dans son intégralité - nous choisissons donc quelque chose de pratique pour les systèmes d'aujourd'hui (et de demain).

Damien_The_Unbeliever
la source
D'où vient le 4 dans les 4 pétaoctets? Si nous parlons de 64 lignes d'adresse, nous devrions nous retrouver avec le carré de l'espace d'adressage rendu possible par 32 lignes d'adresse, soit 4 gigaoctets. Mettez cela au carré et nous devrions avoir 16, pas 4 pétaoctets. Est-ce que je manque quelque chose?
Olof Forshell
1
Cela vient de la limite physique actuelle (52 bits) - le fait est que nous ne pouvons pas mettre suffisamment de RAM dans un PC pour prendre en charge cette plage restreinte, sans parler de ce qui serait nécessaire pour un espace d'adressage complet de 64 bits.
Damien_The_Unbeliever
9

Le registre natif interne / la largeur d'opération n'a pas besoin d'être reflété dans la largeur du bus d'adresse externe.

Supposons que vous ayez un processeur 64 bits qui n'a besoin que d'accéder à 1 mégaoctet de RAM. Un bus d'adresse de 20 bits suffit. Pourquoi s'embêter avec le coût et la complexité matérielle de toutes les broches supplémentaires que vous n'utiliserez pas?

Le Motorola 68000 était comme ça; 32 bits en interne, mais avec un bus d'adresse 23 bits (et un bus de données 16 bits). Le processeur pouvait accéder à 16 mégaoctets de RAM et pour charger le type de données natif (32 bits), il fallait deux accès à la mémoire (chacun portant 16 bits de données).


la source
1
mais 68000 est considéré comme un processeur "16/32 bits", et non comme un processeur 32 bits "complet", on pourrait donc dire qu'il a encore un pied dans le passé 16 bits; J'ai choisi le 68020 comme exemple, puisque sa version 68EC020 low-cost n'a 24 bits que pour les adresses, bien que le 68020 soit un processeur 32 bits "complet" ... +1 pour avoir considéré cette merveilleuse famille de processeurs!
ShinTakezou
@ShinTakezou: honnêtement, le 80386SX était-il un processeur 16 bits (parce qu'il avait un espace d'adressage comme le 80286) ou était-il 32 bits (parce qu'il avait l'architecture interne d'un 80386DX)? On pourrait dire comme vous le faites, mais un autre (celui-ci) dit "ce qui compte c'est l'intérieur" - et vous pouvez me citer là-dessus.
Olof Forshell
@Olof Je pense que, dans le contexte de la "mémoire" (qui est le monde externe), l'externe est ce qui compte, donc 68000 est un CPU 16 bits (nécessitant 2 "étapes" pour lire les données 32 bits): D
ShinTakezou
@ShinTakezou: le contexte mémoire, même les caches, est toujours externe au processeur lui-même, même s'ils sont extrêmement étroitement couplés dans les processeurs modernes. Le 8088 était en interne égal au 8086 bien qu'il ait huit lignes de bus de données aux seize du 8086. Je ne vois pas ce que vous voyez apparemment comme évident, que le 8088 devrait être classé dans le même groupe que le Z80, 8080, 8085 etc. La question de la largeur du bus de données semble triviale dans ce contexte
Olof Forshell
Je ne suis pas du tout un expert en la matière, donc je n'ai rien d'évident pour moi.Je voulais juste remarquer la nécessité d'une coupe plus nette avec le passé, où l'on pourrait penser que 68000 est encore un processeur "à l'ancienne", donc qu'il peut sembler "naturel" que son espace d'adressage soit limité à moins de 32 bits; alors que le 68020 peut 32 bits, de sorte que l'existence du 68EC020 avec sa limite indique clairement que c'est un choix non dû à "la limite de cela ( ou this) time "mais à une autre considération (comme pour le rendre moins cher s'il n'y a pas de réel avantage à avoir 64 broches), ce qui est plus ou moins l'argument de cette réponse.
ShinTakezou
7

Il y a une raison plus grave que la simple sauvegarde des transistors dans le chemin d'adresse du processeur: si vous augmentez la taille de l'espace d'adressage, vous devez augmenter la taille de la page, augmenter la taille des tables de page ou avoir une structure de table de page plus profonde (qui est plus de niveaux de tables de traduction). Toutes ces choses augmentent le coût d'un échec TLB, ce qui nuit aux performances.

Brendan
la source
1
Intel propose un schéma de pagination à 5 niveaux pour passer des 48 bits actuels à 57 bits. (Mêmes 9 bits par niveau / 4k pages que les tableaux de pages x86-64 actuels). L'utilisation de 10 ou 11 bits par niveau aurait nécessité de changer le matériel de parcours de page, donc ce n'est peut-être pas la conception optimale pour une mémoire énorme, mais c'est une extension judicieuse pour un processeur bimode qui doit également prendre en charge des performances maximales pour 4- tables de niveau dans le format actuel.
Peter Cordes
Bien sûr, avec 2M ou 1G de pages énormes, il ne s'agit que de 4 ou 3 niveaux de tableaux de page du niveau supérieur à une entrée de table de grandes pages au lieu d'un pointeur de répertoire de page.
Peter Cordes
6

De mon point de vue, c'est le résultat de la taille de la page.Chaque page contient au plus 4096/8 = 512 entrées de table de page. Et 2 ^ 9 = 512. Donc 9 * 4 + 12 = 48.

Linzuojian
la source
4

Pour répondre à la question initiale: il n'était pas nécessaire d'ajouter plus de 48 bits de PA.

Les serveurs ont besoin de la quantité maximale de mémoire, alors essayons de creuser plus profondément.

1) La configuration de serveur la plus importante (couramment utilisée) est un système à 8 sockets. Un système 8S n'est rien d'autre que 8 CPU serveurs connectés par une interconnexion cohérente à grande vitesse (ou simplement, un «bus» à grande vitesse) pour former un seul nœud. Il existe des clusters plus importants, mais ils sont rares, nous parlons ici de configurations couramment utilisées. Notez que dans les utilisations du monde réel, le système 2 Socket est l'un des serveurs les plus couramment utilisés et 8S est généralement considéré comme très haut de gamme.

2) Les principaux types de mémoire utilisés par les serveurs sont la mémoire DRAM ordinaire adressable par octets (par exemple, la mémoire DDR3 / DDR4), la mémoire mappée IO - MMIO (comme la mémoire utilisée par une carte d'extension), ainsi que l'espace de configuration utilisé pour configurer les périphériques présents dans le système. Le premier type de mémoire est celui qui est généralement le plus grand (et a donc besoin du plus grand nombre de bits d'adresse). Certains serveurs haut de gamme utilisent également une grande quantité de MMIO en fonction de la configuration réelle du système.

3) Supposons que chaque processeur de serveur peut héberger 16 modules DIMM DDR4 dans chaque emplacement. Avec une taille maximale de DIMM DDR4 de 256 Go. (Selon la version du serveur, ce nombre de DIMM possibles par socket est en fait inférieur à 16 DIMM, mais continuez à lire pour le bien de l'exemple).

Ainsi, chaque socket peut théoriquement avoir 16 * 256 Go = 4096 Go = 4 To. Pour notre exemple de système 8S, la taille de la DRAM peut être au maximum de 4 * 8 = 32 To. Cela signifie que le nombre maximal de bits nécessaires pour adresser cet espace DRAM est de 45 (= log2 32 To / log2 2).

Nous n'entrerons pas dans les détails des autres types de mémoire (MMIO, MMCFG, etc.), mais le point ici est que le type de mémoire le plus "exigeant" pour un système à 8 sockets avec les plus grands types de DIMM DDR4 disponibles aujourd'hui (256 Go DIMM) n'utilisent que 45 bits.

Pour un système d'exploitation prenant en charge 48 bits (WS16 par exemple), il reste (48-45 =) 3 bits. Ce qui signifie que si nous avons utilisé les 45 bits inférieurs uniquement pour 32 To de DRAM, nous avons toujours 2 ^ 3 fois de mémoire adressable qui peut être utilisée pour MMIO / MMCFG pour un total de 256 To d'espace adressable.

Donc, pour résumer: 1) 48 bits d'adresse physique, c'est beaucoup de bits pour prendre en charge les plus grands systèmes d'aujourd'hui qui sont "entièrement chargés" avec de grandes quantités de DDR4 et aussi de nombreux autres périphériques IO qui nécessitent de l'espace MMIO. 256 To pour être exact.

Notez que cet espace d'adressage de 256 To (= 48 bits d'adresse physique) n'inclut PAS de lecteurs de disque comme les lecteurs SATA car ils ne font PAS partie de la mappe d'adresses, ils n'incluent que la mémoire adressable par octets et exposée au système d'exploitation.

2) Le matériel CPU peut choisir d'implémenter 46, 48 ou> 48 bits en fonction de la génération du serveur. Mais un autre facteur important est le nombre de bits que le système d'exploitation reconnaît. Aujourd'hui, WS16 prend en charge les adresses physiques 48 bits (= 256 To).

Ce que cela signifie pour l'utilisateur, c'est que, même si l'on dispose d'un grand processeur de serveur ultra moderne pouvant prendre en charge> 48 bits d'adressage, si vous exécutez un système d'exploitation qui ne prend en charge que 48 bits de PA, vous ne pouvez profiter que de 256 To. .

3) Dans l'ensemble, il y a deux facteurs principaux pour profiter d'un plus grand nombre de bits d'adresse (= plus de capacité de mémoire).

a) Combien de bits votre CPU HW prend-il en charge? (Cela peut être déterminé par l'instruction CPUID dans les processeurs Intel).

b) Quelle version du système d'exploitation utilisez-vous et combien de bits de PA reconnaît-il / prend en charge.

Le minimum de (a, b) déterminera finalement la quantité d'espace adressable dont votre système peut tirer parti.

J'ai écrit cette réponse sans examiner les autres réponses en détail. De plus, je n'ai pas approfondi les nuances de MMIO, MMCFG et l'intégralité de la construction de la carte d'adresses. Mais j'espère que cela aide.

Merci, Anand K Enamandram, architecte de la plate-forme serveur Intel Corporation

Anand K Enamandram
la source
Cette question concerne la taille de l'espace d'adressage virtuel de 48 bits (exigeant que les adresses virtuelles soient canoniques). Vous voulez plus de bits virtuels que de bits physiques, donc un noyau haut de gamme peut mapper toute la mémoire physique dans un seul espace d'adressage (son propre espace ou espace utilisateur). Comme vous le dites, HW n'a besoin que d'implémenter autant de bits PA que les contrôleurs DRAM + MMIO peuvent utiliser, et peut utiliser n'importe quel nombre jusqu'à la limite de 52 bits dans le format de table de pages x86-64. ( Pourquoi en 64 bits l'adresse virtuelle est de 4 bits courte (48 bits de long) par rapport à l'adresse physique (52 bits de long)? )
Peter Cordes
1
Le format de table de pages à 4 niveaux impose également la limite VA de 48 bits, jusqu'à ce que HW + SW prenne en charge les tables de pages PML5 pour les VA 57 bits. Quoi qu'il en soit, c'est une réponse utile, mais elle semble être publiée sous la mauvaise question. Je ne suis pas sûr qu'il y ait un meilleur endroit pour cela, alors je suppose que nous pouvons le laisser ici, avec un peu de chance avec une modification pour ajouter un en-tête pour dire quelque chose sur PA vs VA.
Peter Cordes
2

Beaucoup de gens ont cette idée fausse. Mais je vous promets que si vous lisez ceci attentivement, après avoir lu ceci, toutes vos idées fausses seront claires.

Dire qu'un processeur 32 bits ou 64 bits ne signifie pas qu'il doit avoir respectivement un bus d'adresse 32 bits ou un bus d'adresse 64 bits! ... Je le répète, PAS !!

Processeur 32 bits signifie qu'il a 32 bits ALU (unité arithmétique et logique) ... cela signifie qu'il peut fonctionner sur un opérande binaire 32 bits (ou simplement dire un nombre binaire ayant 32 chiffres) et de même un processeur 64 bits peut fonctionner sur un binaire 64 bits opérande. Donc, la météo d'un processeur 32 bits ou 64 bits NE signifie PAS que la quantité maximale de mémoire peut être installée. Ils montrent simplement la taille de l'opérande ... (par analogie, vous pouvez penser qu'une calculatrice à 10 chiffres peut calculer des résultats jusqu'à 10 chiffres ... cela ne peut pas nous donner 11 chiffres ou d'autres résultats plus importants ... bien que ce soit en décimal mais je dis cette analogie pour simplifier) ​​... mais ce que vous dites est l'espace d'adressage qui est la taille maximale directement interfacable de la mémoire (RAM). Le bélier' La taille maximale possible de s est déterminée par la taille du bus d'adresse et ce n'est pas la taille du bus de données ou même de l'ALU sur lequel la taille du processeur est définie (32/64 bits). Oui si un processeur a un "bus d'adresse" 32 bits alors il est capable d'adresser 2 ^ 32 octets = 4 Go de RAM (ou pour 64 bits ce sera 2 ^ 64) ... mais en disant qu'un processeur 32 bits ou 64 bits a rien de pertinent pour cet espace d'adressage (espace d'adressage = jusqu'où il peut accéder à la mémoire ou la taille maximale de la RAM) et il ne dépend que de la taille de son ALU. Bien sûr, le bus de données et le bus d'adresse peuvent être de la même taille et alors il peut sembler qu'un processeur 32 bits signifie qu'il accédera à 2 ^ 32 octets ou 4 Go de mémoire ... mais ce n'est qu'une coïncidence et ce ne sera pas la même chose pour tous.... par exemple intel 8086 est un processeur 16 bits (car il a 16 bits ALU) donc comme vous le dites, il aurait dû accéder à 2 ^ 16 octets = 64 Ko de mémoire mais ce n'est pas vrai. Il peut accéder jusqu'à 1 Mo de mémoire pour avoir un bus d'adresse 20 bits .... Vous pouvez google si vous avez des doutes :)

Je pense avoir clarifié mon point de vue.Maintenant, pour venir à votre question ... comme un processeur 64 bits ne signifie pas qu'il doit avoir un bus d'adresse 64 bits, il n'y a donc rien de mal à avoir un bus d'adresse 48 bits dans un processeur 64 bits ... ils ont réduit l'espace d'adressage pour rendre la conception et la fabrication bon marché ... car personne n'utilisera une mémoire aussi grande (2 ^ 64 octets) ... où 2 ^ 48 octets sont plus que suffisants de nos jours.

hafiz031
la source
Je pense que vous avez clairement expliqué votre point de vue, il y a une chose que je ne comprends pas dans ce que vous avez dit à propos du processeur 16 bits 8086: comment un processeur 16 bits peut-il gérer une adresse 20 bits? Le gère-t-il en 2 étapes? Même si le bus d'adresse a une largeur de 20 bits, une fois qu'il arrive au CPU, la largeur du registre ne peut évidemment prendre que 16 bits ... Comment font-ils cela?
programmersn
2
Hmm ... opération en 2 étapes. Le registre de segment contient uniquement les 16 bits supérieurs. Ensuite, il est multiplié par 10H pour en faire 20 bits, puis le décalage est ajouté.
hafiz031
1

Ce n'est pas vrai que seuls les 48 bits de poids faible d'un VA 64 bits sont utilisés, du moins avec Intel 64. Les 16 bits supérieurs sont utilisés, en quelque sorte, en quelque sorte.

La section 3.3.7.1 Adressage canonique dans le manuel du développeur de logiciels des architectures Intel® 64 et IA-32 dit:

une adresse canonique doit avoir les bits 63 à 48 définis sur des zéros ou des uns (selon que le bit 47 est un zéro ou un un)

Ainsi, les bits 47 à 63 forment un super-bit, soit tous les 1, soit tous les 0. Si une adresse n'est pas sous forme canonique, l'implémentation doit être défaillante.

Sur AArch64, c'est différent. Selon l' aperçu du jeu d'instructions ARMv8 , il s'agit d'un VA 49 bits.

Le système de traduction de mémoire AArch64 prend en charge une adresse virtuelle de 49 bits (48 bits par table de traduction). Les adresses virtuelles sont étendues de signe à partir de 49 bits et stockées dans un pointeur de 64 bits. En option, sous le contrôle d'un registre système, les 8 bits les plus significatifs d'un pointeur 64 bits peuvent contenir une «étiquette» qui sera ignorée lorsqu'elle est utilisée comme adresse de chargement / stockage ou comme cible d'une branche indirecte

Olsoniste
la source
1
Seuls les 48 inférieurs sont significatifs, mais le matériel vérifie qu'il est correctement étendu à 64 bits. IDK pourquoi ils n'ont pas spécifié l'extension zéro; peut-être voulaient-ils rendre plus pratique la vérification d'une demi-adresse haute ou basse (en vérifiant simplement le bit de signe). Ou peut-être pour éviter de rendre la limite 2 ^ 48 spéciale, et ainsi les adresses près du haut peuvent convenablement s'adapter à des constantes étendues de signe 32 bits. Je pense que ce dernier est plus probable.
Peter Cordes
Quoi qu'il en soit, la vérification actuelle du matériel canonique empêche le logiciel d'utiliser des bits ignorés pour les pointeurs étiquetés qui se casseront sur le futur matériel, donc cela fait partie du mécanisme qui permet d'étendre le futur matériel si / quand c'est nécessaire. (Ce qui pourrait être plus tôt que prévu, grâce à la mémoire non volatile connectée directement à l'espace d'adressage physique et virtuel.)
Peter Cordes
procfs sur Linux sur mon Core i5 dit qu'il est mappé sur 7ffd5ea41000-7ffd5ea62000. Cette plage d'adresses a du sens selon la règle «canonique» ci-dessus. Les bits 48 à 63 sont à 0, ce qui en fait une adresse canonique correcte. Ce qui est un peu étrange, ce sont certaines adresses dans la source Linux. Dans include / asm / pgtable_64_types, il est indiqué #define __VMALLOC_BASE _AC (0xff92000000000000, UL). Ce n'est PAS une adresse canonique. Une telle adresse commencerait par 0xffff8. Je ne sais pas pourquoi.
Olsonist
Ouais, IIRC Linux utilise la moitié inférieure de la plage canonique pour l'espace utilisateur, et (principalement) utilise la moitié supérieure pour les mappages de noyau uniquement. Mais une partie de la mémoire du noyau est exportée vers l'espace utilisateur, comme la [vsyscall]page. (Il peut s'agir d'exporter des éléments tels que le PID actuel, ce qui getpid()est purement de l'espace utilisateur. Vous gettimeofday()pouvez également simplement utiliser rdtsc dans l'espace utilisateur + les facteurs d'échelle exportés par le noyau. Bien que je pense en partie [vdso], ce moitié inférieure.)
Peter Cordes
IDK quoi __VMALLOC_BASE fait. Il n'est probablement pas utilisé directement.
Peter Cordes
0

Un CPU est considéré comme "N-bits" principalement sur sa taille de bus de données, et sur une grande partie de ses entités (architecture interne) : registres, accumulateurs, unité arithmétique-logique (ALU), jeu d'instructions, etc. Par exemple: Le bon vieux processeur Motorola 6800 (ou Intel 8050) est un processeur 8 bits. Il a un bus de données 8 bits, une architecture interne 8 bits et un bus d'adresse 16 bits.


  • Bien que le processeur N bits puisse avoir des entités autres que de taille N. Par exemple, les améliorations du 6809 par rapport au 6800 (les deux sont des processeurs 8 bits avec un bus de données 8 bits). Parmi les améliorations significatives introduites dans le 6809 figuraient l'utilisation de deux accumulateurs 8 bits (A et B, qui pouvaient être combinés en un seul registre 16 bits, D), deux registres d'index 16 bits (X, Y) et deux Pointeurs de pile 16 bits.
Amit G.
la source
Il y a déjà une réponse faisant ce point avec Motorola 68000/68020 comme exemple. Cette question concerne spécifiquement x86-64, pas les anciens processeurs 8/16 bits. Dans le cas de x86-64, l'un des principaux facteurs est que les adresses virtuelles plus larges auraient besoin d'une table de pages plus profonde, et ce facteur n'existait pas pour les anciennes puces dont vous parlez.
Peter Cordes
la largeur du bus de données ne doit pas nécessairement correspondre à la largeur du registre ou de l'ALU. Par exemple, le P5 Pentium a un bus de données 64 bits (les charges / stockages 64 bits alignés sont garantis atomiques), mais les registres / ALU ne sont que 32 bits (sauf pour le FPU intégré, et dans le Pentium MMX plus récent, le SIMD ALUs.)
Peter Cordes
OP écrit: "Je m'attendais à ce que si c'est un processeur 64 bits, l'espace d'adressage devrait également être 2 ^ 64." ........ Vous écrivez: "Cette question concerne en fait x86-64 en particulier, pas les anciens processeurs 8/16 bits". ........ Je pense que vous avez manqué l'essence de la question OP. La question OP est le résultat de l'hypothèse erronée selon laquelle un processeur 64 bits devrait avoir un bus d'adresse 64 bits. A propos de l'ALU, j'ai écrit une grande partie de ses entités; Pas tous.
Amit G.
Arrêtez de me spammer en republiant ce commentaire. Oui, bien sûr, le PO est faux pour la raison que vous décrivez, mais je faisais remarquer que votre réponse semble faire une erreur similaire. Vous dites " et par conséquent une grande partie de ses entités: registres et accumulateurs, unité arithmétique-logique (ALU) ... ", ce qui ressemble à ce que vous dites que ces choses correspondent à la largeur du bus de données. L'expression «une grande partie» implique que vous dites quelles parties, non que ce n'est parfois vrai que pour ces parties.
Peter Cordes