Simple Operating System - Chargement du noyau
Chargement du noyau par Grub
Recherche du noyau
Lorsque Grub charge le noyau en mémoire ce dernier doit respecter le standard multiboot. En effet Grub va balayer les 8192 premiers octets du fichier à charger à la recherche d'un flag appelé multiboot header magic qui lui permet d'identifier une structure spécifique :
/* The magic number for the Multiboot header. */
#define MULTIBOOT_HEADER_MAGIC 0x1BADB002
/* The Multiboot header. */
typedef struct multiboot_header
{
unsigned long magic;
unsigned long flags;
unsigned long checksum;
unsigned long header_addr;
unsigned long load_addr;
unsigned long load_end_addr;
unsigned long bss_end_addr;
unsigned long entry_addr;
} multiboot_header_t;
- magic
- Le marqueur de repérage pour Grub 0x1BADB002.
- flag
- Indique la présence ou non des champs non requis de la structure.
- checksum
- Permet à Grub de valider qu'il se trouve dans une structure de type multiboot header.
- load_addr et load_end_addr
- Adresse mémoire de début et de fin où doit être placé le noyau par Grub.
- entry_addr
- Adresse de la fonction réalisant le changement de pile d'exécution et appelant la fonction sos_main
Grub peut ainsi placer le noyau à l' emplacement mémoire spécifié par le noyau lui même.
Appel de sos_main
La fonction située à l'adresse entry_addr est appelée et réalise le changement de pile d'exécution. Cette fonction appelle ensuite sos_main en lui fournissant 2 arguments :
- Un flag multiboot bootloader magic qui assure au noyau SOS qu'il a bien été chargé par Grub.
- Une structure multiboot info qui contient diverses informations, taille de la mémoire, emplacement de zones réservées.
/* The magic number passed by a Multiboot-compliant boot loader. */
#define MULTIBOOT_BOOTLOADER_MAGIC 0x2BADB002
/* The Multiboot information. */
typedef struct multiboot_info
{
unsigned long flags;
unsigned long mem_lower;
unsigned long mem_upper;
unsigned long boot_device;
unsigned long cmdline;
unsigned long mods_count;
unsigned long mods_addr;
union
{
aout_symbol_table_t aout_sym;
elf_section_header_table_t elf_sec;
} u;
unsigned long mmap_length;
unsigned long mmap_addr;
unsigned long drives_length;
unsigned long drives_addr;
} multiboot_info_t;
- flag
- Indique la présence ou non des champs non requis de la structure.
- mem_lower
- L'adresse la plus basse accessible en mémoire.
- mem_upper
- L'adresse la plus haute accessible en mémoire.
- boot_device
- L'emplacement physique sur lequel Grub à charger le noyau (disquette, 1ere partition du disque..).
- cmdline
- Adresse de la commande passée au noyau.
- mods_count
- Indique le nombre de modules chargés.
- mods_addr
- Indique l'adresse de la structure du premier module.
Pour plus de détail vous pouvez consulter les spécifications multiboot