Fonctionnement du système d'exploitation BoOSt




I Secteur de boot :


C'est le BIOS qui est chargé de lancer un système d'exploitation sur le premier secteur – de taille 512 octets - d'un disque, le secteur de boot. Ce point de démarrage sera sur une disquette pour le système d'exploitation. On doit ainsi reconfigurer le BIOS pour qu'il démarre à partir de la disquette. Le BIOS va charger en mémoire, à l'adresse 0x7C00, le premier secteur de la disquette. Nous aurons un secteur de boot qui sera compatible avec un système de fichiers FAT 12. Dans ces 512 premiers octets, nous devrons nous arranger pour pouvoir charger le noyau à partir des interruptions du BIOS (INT 0x13 pour les accès à la disquette et INT 0x10 pour l'affichage). Le noyau sera un fichier qui sera sur la disquette formatée en FAT 12. Connaître l'emplacement exact de ce fichier sur la disquette sera nécessaire. Ce fichier se nommera kernel.sys et sera situé à la racine du système de fichiers. Les fichiers en racines sont décrits dans la FAT à partir du 19ème secteur de la disquette. On cherchera le nom du fichier et le premier secteur où ce fichier se trouve et ainsi que sa taille. Dès que le noyau sera situé sur la disquette , il sera chargé en mémoire à l'adresse 0x1000. Une fois chargé, ce secteur de boot fera un saut vers l'emplacement mémoire où se trouve le noyau. Et il doit se terminer par un mot contenant 0xAA55 pour qu'il soit officiellement reconnu par le BIOS. Ceci correspond à la signature d'un secteur de boot valable.


II Le Noyau :


Pour obtenir les capacités maximums des processeurs INTEL i386+, le passage en mode protégé sera nécessaire ainsi que de s'assurer que le processeur appartient bien a la famille des processeurs INTEL i386+ (programme fourni par la documentation INTEL). Le passage en mode protégé nécessite de réorganiser la structure de la mémoire en 32 bits, c'est la GDT – Global Descriptor Table. Une fois passé en mode protégé, tous les segments de la mémoire doivent etre réinitialisé. C'est à partir de ce moment que la programmation en C peut débuter.

En passant en mode protégé, les interruptions du BIOS ne sont plus accessibles car elles ont été écrites en 16 bits et le mode protégé fonctionne en 32bits uniquement. Ainsi les fonctions d'affichages, du clavier, d'accès à la mémoire et aux disques doivent etre réécrites entiérement. Pour les fonctions d'affichages, la structure de l'écran est située à l'adresse 0xB800. Un caractère est codé sur 2 octets : son code ASCII suivi de ses propriétés d'affichage (couleur de fond, couleur de caractères, clignotement et surbrilance). Pour pouvoir utiliser ces fonctions, la table des vecteurs d'interruption, IDT (Interruption Descriptor Table), doit etre redéfini. La possibilité d'organiser les segments en mémoire doit etre également possible. La taille de la mémoire vive sera utile pour déterminer ce qui sera utilisable par la suite. Enfin, le noyau chargera un shell qui a été intégré. Ce dernier ne fait qu'interpréter des fonctions internes pour pouvoir exécuter des fonctions internes.




GLOSSAIRE


BIOS (Basic Input Output System) :

Le BIOS est une petite mémoire située sur la carte-mère, dont les données définissent les paramètres du système.
Ensemble de primitives de bas niveau fournissant, dans une architecture PC, une interface entre le DOS et le matériel (gestion des entrées/sorties). Le BIOS est stocké dans une mémoire ROM ou EPROM) adressable et est activé dès la mise sous tension. Il constitue donc la couche logicielle la plus basse et isole les programmes et le DOS des détails d'accès au hardware. Il effectue les différents transferts de données avec les périphériques (d’où son nom). Le BIOS contient les différents programmes nécessaires :
        - aux tests des différents éléments de l’ordinateur au démarrage (programme POST)
        - au chargement du système d'exploitation. Il contient aussi les fonctions permettant aux différents devices drivers de piloter les périphériques
Par contre la gestion du processeur et de la mémoire centrale reste du ressort du système d'exploitation.

 

FAT (File Allocation Table) ou Table d'Allocation de Fichiers:


La Table d'Allocation de Fichiers est une liste de valeurs numériques permettant de décrire l'allocation des clusters d'une partition, c'est-à-dire l'état de chaque cluster de la partition dont elle fait partie. La table d'allocation est en fait un tableau dont chaque cellule correspond à un cluster. Chaque cellule contient un chiffre qui permet de savoir si le cluster qu'elle représente est utilisé par un fichier, et, le cas échéant, indique l'emplacement du prochain cluster que le fichier occupe. On obtient donc une chaîne FAT, c'est-à-dire une liste chaînée de références pointant vers les différents clusters successifs, jusqu'au cluster de fin de fichier. Chaque entrée de la FAT a une longueur de 16 ou 32 bits (selon qu'il s'agit d'une FAT16 ou d'une FAT32). Les deux premières entrées permettent de stocker des informations sur la table elle-même, tandis que les entrées suivantes permettent de référencer les clusters. Certaines entrées peuvent contenir des valeurs indiquant un état du cluster spécifique. Ainsi la valeur 0000 indique que le cluster n'est pas utilisé, FFF7 permet de marquer le cluster comme défectueux pour éviter de l'utiliser, et les valeurs comprises entre FFF8 et FFFF spécifient que le cluster contient la fin d'un fichier. Chaque partition contient en réalité deux copies de la table, stockées de manière contiguë sur le disque, afin de pouvoir la récupérer si jamais la première copie est corrompue.

 

