Honeywell-Bull    CII-Honeywell-Bull     Bull

Ligne GCOS7

1967-200x

ARCHITECTURE (4)

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:

  • protection de mémoire dans un environnement multi-tâches
  • moindre encombrement des adresses
  • partage du code des procédures en environnement multi-tâches
  • "swapping" en mémoire secondaire par entités logiques

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.

 

adressage_p7.jpg (50083 bytes)
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):

  • un espace commun -type 0- à toute la machine qui comprend des éléments systèmes (procédures et tables),
  • un espace commun -type 2- à toutes les threads du process,
  • un espace -type 3- privé à la thread
  • et un espace dynamique -type 1- utilisé pour le chargement dynamique de modules (DLL dans le jargon actuel).

 

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:

  • ring 0: exécution d'opérations privilégiées permises, le ring 0 est -par convention de GCOS- réservé aux procédures pouvant compromettre l'intégrité du système (manipulation d'adresses physiques, établissement de liens système, entrées-sorties).
  • ring1: exécution d'opérations privilégiées interdites, il est utilisé par la plus grande partie du système d'exploitation (gestion des fichiers et des bases de données).
  • ring 2: réservé à l'usage de sous-systèmes devant se protéger contre l'exécution de programmes utilisateurs. Cet anneau a été dans la pratique peu utilisé.
  • ring 3: destiné à l'exécution de programmes de l'utilsiateur produits par les chaines de production de programme (ex; COBOL, FORTRAN...)

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.
A l'origine du programme P7, la pagination superposée à la segmentation, comme le faisait Multics, avait été étudiée, mais considérée non urgente et trop coûteuse avec la technologie MSI/TTL. Cette étude fut cependant la base du système d'adressage du haut de gamme NEC ACOS4.

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).