Conservatoire national des arts et métiers
Architectures des systèmes informatiques
CHAPITRE 4
Plus grand svp ! Organisation et gestion de la mémoire
Année 2002-2003

Suite N°4...

4.6 ÉVOLUTION DE LA GESTION DE LA MÉMOIRE DANS UNE GAMME DE MICROPROCESSEURS

La gamme choisie est celle d'Intel, ses représentants sont les 8086, 80186, 80286, 80386, 80486 et Pentium.

-- 80086 --

Une segmentation de la mémoire centrale y est installée. Elle fonctionne par quatre registres descripteurs attachés à chaque processus qui en fait la demande :

CS segment de code (code segment),
DS segment de données (data segment),
SS segment de pile (stack segment),
ES segment de données supplémentaires (extra segment).

Ils sont utilisés par défaut dans tous les calculs d'adresses. À la création du programme des directives doivent préciser les segments qui seront utilisés. Ces registres sont sur 16 bits. Les adresses du programme sont, elles aussi, sur 16 bits. La règle de combinaison est la suivante :


L'adresse obtenue est sur 20  bits. La capacité d'adressage est ainsi de 1 MO.
Les adresses de début de segments en mémoire vont de 16 en 16.
Les segments sont limités à 64 ko.

On peut s'interroger rétrospectivement sur ces choix. Ils correspondent à un moment où la mémoire était disponible sous la forme de puces de 4 k bits. Elle était chère et limitée à 64 ko dans la génération précédente : 6800, 8085, Z80. Les programmes des microordinateurs ne dépassaient pas 55 ko. Le tout premier PC d'IBM avait une mémoire de 64 ko. La taille de 1 Mo paraissait considérable. Un segment de 64 ko pour les programmes était grand.

Ces quatre registres sont modifiables en mode superviseur à tout instant. Ils correspondent sensiblement à l'architecture de Multics, à la différence que le segment de données est unique et contient toutes les données sans spécialisation. Si un programme ne contient pas de référence à des adresses de segments, il est translatable dynamiquement. Cette partie du 8086 se trouve à l'identique dans le 8088 (ce dernier ne différant que par la gestion du bus de données en deux cycles de 8 bits au lieu d'un cycle de 16 bits).

Cette segmentation était suffisante pour réaliser un système multiutilisateurs ou multitâche. Cela a été fait Digital Research dans son système Concurrent CPM et par d'autres, Prologue et Mercure notamment. On n'a jamais vu cette possibilité utilisée par Microsoft dans ses MSDOS, malgré de nombreuses allusions à un multitâche à venir. Dès le début, les processeurs d'Intel ont été très largement sous utilisés par Microsoft.

Ce processeur était le premier d'une nouvelle gamme. Il faisait suite au 8085 qui gérait 8 bits de données et 16 bits d'adresse. On peut le considérer comme une extension du précédent pour la gestion d'une mémoire de plusieurs segments de 64 ko au lieu d'un seul.

-- 80186 --

La segmentation est identique à celle du 8086. Ce microprocesseur n'a pas été utilisé pour les microordinateurs.

-- 80286 --

Il a deux modes de fonctionnement. Les descripteurs de segments sont logés dans une table dite table des descripteurs.

Le premier mode, nommé adressage réel est identique à celui des 8086 et 80186. Le second est l'adressage virtuel. Les mêmes registres de segments sont évidemment utilisés. Chaque registre de segment est accompagné de trois registres d'extension non accessibles par programme.


Le bit 0 indique la validité: un descripteur a ou non été chargé dans le registre.
Les bits de 1 à 15 contiennent la longueur effective du segment SUR 16 BITS, car un premier bit de rang 0 non représenté est supposé à valeur zéro.
Les bits de 16 à 39 sont une base sur 24 bits.
Les bits de 40 à 47 sont le descripteur des droits, sur 8 bits.

La valeur du sélecteur est alors un déplacement dans cette table.


Il existe d'autres descripteurs, utilisés pour d'autres types de données: système, porte d'accès, interruptions.

Notion de privilège.

En plus de la gestion de la mémoire décrite ci-dessus, le 80286 a un système de privilèges hiérarchisés à quatre niveaux qui donne ou interdit les accès aux descripteurs et à leurs segments à l'intérieur d'une tâche. Ainsi, le noyau du système d'exploitation pourra être placé au niveau 0 (le privilège le plus haut), ses services au niveau 1, ses extensions en 2 et les  programmes d'application en 3. Cette répartition n'est donnée qu'à titre indicatif. Elle a un parfum de Multics.

Ces privilèges fournissent une protection à l'intérieur d'une tâche. Les tâches sont isolées les unes des autres par leur table de segments privée exclusive.

Tâches et descripteurs sélectionneront chacun un niveau de privilège. Celui de la tâche conditionne l'utilisation des instructions et des descripteurs; les privilèges des descripteurs et sélecteurs affecte l'accès aux descripteurs comme suit :

Privilège d'une tâche.

Une tâche exécute un programme dans un des quatre niveaux. Celui qui est affecté à un instant donné, le privilège courant, est défini par les deux bits de poids faible du registre CS. Il ne change pas pendant l'exécution du segment de code. Il est modifiable lors d'un changement de segment. Une tâche au niveau 0 peut accéder à tous les segments de données des tables globale et locales, alors qu'au niveau 3 l'accès aux données peut être limité.

Privilège d'un descripteur.

Il est défini dans le descripteur lui-même, il est le niveau de privilège le moins prioritaire avec lequel une tâche peut accéder à ce descripteur. Exemple : Les descripteurs à 1 ne sont accessibles qu'aux tâches et privilèges 0 et 1. Cette règle ne s'applique pas aux descripteurs de la table locale de la tâche.

Ce mécanisme encode ainsi localement les autorisations d'accès. Les instructions associées n'ont donc plus à avoir des privilèges particuliers. Il n'y a pas ici «d'instructions réservées au système» à statut particulier.

Accès aux descripteurs et validation des privilèges.

L'accès à un segment, par une tâche, met en jeu le type de segment et de descripteur considérés, l'instruction employée et les niveaux de privilèges. Les règles d'accès sont appliquées à chaque changement de descripteur de segment sans intervention logicielle.

Accès à un segment de code :
1) Même tâche, même niveau : accès direct

