< Un système multi-tâches : des appels systèmes préemptibles | TutoOS | Gérer la mémoire physique et la mémoire virtuelle >
Le package contenant les sources est téléchargeable ici : kernel_GrubEnable.tgz
Pour naviguer dans l'arborescence : GrubEnable
Le document GNU/Multiboot spec. définit un standard qui uniformise la séquence de boot des différents systèmes d'exploitation. Grub est un boot loader qui permet de démarrer un grand nombre de systèmes différents pour peu qu'ils répondent à ce standard. Pour répondre à ce standard, un noyau doit :
Note : l'utilisation de Grub2 est détaillée en annexe
Pour illustrer le boot avec Grub, le package suivant contient un noyau minimaliste répondant au standard multiboot : kernel_SimpleGrub.tgz
Pour naviguer dans l'arborescence : SimpleGrub
Grub permet de fournir au noyau plusieurs informations dont la taille de la mémoire physique disponible
Cette information est transmise au noyau via la structure de données struct mb_partial_info
:
La compilation et le linkage pour obtenir le nouveau noyau changent car il faut que l'en-tête du multiboot se trouve au début de la zone texte. Plusieurs méthodes sont possibles :
boot.o
en premier afin qu'il soit relogé au début du noyau :
ld -Ttext=100000 --entry=_start boot.o kernel.o screen.o printk.o -o kernel
La commande shell mbchk
permet de vérifier la compatibilité du noyau généré avec le standard multiboot :
$ mbchk kernel kernel: The Multiboot header is found at the offset 4104. kernel: Page alignment is turned on. kernel: Memory information is turned on. kernel: Address fields is turned off. kernel: All checks passed.
On peut aussi vérifier où sont relogés les différents objets avec la commande shell nm
:
$ nm -n kernel 00100000 T _start 00100008 t multiboot_header 00100014 T start 0010001c T kmain 0010005c T scrollup 001000ec T putcar 00100218 T strlen 00100243 T itoa 00100309 T printk 001016e0 D kY 001016e1 D kattr 001016e4 A __bss_start 001016e4 A _edata 001016e4 B kX 001016e8 A _end
La création d'une telle image nécessite la permission de root
.
Attention !
Le script ci-dessous est potentiellement dangereux et chaque commande exécutée en tant que root
sur un système UNIX doit être bien comprise. Si une commande du script ci-dessous ne vous semble pas claire, je vous conseille de prendre le temps qu'il faut pour étudier la documentation accessible via la commande shell man
. Même si cet effort vous semble futile et n'a en apparence pas de rapport avec le développement d'un noyau, je vous garanti que les connaissances acquises vous seront très utiles. Pour ceux qui débutent en administration système, je recommande l'excellentissime Guide du Rootard :
Une fois l'image construite, la mise-à-jour du noyau est plus simple :
Le noyau est chargé par Grub en 0x100000
.
Certaines plages d'adresses sont réservées par le noyau ou pour le hardware :
0x0 | 0xFFF | GDT et IDT |
0x1000 | 0x9FFFF | libre |
0xA0000 | 0xFFFFF | réservé pour le hardware |
0x100000 | 0x1FFFFF | réservé pour le noyau |
0x200000 | max | libre |
< Un système multi-tâches : des appels systèmes préemptibles | TutoOS | Gérer la mémoire physique et la mémoire virtuelle >