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 :

    
      /* 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

Valid XHTML 1.0!