2) Même tâche, niveau différent par franchissement d'une porte
3) autre tâche par franchissement de porte avec changement de contexte.


La  notion de porte est matérialisée par un descripteur spécial situé dans les tables de descripteurs de la tâche, il donne l'accès au descripteur du segment visé et impose le point d'entrée dans ce segment.

NOTE : le privilège de la porte associée doit être «compatible», c'est-à-dire que son privilège doit être égal ou inférieur à celui de la tâche appelante.

-- 80386 --

Ce processeur est le premier vrai 32 bits de la famille. La segmentation du 80286, décrite ci-dessus, est conservée mais la taille du segment est extensible à 4 Go. Il supporte jusqu'à 16x1024 segments de 4 Go mais n'adresse que 4 Go de mémoire réelle. Il contient deux registres de segments de données en plus de ceux de son prédécesseur, ce qui diminue le nombre de recours à des changements de base de segments de données et rend translatables des programmes qui ne l'étaient pas, à cause des références aux contenus des segments qu'ils contenaient.

Il contient en plus une pagination de la mémoire dont l'utilisation est libre. Quand elle est mise en service, la segmentation et la pagination sont simultanées. Les pages sont de 4 ko. Elle a été introduite pour pouvoir fragmenter cette mémoire.

La pagination utilise deux jeux de tables pour traduire une adresse logique, linéaire, en adresse physique. Les composants de ce système sont :
Le répertoire des pages sur 4 ko
La table des pages sur 4 ko
La page de 4 ko

Elle opère selon le mécanisme suivant :


Le répertoire contient 1024 entrées de 4 octets chacune. Chaque entrée contient, entre autres, l'adresse de début de la table des pages qui lui est associée.


La table des pages et ses entrées ont la même structure que le répertoire des pages et ses propres entrées. La page est chargée en mémoire centrale à partir d'un support externe, elle peut être partagée par différents programmes. Les informations autres que l'adresse, servent à la protection et à la gestion des pages.

Champs du système 9-10-11

3 bits à usage libre, par exemple l'ancienneté de la page en mémoire centrale pour utiliser un algorithme du type: la plus anciennement utilisée doit être la première supprimée. Ces 3 bits doivent être gérés par le système d'exploitation.

Présence : bit P,
P = O : la page (la table) n'est pas présente en mémoire centrale, les 30 autres bits sont alors l'adresse linéaire de sa localisation.
R/W : accessibilité : en lecture ou en écriture.
U/S : nature du contenu : utilisateur ou système.
Accès : bit A, positionné avant l'accès physique (lecture ou écriture).
Mise à jour : bit D,D = 1 après modification.

Pendant la mise à jour des bits P, A et D, l'accès au bus est verrouillé pour éviter un conflit d'accès.

Le dernier dispositif est la TLB :

