Je traduirai cette page plus tard en anglais.
Nous sommes le Dimanche 21 septembre 2025 12H et j’ai décidé d’écrire sur Gaspardos car mon driver pour mon OS Realtek RTL8139 n’arrive pas à envoyer mes paquets !!!! Et ça m’agace !
Gaspardos est un système x86 32 bits que je développe depuis longtemps , c’est un rêve.
Comment j’ai appris sur les pc, x86 etc ?
L’observation et la doc technique (souvent illisible).
Il faut as hésiter à regarder le code de BTX LOADER écrit par un certain Robert NORDIER, en vrai ce programme m’a beaucoup motivé. Mais j’ai pas lu que ça !
Il faut lire lire et Lire ! Ne pas hésiter a se tromper, a tout faire crash. On utilise des VM donc on s’en fiche !
Le système démarre directement en mode protégé (32 bits) depuis le bootloader GRUB2. GRUB2 est un bootloader qui est vieux mais qui marche encore très bien.
Il est moins sectaire que LIMINE et consort.
Quand mon système démarre j’exécute une (longue) routine :
D’abord PILE temporaire (obligatoire : les conventions d’appels de X86-32 utilisent beaucoup la pile)
La segmentation (un système de protection mémoire très archaïque : pas le choix les interruptions en dépendent, aussi TSS demande un segment pour faire une restauration de contexte de la pile KERNEL quand il est activé : c’est le multitâche pour faire très très simple)
Interruptions avec reprogrammation du vieux PIC (je configure les exceptions pagefault HYPER IMPORTANT) activation avec STI etc
Le plus dur : la pagination la c’est dur vraiment : en gros dans le fichier ELF de gaspardos j’ai demandé au linker d’écrire à un endroit l’adresse de départ de la section .text et la fin aussi.
Je mappe cette adresse en identity map : adresse physique = adresse virtuelle ( Page directory, page table, Offset)
Après je mappe les tables de pagination (lol les tables prennent de la place incroyable) et enfin le bitmap (mon algorithme de gestion de la mémoire physique)
J’active et je change IMMEDIATEMENT ma pile avec une adresse obtenue avec void * malloc(size_t size)
Parfait :
On initialise PCI,la souris, les disques IDE etc etc
Multitâche :
L’IDE est initialisée parfait ! je demande à GFS de lire le superblock. On est bon ? ca y est ? Ok, j’essaie de charger test1.bin (c’est un fichier compilé avec NASM .org 0x0, c’est super important)
Donc je configure des structures en torpillant la sortie de PUSHAD.
X86 est archaïque : je ne peux pas changer EIP comme je veux et surtout QUAND je veux.
Mov EIP,0xCAFEBABE ; ça marche pas, NASM va rien comprendre
Je vais essayer d’être clair :
En fait mon scheduler (le programme qui fait changer des taches) s’active lorsque une IRQ du timer ET QUE prochaine_tache ne contient pas un pointeur NUL.
A ce moment la, la structure hote de la torpille va torpiller la sortie de PUSHAD sur la pile. Avec POPAD.
On va restaurer avec IRETQ et LA incroyable test1.bin à la main sur la machine.
Heureusement, il ne peut pas faire grande chose puisque sa zone mémoire est marqué utilisateur (1 bit dans la page table)
Il me parle avec
Mov eax,4 // numéro appel
Int 0X80 // appel système
En fait, il génère une interruption pour me demander des choses (écrire dans le frame buffer , ouvrir une fenetre , ouvrir un fichier dans GFS etc)
Écrivez moi pour plus d’infos sur gaspardos !
Exercice :
Essayer de trouver de combien d’octets (je vous aide : Ko ) est la pile que j’alloue après l’activation de la pagination.
Aide :
Vous récupérez l’image disque .iso. Vous la monter : avec linux c’est facile : tout le bordel derrière /dev/loop0 est fait par les grosses distros maintenant.
Sous Mac, c’est plus chaud j’ai plusieurs MAC certains me disent que l’iso est corrompue.
Après , vous récupérer dans l’image le fichier : KERNEL.ELF
Vous pouvez lire l’assembleur avec objdump.
Bon courage !
Sous mac, il faut xcode avec brew install llvm ça devrait faire l’affaire
Sous linux : vous pouvez installer binutils (objdump appartient à binutils)
Sous windows : vous pouvez utiliser llvm-objdump, llvm se télécharge depuis github . Vérifiez bien le SHA256 !!! Après, modifiez le PATH pour que le dossier contenant LLVM soit pris en compte.
Gaspard