TP8 : Procédure de boot
1. Objectifs
Le but de ce TP est d'analyser en détail le démarrage du système d'exploitation ALMOS-MKH sur l'architecture TSAR.
Cette procédure de démarrage aboutit au lancement du processus init sur le coeur [0] du cluster [0] de l'architecture. Le processus init est le premier processus utilisateur, et c'est le père de tous les processus utilisateurs qui seront lancés ultérieurement. La principale tâche du processus init est de créer, au moyen des appels système fork et exec, un ou plusieurs processus ksh. Le processus ksh est un shell permettant à un utilisateur humain d'interagir avec la machine à travers un terminal TTY, et de lancer de nouvelles applications. Le nombre N de processus ksh créés par le processus init est égal au nombre de terminaux utilisateurs disponibles sur la machine. Si on veut N processus ksh, il doit donc exister (N+1) terminaux TTY, puisque le TTY0 est utilisée par le noyau pour afficher des messages (pas de saisie de caractères sur cette console).
Au moment ou le processus init démarre, il faut qu'il existe une instance du noyau dans chaque cluster pour répondre aux requêtes effectuées par les ou les processus ksh. Il faut que tous les périphériques aient été initialisés, et il faut que le système de fichiers soit lui aussi initialisé, pour pouvoir accéder aux fichiers contenant le code des applications .
Vous devez donc lire la documentation ci-dessous pour répondre aux questions posées.
La documentation sur la procédure de démarrage est ici.
Le code source du boot_loader
est dans le fichier almos-mkh/boot/tsar_mips32/boot.c.
Le code source de kernel_init
est dans le fichier almos-mkh/kernel/kern/kernel_init.c.
Pour mieux suivre le déroulement du bootloader, vous pouvez activer l'affichage de messages sur la console système. Pour cela, vous pouvez modifier le fichier almos-mkh/boot/tsar_mips32/boot_config.h, et donner une valeur non-nulle à une ou plusieurs variables : DEBUG_BOOT_MULTI, DEBUG_BOOT_INFO, DEBUG_BOOT_ELF, etc.
Pour mieux suivre le déroulement de la fonction kernel_init, vous pouvez activer l'affichage de messages sur la console système. Pour cela il faut modifier le fichier almos-mkh/kernel/kernel_config.h, et donner une valeur non-nulle à la variable DEBUG_KERNEL_INIT.
2. Questions sur le preloader
- À quoi sert un preloader ?
- Où se trouve stocké le code du preloader au démarrage de la plateforme TSAR? 1. Comment les coeurs accèdent_ils au code du preloader ?
- Comment fait-on pour qu'un code ne soit exécuté que par un seul core ?
- A quel moment les cores sortent-ils du preloader ?
3. Questions sur le bootloader
- À quoi sert le bootloader ? Quels périphériques doit il pouvoir accéder ? Quels formats de fichier doit-il pouvoir analyser ?
- Dans quel(s) fichier(s) est rangée la description de la plateforme matérielle ? La réponse se trouve ici.
- Pourquoi le code du bootloader est-il recopié dans tous les clusters ?
- Pourquoi chaque core, a-t-il besoin d'une pile ? où sont-elles placées ?
- Qu'est-ce qu'une IPI ? Comment sont-elles utilisées par le bootloader ?
4. Questions sur kernel_init
- Comment dans chaque cluster, le noyau a-t-il accès à la description de la plate-forme matérielle ?
- Comment almos_mkh identifie-t-il les coeurs de la plate-forme matérielle ? La réponse se trouve ici.
- Le kernel exécute sur chaque coeur la fonction kernel_init() qui initilalise le thread IDLE qui est le thread choisi par le scheduler d'un coeur quand tous les autres threads placés sur ce coeur sont bloqués. Où sont rangés les descripteurs de threads IDLE ? Combien y a-t-il de threads idle ?
- Pour quelle raison la fonction kernel_init() utilise-t-elle des barrières de synchronisation ? Illustrez votre réponse avec un exemple.
- Pour quelle raison, utilise-t-on à la fois des barrières locales et des barrières globales ?
- Dans le cas d'une barrière globale, expliquez précisément la valeur du premier argument passé à la fonction xbarrier_wait(). L'API permettant l'accès à une barrière globale est définie dans les fichiers almos-mkh/kernel/libk/xbarrier.h et almos-mkh/kernel/libk/xbarrier.c.
- Quel est le rôle de la fonction cluster_init() définie dans le fichier almos-mkh/kernel/kern/cluster.c ?