Descripteurs de grands systèmes de Burroughs - Burroughs large systems descriptors

Les descripteurs sont une caractéristique architecturale des grands systèmes de Burroughs , y compris les systèmes Unisys Clearpath/MCP actuels (à partir de 2006) . En plus d'être basés sur des piles et des balises , une caractéristique architecturale notable de ces systèmes est qu'ils sont basés sur des descripteurs. Les descripteurs sont le moyen d'avoir des données qui ne résident pas sur la pile comme pour les tableaux et les objets . Les descripteurs sont également utilisés pour les données de chaîne comme dans les compilateurs et les applications commerciales .

Des détails

Les descripteurs décrivent les zones de stockage, les demandes d'E/S et les résultats d'E/S. Ils contiennent des champs indiquant par exemple le type de descripteur, l'adresse, la longueur, si les données sont présentes en mémoire. Les détails diffèrent selon la gamme de produits et le type de descripteur. Le texte suivant numérote le bit le plus à gauche (le plus significatif) à 0, conformément à la documentation de Burroughs.

B5000, B5500 et B5700

Le B5000 a été le premier ordinateur basé sur des descripteurs. Chaque descripteur a un indicateur (bit 0) de 1. Les descripteurs de données contiennent une adresse de stockage de 15 bits et une taille de 10 bits, comme la plupart des descripteurs d'E/S. Les descripteurs de programme et les descripteurs de résultat externe ont une adresse de 15 bits mais pas de champ de taille.

Descripteurs de programme B5x00

Les descripteurs de programme sont utilisés pour définir des segments de programme. Un appel d'opérande ou un appel de descripteur qui se réfère à un descripteur de programme provoquera un appel de sous-programme si le bit de présence est 1, sinon il provoquera une interruption de présence.

Descripteurs de programme B5x00
0 1 2 3 4 5 6 7 8-17 18-32 33-47
Drapeau je Présence je Mode UNE Adresse
1 1 0=pas en mémoire
1=en mémoire
1 0=mot
1=caractère
0=argument non requis
1=argument requis

Descripteurs de données

Les descripteurs de données se réfèrent soit à un bloc de données présent en mémoire (P=1) soit à un bloc de données qui doit être lu en mémoire (P=0), selon la valeur du bit Présence. Un appel d'opérande ou un appel de descripteur qui se réfère à un descripteur de données vérifiera le bit de présence et le champ de taille ; si le bit de présence est à 0 alors une interruption de présence se produira ; si le champ de taille est différent de zéro, le deuxième mot de la pile doit être dans la plage ou une interruption d'index se produira.

Descripteurs de données B5x00
0 1 2 3-7 8-17 18 19 20 21-32 33-47
Drapeau je Présence Taille je C Adresse
1 0 0=pas en mémoire
1=en mémoire
Réservé
au MCP
Réservé
au MCP
0=Flottant
1=Entier
Réservé
au MCP

Descripteurs d'E/S

Descripteurs d'E/S B5x00
0 1 2 3-7 8-17 18-32 33-47
Drapeau je
Externe alternatif
Unité Taille
Dépendant de l' appareil
Adresse
1 1 0=écrire
1=lire

Descripteurs de résultats externes

Un descripteur de résultat externe contient le descripteur d'E/S utilisé pour lancer l'opération avec certains champs remplacés.

B5x00 Descripteurs de résultats externes
0 1 2 3-7 8-25 26-32 33-47
Drapeau je
Externe alternatif
Unité Hors du sujet
Dépendant de l' appareil
Adresse
1 1 0=écrire
1=lire

conditions d' erreur
dernier
emplacement

B6500, B7500 et successeurs

Les descripteurs décrivent des blocs de données. Chaque descripteur contient un champ d'adresse de 20 bits référençant le bloc de données. Chaque bloc a une longueur qui est stockée dans le descripteur, également 20 bits. La taille des données est également indiquée, étant des données de 4, 6, 8 ou 48 bits dans un champ de trois bits.

Le premier ordinateur avec cette architecture était le B6500. dans cette implémentation, la signification des différents bits d'état était :

  • Bit 47 – Le bit de présence (P-Bit)
  • Bit 46 – Le bit de copie
  • Bit 45 – Le bit indexé
  • Bit 44 – Le bit segmenté
  • Bit 43 – Le bit en lecture seule

Dans les implémentations ultérieures, ces bits d'état ont évolué pour suivre les tailles de mémoire croissantes et obtenir des informations.

Le bit 47 est probablement le bit le plus intéressant du système - c'est la façon dont l'architecture implémente la mémoire virtuelle . La mémoire virtuelle a été initialement développée pour le projet Atlas à l' Université de Manchester à la fin des années 1950. Désireux de voir cela utilisé dans des applications commerciales, ils ont invité des ingénieurs de plusieurs sociétés informatiques à un séminaire, y compris ceux de Burroughs et IBM . Les ingénieurs de Burroughs ont vu l'importance de la mémoire virtuelle et l'ont intégrée au B5000. Les ingénieurs d'IBM n'étaient pas intéressés et IBM n'a pas "inventé" la mémoire virtuelle avant dix ans.