Translation Lookaside Buffer, tampon de table «en un coup d'œil» déjà mentionné. C'est une mémoire associative qui, en un cycle, détecte la coïncidence entre l'adresse de page fournie et les références qu'elle contient. Le pointeur est alors fourni en sortie dans le même cycle. Cette technique se trouve dans presque tous les systèmes récents de pagination.

Ici la TLB a 32 entrées, elles sont les références des 32 dernières pages utilisées. Pour elles un seul niveau d'accès suffira au lieu de deux. Intel indique que dans les systèmes multitâches habituels seules 2% des références à la mémoire nécessitent l'accès aux deux niveaux.

-- 80486 --

Pour l'essentiel le 486 est un 386 beaucoup plus intégré et optimisé. La même puce contient en plus du processeur et de l'UGM, l'unité de calcul en virgule flottante et un cache de 8 ko. Il contient un dispositif original qui sélectionne par programme l'ordre des octets en mémoire : premier octet - faible poids ou premier octet - poids fort. Deux autres différences existent dans la gestion des pages. Il utilise deux des trois bits réservés au système pour commander la gestion du cache de descripteurs. Ces deux bits sont sortis sur pattes pour la gestion éventuelle d'extensions de caches hors la puce. La possibilité de mettre ou non en cache et donc de forcer la résidence en mémoire de certaines pages est utile pour réaliser des systèmes multiprocesseurs.

Le jeu d'instructions complet du 486 est bien sûr de type CISC, ne serait ce que pour la compatibilité ascendante mais si l'on se borne à utiliser un noyau bien choisi d'instructions il est utilisable en tant que processeur Risc (voir plus loin).

-- PENTIUM --

Il est constitué d'une UAL à structure parallèle regroupant 4 UAL de 80386. Il s'agit donc d'un processeur de type «superscalaire». Intel a laissé diffuser l'information selon laquelle il intègre des notions à la fois de CISC et de RISC, on dirait alors CRISC (Complex Reduce Instruction Set Computer). Cette caractéristique n'apparaît clairement que si l'on distingue la programmation faite en CISC, jeu d'instructions x56, et l'exécution, invisible du programmeur, faite dans un noyau RISC.

Il est complété par une unité spécialisée dans les calculs en virgule flottante et par deux  mémoires caches de 8 ko chacune, en faisant une architecture de Harvard réduite à ces caches (comme dans le 68040). Le chemin de données sur le bus et les registres internes sont sur 64 bits. Ses premières réalisations ont fonctionné à 33 MHz, donnant environ 100 Mips soit, à  fréquence égale, une capacité double de celle du 486. Il a une compatibilité entière avec les précédents de la gamme.

En conclusion et indépendamment des avantages et inconvénients de chaque solution choisie, on doit noter pour cette gamme:


4.7 AUTRES DISPOSITIFS DE GESTION DE LA MÉMOIRE

-- MOTOROLA MMU 68851 --

Cette puce a été définie pour être utilisée avec le 68020 à travers son interface coprocesseur. Elle a été conçue pour une gestion de mémoire virtuelle par pagination, elle contient aussi une segmentation rudimentaire. Son adressage virtuel est de 4 Go. Au moyen de codes de fonction émis par le processeur, elle complète ces valeurs pour définir quatre types d'espaces logiques : code utilisateur, données de l'utilisateur, code du superviseur, données du superviseur. Comme toutes les UGM non intégrées, ses fonctionnalités sont grandes mais ses temps de réponse le sont aussi.

L'espace d'adressage virtuel est divisé en pages de taille programmable de 256 octets à 32 ko. La gestion des pages est elle-même programmable et peut avoir jusqu'à 5 niveaux de profondeur en arborescence. Les descripteurs sont de deux types, long sur 8 octets ou court sur 4 octets, dépendant de la taille de la page. Un jeu de pointeurs donne une possibilité originale. Un même descripteur de table de pages peut décrire des pages partagées par des espaces d'adressage différents. Utilisant cela pour des pages partagées (ou communes), le nombre des mises à jour nécessaires sera diminué en proportion.

La TLB est particulièrement soignée. Elle a 64 entrées, en associativité complète. De plus, des références à 8 tâches différentes peuvent y être enregistrées. Enfin certaines peuvent être bloquées, interdisant leur remplacement, ce qui rend plus rapide le fonctionnement de tâches critiques.

Le mécanisme de protection est situé au somment du dispositif de pagination. Il fournit 8 niveaux de protection à gérer bien sûr par le système d'exploitation. Le système de cache est relativement complexe et efficace.

-- MOTOROLA 68040 --

Il s'agit d'un processeur déduit du 68030 par optimisation et intégration

.de l'unité de calcul en virgule flottante,
.de l'UGM,
.de deux caches de mémoire.