GDT (Global Descriptor Table):


Les segments sont decrits dans des structures de 64 bits appelées descripteurs de segments et stockés dans un tableau : GDT.

 

IDT (Interruption Descriptor Table):


Les interruptions sont decrites dans des structures de 64 bits appelées descripteurs d'interruptions ou vecteurs d'interruptions et stockés dans un tableau : IDT.

 

Interruption :


Signal prioritaire permettant d'interrompre un processus en cours d'exécution au profit d'un autre processus. Sous DOS une interruption est envoyée par le BIOS ou par le hardware. Elle est caractérisée par un Identificateur (handle). Lorsqu'une interruption est déclenchée, une routine spécifique ("fonction d'interruption" ou "fonction handle") est exécutée. Lorsque celle-ci se termine, le déroulement normal du programme recommence à l'endroit où il a été interrompu. Avant que la routine s'exécute il faut sauvegarder le contexte d'exécution du programme interrompu. En effet la fonction handler va s'exécuter dans les registres du processeur et modifier la valeur de ceux-ci. A la fin de l'exécution de la fonction handler, le programme interrompu doit retrouver les registres dans l'état où il été interrompu si l'on souhaite que le programme puisse s'exécuter normalement ("restitution du contexte"). La plupart des interruptions peuvent être :
    - masquées dans ce cas elle n'est pas prise en compte lorsque ses conditions de déclenchement sont réalisées la fonction handler associée n'est pas exécutée.
    - détournées : lorsqu'elle est déclenchée, c'est une autre fonction handler qui est exécutée
On distingue :
    - Les interruptions matérielles qui sont émises par divers périphériques
    - Les interruptions logicielles qui sont émises par des fonctions spéciales au sein de programmes.
Sous DOS la table de correspondance entre l’Identificateur de l'interruption et sa fonction handler associée est appelée table des vecteurs d'interruptions. La gestion des interruptions est l'une des tâches principales des systèmes in d'exploitation qui implémentent ce mécanisme. Ils peuvent ainsi distribuer la puissance de calcul du processeur aux divers programmes demandeurs en fonction des priorités respectives de ces interruptions. Il y a des interruptions prioritaires (exemple provenant d'une erreur matérielle) et des interruptions moins prioritaire (exemple : provenant d'une entrée/sortie "lente" comme le port série).

 

Mode Protégé:


Mode de gestion de la mémoire dans lequel les adresses utilisées dans les programmes ne correspondent plus aux adresses physiques. Grâce à cela chaque processus peut disposer "virtuellement" d'un espace mémoire qui lui est propre. Pour cela le processeur doit mettre en œuvre différents mécanismes de protection destinés à empêcher qu'un processus n’empiète sur l'espace mémoire alloué à un autre processus ou sur l'espace mémoire du système. C'est le mode de fonctionnement privilégié des systèmes d'exploitation multitâche. Windows utilise ce mode et les autres systèmes d'exploitation (tel UNIX) aussi. Avec ce mode de gestion chaque processus se voit attribuer un espace mémoire virtuel duquel il ne peut pas sortir. Il n'est plus possible alors d'accéder directement aux différentes tables du système (ce qui est un bien) ni de communiquer une donnée à, un autre programme. Pour ce faire il doit mettre en œuvre des mécanismes plus ou moins complexes (IPC, tubes, sockets).

Il permet d’exploiter les hautes performances du processeur. Ce mode permet l’adressage de 4 Go de mémoire et fournit un support pour l’implémentation de systèmes multitâches et multi-utilisateurs.

 

Mode Réel:


Mode de gestion de la mémoire où toutes les adresses utilisées par le programme correspondent directement à des adresses physiques, c'est à dire réelles, d'où le nom. Il n’y a pas alors de protection imposée par le processeur sur les tentatives d'accès à la mémoire réalisées par les programmes. Ce qui se traduit par de nombreux accès illicites et des conflits entre programmes, synonymes de plantage. C'est le mode de fonctionnement par défaut du DOS. Il est directement issu de la première génération des processeurs Intel 16 bits. Il est relativement facile à mettre en œuvre. Il permet aux programmeurs d'accéder à l'ensemble de la mémoire adressable : en particulier il peut accéder à des zones mémoire appartenant au système table systèmes et buffers

 

Segmentation:


Technique de gestion de là mémoire virtuelle par découpage logique des programmes. La pagination découpe un programme sans tenir compte de son organisation logique. De ce fait, il peut y avoir des pages pratiquement vides. La segmentation consiste au niveau du programmeur à découper un programme en modules homogènes, calqués sur cette organisation logique, de tailles diverses. Le système chargera le programme module par module au fur et à mesure des besoins. Dans ce cas les modules chargés utilisent mieux la mémoire.