Si vous disposez d'ouvrages ou d'articles de référence ou si vous connaissez des sites web de qualité traitant du thème abordé ici, merci de compléter l'article en donnant les références utiles à sa vérifiabilité et en les liant à la section « Notes et références ».
L’adressage mémoire est, en électronique et en informatique, la façon dont se fait l'accès aux données conservées en mémoire[1]. Une adresse mémoire est un nombre entier naturel (rarement une autre sorte d'identifiant) qui désigne une zone particulière de la mémoire, ou juste le début d'une zone. Le plus souvent, une donnée peut être lue ou écrite. La mémoire peut être temporaire (mémoire vive) pour le travail ou au contraire durable (mémoire non volatile) pour le stockage.
Utilisation
L'immense majorité des programmes informatiques fait usage de la mémoire lors de son exécution. Le stockage temporaire d'une donnée (une variable) implique l'accès à la mémoire vive : dans ce cas, c'est le processeur qui écrit sur le bus. Lors d'un accès à un composant DMA (par exemple un disque dur), c'est le contrôleur DMA qui, cette fois, agit directement sur le bus système.
Adresse physique et adresse virtuelle
Les ordinateurs assez puissants pour faire fonctionner de nombreux programmes simultanément sont généralement équipés d'une unité de gestion de mémoire (MMU) capable de traduire à la volée les adresses mémoire envoyées par le processeur à la mémoire. C'est notamment le cas des ordinateurs personnels depuis les années 1990. Lorsqu'une telle unité est en fonction, les adresses émises par le processeur sont alors des adresses virtuelles, et les adresses traduites qui arrivent à la mémoire sont des adresses physiques[2].
Le système d'exploitation peut notamment programmer l'unité de gestion de mémoire pour :
empêcher chaque processus d'accéder à la mémoire du système et des autres processus ;
cela permet de détecter et interrompre un processus dysfonctionnel avant qu'il ne corrompe des données qui ne lui appartiennent pas ;
sans cela, les processus pourraient espionner les données des autres processus ;
simuler de grandes zones d'adresses contiguës disponibles, alors que les adresses physiques disponibles sont fragmentées ;
simuler une plus grande quantité de mémoire vive qu'il n'en existe réellement, c'est la mémoire virtuelle[3] ;
Les composants périphériques jouissant d'un accès direct à la mémoire peuvent aussi voir leurs adresses traduites par une unité de gestion de mémoire dédiée (IOMMU).
Adressage direct
L'interface utilisée est dans la plupart des cas un bus, c'est-à-dire un ensemble de fils destinés à une utilisation particulière (ici l'accès à la mémoire).
Sur N fils, on peut coder 2N valeurs. Ainsi, en précisant la largeur du bus d'adresse, en nombre de bits (ou fils), on indique la capacité mémoire maximum accessible par le processeur[4] (la taille de son espace d'adressage).
En plus des fils codant l'adresse, la mémoire vive nécessite au moins un fil supplémentaire indiquant l'opération qui sera faite sur la mémoire : lecture ou écriture.
Il est possible de multiplexer le bus d'adresse avec le bus de données, en mettant en commun un certain nombre de fils, sachant qu'un signal supplémentaire devra être généré pour savoir comment interpréter les valeurs binaires circulant sur ces fils (adresse ou données). Un exemple de processeurs avec bus multiplexé : les 8086 ou 8088 d'Intel.
Un bus d'adresse trop petit, donc un adressage mémoire restreint, a été l'un des facteurs déterminants dans la disparition de certaines lignées d'ordinateurs. Par exemple, le PDP-10, une machine 36 bits dont l'espace d'adressage n'était que de 18 bits (256 kibioctets), n'a jamais eu de successeur. La gamme de mini-ordinateursPDP-11 de DEC a été remplacée par les VAX, ce qui est d'ailleurs l'abréviation de Virtual Address Extension.
Adressage indirect
On parle d'adressage indirect lorsque, pour accéder à une donnée, on récupère son adresse dans une variable[1] (ou segment de mémoire). C'est donc un adressage par référence au contenu de cette autre variable. L'adressage indirect est la méthode la plus pratique pour accéder séquentiellement à des données stockées de façon régulière, par un mécanisme de boucle : on peut ainsi balayer toute une zone de données (composantes d'un vecteur, d'un tableau, d'un arbre, etc.) en faisant varier un indice qui détermine la position[5],[6]. Dans les microprocesseurs, cette technique était réalisée grâce aux registres d'index, qui permettent de construire l'adresse mémoire sur une seule instruction-machine.
Références
↑ a et bCf. par exemple R. Zaks, Programmation du 6502, SYBEX éditions, (réimpr. 2e édition), 372 p. (ISBN2902414242), « Techniques d'adressage », p. 181
↑(en) D. Poonam Sharma, Foundation of Operating Systems : A Structure Approach with UNIX, Excel Books India, (ISBN978-81-7446-626-6), p. 62.
↑(en) Peter Denning et Robert L. Glass (dir.), In the Beginning: : Personal Recollections of Software Pioneers, Wiley and the IEEE Computer Society, , 328 p., PDF (ISBN978-0-818-67999-5, lire en ligne), « Before Memory Was Virtual ».
↑R. Zaks, Programmation du Z80, SYBEX éditions, (réimpr. 2e édition), 372 p. (ISBN2902414242), « L'organisation interne du Z80 », p. 46-50
↑Alfred Aho, John Hopcroft et Jeffrey Ullman, Structures de données et algorithmes, Paris, InterÉditions, (ISBN978-2-7296-0194-2), « 1.3 Types de données, structures de données et types de données abstraites »
↑B. Kernighan et D. Ritchie, le langage C, Masson, , « 5. Les pointeurs et les tableaux »