Ces deux caches fonctionnent en architecture de Harvard, l'un pour les instructions, l'autre pour les données. Il y a donc deux TLB, un pour chaque cache. Chacun contient 64 entrées qui sont relatives soit à une tâche utilisatrice unique, soit au système. L'UGM gère deux tailles de pages commutées par programme, l'une de 4 ko l'autre de 8 ko. Les arbres de gestion ont trois niveaux de profondeur et des arbres distincts sont disponibles pour l'utilisateur et pour le système d'exploitation. Les deux TLB contiennent en plus deux registres qui définissent des régions non translatables de la mémoire .

Les descripteurs de pages contiennent les bits usuels et une réserve pour gérer la politique de remplacement des pages.

-- FUJITSU MB 86920 --

Cette UGM accompagne le processeur SPARC (Scalable Processor ARChitecture) de Sun Microsystems. Sparc est de style RISC, basé sur les deux processeurs RISC et RISC II de Berkeley. La version  de Sun est produite en seconde source par plusieurs constructeurs dont Fujitsu. Cette UGM ne fait pas partie de l'architecture Sun. En effet chaque fournisseur de Sparc a la charge de produire ou de se procurer son UGM. Celles-ci sont en général incompatibles entre elles.

L'UGM de Fujitsu est définie pour Unix et son dérivé Sun OS. En termes de complexité, elle est proche des UGM de machines RISC. Elle contient une pagination à tables hiérarchisées à trois niveaux. L'UGM divise l'adresse virtuelle émise par Sparc en trois champs correspondant respectivement aux région, segment et page d'Unix. La page contient 4 ko. Chaque descripteur d'entrée contient, en plus  des bits usuels, une paire de bits qui codent l'état valide ou invalide de la page et son type.

La TLB est complètement associative ici aussi et contient 64 entrées pour des contextes multiples. Il y a plusieurs modes possibles pour leur remplacement. On note en plus une possibilité de ne pas cacher les descripteurs, ce qui rend possible une architecture multiprocesseur.

TABLEAU COMPARATIF
 
Fonction
Intel
80386-80486
Intel
i860
Motorola
68020/30
Motorola
88000
Sparc MB86920
MIPS R2000/3000
Adressage virtuel Go
65536
4
4
4
64
4
Adressage physique Go
4
4
4
4
4
4
Segmentation
Nbre de segments
Taille du segment
OUI
16384
4 Go
NON
-
-
NON
-
-
NON
-
-
NON
-
-
NON
-
-
Pagination
Taille de la page
Nombre de niveaux
OUI
4 ko
2
OUI
4 ko
2
OUI
256o/32ko
jusqu'à 5
OUI
4 ko
2
OUI
4 ko
jusqu'à 3
OUI
4 ko
NON
Protection :
Segment
Page
Nombre de niveaux
.
OUI
OUI
4
.
-
OUI
2
.
-
OUI
8
.
-
OUI
2
.
-
OUI
2
.
-
PARTIEL
2

i860 fut un temps le processeur RISC d'Intel.
88000 fut un temps le processeur RISC de Motorola.
R2000/R3000 de MIPS dérivent du projet de machine RISC de l'université de Stanford.

Les UGM de processeurs fournissent comme annoncé le support matériel de calcul de translations d'adresses ainsi que les registres et les descripteurs utiles à la protection et au partage de l'espace adressable. Ils contiennent également les indicateurs nécessaires à une gestion de mémoire virtuelle. On voit en plus apparaître des indicateurs pour une prévision du chargement et du remplacement des pages.

Tous maintenant ont la pagination, mais pas la segmentation. La hiérarchisation des accès aux tables de pages, utile pour la mise en œuvre d'Unix et pour la gestion d'espaces partagés ou communs devient usuelle. En termes d'utilisation, ces hiérarchies, spécialement si leur nombre est programmable, fournissent la plupart des fonctionnalités de la segmentation, sauf bien sûr la taille variable du segment.

La taille de page à 4 ko devient le cas le plus fréquent. On remarque peu de différences entre les UGM de processeurs CISC et celles des processeurs RISC sauf une simplicité plus grande de ces dernières.

Toutefois, la tendance perceptible à construire des systèmes multiprocesseurs devra être accompagnée d'une nouvelle génération d'UGM qui prendront en compte la cohérence des descripteurs et des caches eux-mêmes réels ou virtuels.


.

  CE FICHIER N'A PAS DE QUESTIONNAIRE

Conservatoire national des arts et métiers
Architectures des systèmes informatiques
CHAPITRE 4
Plus grand svp ! Organisation et gestion de la mémoire
Année 2002-2003