Lorsqu'un descripteur est référencé, le matériel vérifie le bit 47. S'il est à 1, la donnée est présente en mémoire à l'emplacement indiqué dans le champ d'adresse. Si le bit 47 est 0, le bloc de données ne sont pas présentes et une interruption (p-bit d' interruption ) est élevée et MCP code saisi pour rendre le présent bloc. Dans ce cas, si le champ adresse est 0, le bloc de données n'a pas été alloué (init p-bit) et le MCP recherche un bloc libre dont la taille est donnée dans le champ longueur.

Le dernier scénario de bits p est lorsque le bit 47 est à 0, indiquant que les données ne sont pas en mémoire, mais l'adresse est différente de zéro, indiquant que les données ont été allouées et dans ce cas, l'adresse représente une adresse de disque dans le virtuel zone mémoire sur le disque. Dans ce cas, une interruption de p-bit est déclenchée et elle est notée comme un "autre" p-bit.

Utilisation dans les compilateurs

Dans ALGOL , les limites d'un tableau sont complètement dynamiques, peuvent être extraites des valeurs calculées au moment de l'exécution, contrairement à Pascal où la taille des tableaux est fixée au moment de la compilation. C'est la principale faiblesse de Pascal telle que définie dans sa norme, mais qui a été supprimée dans de nombreuses implémentations commerciales de Pascal, notamment les implémentations Burroughs (à la fois la version University of Tasmania d'Arthur Sale et Roy Freak, et l'implémentation sur Burroughs Slice par Matt Miller et al.)

Dans un programme de l'environnement Burroughs, un tableau n'est pas alloué lorsqu'il est déclaré, mais uniquement lorsqu'il est touché pour la première fois - ainsi, les tableaux peuvent être déclarés et la surcharge de leur allocation évitée s'ils ne sont pas utilisés.

De plus, les appels système d'allocation de mémoire de bas niveau tels que la classe d'appels malloc de C et Unix ne sont pas nécessaires - les tableaux sont automatiquement alloués au fur et à mesure de leur utilisation. Cela évite au programmeur la lourde tâche de remplir les programmes avec l'activité sujette aux erreurs de la gestion de la mémoire, ce qui est crucial dans les applications mainframe .

Lors du portage de programmes dans des langages de niveau inférieur tels que C, la structure de la mémoire C est gérée en effectuant sa propre allocation de mémoire dans un grand bloc B5000 alloué - ainsi, la sécurité du reste du système B5000 ne peut pas être compromise par des programmes C erronés. En fait, de nombreux dépassements de mémoire tampon dans des programmes C apparemment par ailleurs correctement exécutés ont été détectés lors du portage sur l'architecture B5000. C, comme Pascal, a également été implémenté à l'aide du système de compilation Slice (qui, comme LLVM , utilise un générateur de code et un optimiseur communs pour tous les langages). Le compilateur C, le système d'exécution, les interfaces POSIX , ainsi qu'un portage de nombreux outils Unix ont été réalisés par Steve Bartels. Un compilateur Eiffel a également été développé en utilisant Slice.

Pour les programmes orientés objet qui nécessitent une création d'objets plus dynamique que l'architecture B5000, les objets sont mieux alloués dans un seul bloc B5000. Une telle allocation d'objets est de niveau supérieur à celui du malloc de C et est mieux implémentée avec un ramasse-miettes moderne et efficace .

Intégration dans l'architecture mémoire

Le champ d'adresse dans le B5000 n'est que de 15 bits, ce qui signifie que seuls 32K mots (192Ko) de mémoire peuvent être adressés par des descripteurs. Le B6500 a étendu cela à 20 bits ou mots de 1 Mo (6 Mo). Au milieu des années soixante-dix, c'était encore une restriction importante de l'architecture. Pour y remédier, deux solutions ont été mises en place :

  1. Swapper - cette solution implémente en fait une autre couche au-dessus de la gestion de la mémoire, déplaçant de grands clusters de données connexes dans et hors de la mémoire à la fois.
  2. ASN – cette solution permet de configurer physiquement plus de mémoire dans un système, divisée en morceaux adressables séparément. Cette architecture est connue sous le nom de mémoire ASN (Address Space Number). La mémoire est logiquement divisée en deux zones, allouant des adresses mémoire faibles à un espace d'adressage global pour le système d'exploitation et des adresses de logiciel de support et de mémoire élevée à plusieurs espaces d'adressage locaux parallèles pour des programmes individuels. Les espaces d'adressage sont numérotés, zéro indiquant Global, 1..n indiquant les espaces d'adressage locaux. Les programmes partageant des données sont automatiquement placés dans le même espace d'adressage.

Aucune modification du code du programme n'a été nécessaire pour que ces fonctionnalités soient utilisées. Les deux solutions peuvent même être combinées, mais finalement les exigences de mémoire MCP et les exigences de partage de données de programme ont dépassé la taille maximale des espaces d'adressage eux-mêmes.

Avec l'avènement de la série A au début des années 1980, la signification de ce champ a été modifiée pour contenir l'adresse d'un descripteur principal, ce qui signifie que des blocs de données de 1 mégaoctet peuvent être alloués, mais que la mémoire de la machine pourrait être considérablement étendue à des gigaoctets. ou peut-être des téraoctets. Cette architecture a été nommée mémoire ASD (Advanced Segment Descriptors). Cela nécessitait une nouvelle spécification de microcode commune, appelée Beta. Le principal visionnaire derrière la mémoire ASD est John McClintock. Plus tard, l'étiquette de mémoire à 3 bits a été augmentée à une spécification de 4 bits, permettant au descripteur de segment de passer de 20 à 23 bits, permettant à encore plus de mémoire d'être adressée simultanément. Cette spécification de microcode est devenue connue sous le nom de niveau Gamma.

Gestion de la mémoire

Un autre avantage significatif a été réalisé pour la mémoire virtuelle. Dans la conception B5000, si un bloc de données était déployé, tous les descripteurs référençant ce bloc devaient être trouvés afin de mettre à jour le bit de présence et l'adresse. Avec le descripteur maître, seul le bit de présence dans le descripteur maître doit être modifié. De plus, le MCP peut déplacer des blocs en mémoire pour le compactage et n'a besoin que de changer l'adresse dans le descripteur principal.

Une différence entre le B5000 et la plupart des autres systèmes est que les autres systèmes utilisaient principalement de la mémoire virtuelle paginée, c'est-à-dire que les pages sont échangées en morceaux de taille fixe quelle que soit la structure des informations qu'elles contiennent. La mémoire virtuelle B5000 fonctionne avec des segments de taille variable comme décrit par les descripteurs.

Lorsque la mémoire est remplie jusqu'à une certaine capacité, un processus du système d'exploitation appelé "Working Set Sheriff" est invoqué pour compacter la mémoire ou commencer à déplacer des segments hors de la mémoire. Il choisit d'abord les segments de code, car ceux-ci ne peuvent pas changer et peuvent être rechargés à partir de l'original dans le fichier de code, ils n'ont donc pas besoin d'être écrits, puis les segments de données qui sont écrits dans le fichier de mémoire virtuelle.

Les interruptions de bits P sont également utiles pour mesurer les performances du système. Pour les premières allocations, les « bits d'initialisation » indiquent un problème potentiel de performances dans un programme, par exemple si une procédure d'allocation d'un tableau est appelée en permanence. Le rechargement de blocs à partir de la mémoire virtuelle sur le disque peut dégrader considérablement les performances du système et n'est la faute d'aucune tâche spécifique. C'est pourquoi de nombreux ordinateurs d'aujourd'hui peuvent augmenter les performances du système en ajoutant de la mémoire. Sur les machines B5000, les « autres bits p » indiquent un problème système, qui peut être résolu soit en équilibrant mieux la charge de calcul tout au long de la journée, soit en ajoutant plus de mémoire.

Ainsi, l'architecture des grands systèmes de Burroughs permet d'optimiser à la fois les tâches individuelles et le système dans son ensemble.

Protection contre le débordement de la mémoire tampon

Le dernier point et peut-être le plus important à noter à propos des descripteurs est la manière dont ils affectent les notions complémentaires de sécurité du système et d'exactitude du programme. L'un des meilleurs outils dont dispose un pirate informatique pour compromettre les systèmes d'exploitation d'aujourd'hui est le débordement de tampon. C, en particulier, utilise la manière la plus primitive et la plus sujette aux erreurs pour marquer la fin des chaînes, en utilisant un octet nul comme sentinelle de fin de chaîne dans le flux de données lui-même.

Les pointeurs sont implémentés sur le B5000 par des descripteurs indexés. Lors des opérations d'indexation, les pointeurs sont vérifiés à chaque incrément pour s'assurer que ni les blocs source ni les blocs de destination ne sont hors limites. Lors d'une opération de scrutation ou de remplacement, les mécanismes utilisés pour lire ou copier de gros blocs de mémoire, à la fois source et destination, sont vérifiés à chaque incrément de mot pour une étiquette mémoire valide. Chaque segment de mémoire est délimité par des balises 3 mots, ce qui ferait échouer une telle opération. Chaque segment de mémoire contenant des données sensibles à l'intégrité, telles que le code de programme, est stocké dans un tag de 3 mots, ce qui rend impossible une lecture incontrôlée – et encore moins une modification. Ainsi, une source importante d'erreurs de programme peut être détectée tôt avant la mise en production du logiciel, et une classe plus importante d'attaques contre la sécurité du système n'est pas possible.

Remarques

Les références