Noyau x86 32 bits écrit seul de zéro, du démarrage GRUB au multitâche préemptif.
Le problème
Écrire un système d'exploitation sans rien en dessous : pas de bibliothèque standard, pas de printf, pas de gestion mémoire. Tout ce qu'un programme utilisateur considère comme acquis doit être construit, dans le bon ordre, directement au contact du processeur.
Chaque couche repose sur celle du dessous : on les a construites de bas en haut.
Ce que j'ai fait
Les quatre premières étapes du cursus KFS, entièrement seul :
Démarrage : noyau chargé par GRUB (Multiboot), point d'entrée en assembleur, script de lien (linker script) qui place chaque section en mémoire.
GDT : table des descripteurs globaux, qui définit la segmentation et les niveaux de privilège.
Mémoire : pagination et allocation mémoire du noyau.
Interruptions : IDT, gestion des exceptions processeur et des interruptions matérielles, pilote clavier.
Appels système : interface entre l'espace utilisateur et le noyau.
Multitâche préemptif : ordonnancement des processus, déclenché par l'interruption d'horloge.
Défis techniques
Déboguer sans filet : une erreur dans la GDT ou l'IDT provoque un triple fault et un redémarrage immédiat, sans message. Il faut raisonner à partir de l'état des registres.
L'ordre de construction : la pagination suppose un allocateur, l'ordonnanceur suppose les interruptions. Chaque brique repose sur la précédente.
La frontière ASM / C : changements de contexte, sauvegarde des registres et retour d'interruption se font en assembleur, au plus près de la convention d'appel.
Compétences démontrées
Architecture x86 en mode protégé, programmation C et assembleur sans bibliothèque, gestion mémoire virtuelle, interruptions et pilotes, ordonnancement, autonomie sur un projet long et exigeant.