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.