ADRESSAGE | ADDRESSING |
La principale caractéristique de l'architecture
GCOS7 est d'avoir un adressage segmenté, comme l'était celui de MULTICS
et comme le sera, du moins à ses débuts, celui de Intel x86. Les motivations de cette segmentation étaient les suivantes:
Dans une seconde phase , lorsque les tailles de mémoire devinrent plus conséquentes, un dispositif de pagination complémentaire utilisé pour la gestion de la mémoire virtuelle (mémoire principale et mémoire secondaire) fut introduit en 1985-1987. Ce mécanisme ne se substitua pas à celui de segmentation.
|
schéma de l'adressage Level-64 sans pagination (extr. Interior Decor pocket
Guide) @1976 Honeywell Bull
Addresse segmentées Le format le plus courant d'adresse générée par les compilateurs dans les instructions en code binaire comprend 3 parties: un numéro de registre de base, un index, et un déplacement. Si index et déplacement ont une signification identique à celle du S/360, le registre de base n'est pas similaire à un second niveau d'index mais représente une partie de l'espace d'adresse utilisable au cours de l'exécution du programme (thread ou processus). L'ensemble de l'espace d'adresse accessible à une thread est défini par une table de segments, ou plus exactement un groupe de table de segments. C'est l'addition de l'adresse interne au segment (addition de l'index et du déplacement) et de l'adresse origine du segment (spécifié par le registre de base) qui constitue l'adresse en mémoire. En fait, tous les segments constituant l'espace d'adresse ne sont pas nécessairement en mémoire principale accédée par le processeur. Lorsqu'un segment est résident, c'est effectivement l'adresse absolue du segment qui se trouve dans la table des segments. Lorsqu'un segment est "déchargé" de la mémoire principale, cette adresse est remplacée par un nom en mémoire virtuelle qui servira à le recharger lorsqu'une référence à ce segment non résident sera faite. Cette gestion des segments entre la mémoire virtuelle et la mémoire principale est faite par le module logiciel Virtual Memory Management. La raison du découpage de la table des segments en deux niveaux provient des considérations de partage des espaces d'adresse entre les processus (appelés dans la documentation GCOS process groups) et les threads (appelés process à la suite de Multics) Un espace d'adresse comprend 4 zones (et non deux comme dans la plupart des systèmes):
Taille des Segments La distribution des éléments d'adresse dasn un mot de 32 bits conduisait à définir une longueur des segments sur 16 bits, c'est à dire une taille de 64Koctets (que Intel reprendra sur ses microprocesseurs). Cette taille était compatible avec les contraintes de performances d'échanges entre mémoire principale et disques (la taille de 4Ko étant plutôt trop faible). Il était cependant évident que beaucoup d'objets (tableaux de nombres scientifiques par exemple) ne pouvaient se satisfaire de cette taille de segment. Aussi, deux tailles de segments ont été introduites: les segments courants (small segments) de 64Ko et les grands segments de 4Mo. Le mécanisme de tables de segments à 2 étages permettait de définir pour chaque type de segments, les grands et le spetits segments. Bornes des segments. Comme la segmentation était la base du système de protection, les segments sont définis non seulement par leur adresse début en mémoire mais aussi par leur longueur. L'adresse relative (index + déplacement) est comparée à le longueur déclarée et allouée par le gestionnaire de mémoire et le déroulement d ela thread est interrompu en cas de dépassement. |
Anneaux de protection (rings) Le système de protection traditionnel de modes superviseur/mode utilisateur est étendu à 4 anneaux de protection. Ce système directement inspiré de Multics a pour objectif de pouvoir exécuter les fonctions système synchrones sans être obligé de recourir à un gestionnaire de queues de services et à l'overhead y afférent. Ces quatre rings sont répartis de la manière suivante:
Les anneaux de protection sont affectés aux points d'entrée de procédures au moment de leur mise en bibliothèque par l'éditeur de liens (linker). Le passage de la thread d'un ring à un autre est contrôlé par le matériel et le micro-kernel au moment des appels et retours de procédures.
|
Protection rings |
Pagination La mise en mémoire secondaire (backing store) des segments peu utilisés représentait une solution efficace et prévisible dans un contexte de mémoire cnetrale réduite et dans un contexte de peu de programmes simultanés. La gestion de mémoire virtuelle par segmentation s'adaptait aussi aux systèmes transactionnels où les performances doivent être planifiées avant le déploiement des applications. Par contre, pour des programmes scientifiques
traitant de grands ensembles de données, pour des environnements de time-sharing aux
besoins imprévisibles et pour des grandes tailles de mémoire qui commençaient à
apparaître au milieu des années 1980, la recherche des trous pour loger des segments de
taille variable devanit prohibitive. La décision de réaliser un mécanisme matériel de détection des fautes de pages fut prise dans le système Leo pour émuler Siris8. Cependant, il fallut attendre le système Aquila importé du Japon pour décider l'addition de la pagination dans le gestionaire de mémoire virtuelle natif. Le même mécanisme fut peu après adopté sur le système Ares (phase 2). |