User Tools

Site Tools


archi:x86

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
archi:x86 [2016/03/16 23:20] – [Booter son Kernel depuis un disque (sans GRUB)] orelarchi:x86 [2024/03/18 15:06] (current) – external edit 127.0.0.1
Line 18: Line 18:
   * [[https://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax|Syntaxe GAS]]    * [[https://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax|Syntaxe GAS]] 
   * [[https://en.wikibooks.org/wiki/X86_Assembly|Assembleur x86]]   * [[https://en.wikibooks.org/wiki/X86_Assembly|Assembleur x86]]
 +  * Compiler Explorer: https://gcc.godbolt.org
  
 ====Exemple Hello World en GAS ==== ====Exemple Hello World en GAS ====
Line 62: Line 63:
 </code>   </code>  
  
-==== Bootloader ====+==== Bootloader au format multiboot ====
  
-Considérons le code assembleur x86 suivant d'un //bootloader// minimaliste en 32 bits. Le code se compose du //bootloader// à proprement parler (fichier //boot.s//), qui appelle la fonction //main// du //kernel// (fichier //kernel.s//).+Considérons le code assembleur x86 suivant d'un //bootloader// minimaliste en 32 bits au format //multiboot//. Le code se compose du //bootloader// à proprement parler (fichier //boot.s//), qui appelle la fonction //main// du //kernel// (fichier //kernel.s//).
  
 <code c boot.s> <code c boot.s>
Line 128: Line 129:
 </code> </code>
  
-Lors de l'édition de lien, il est important de préciser que le point d'entrée est le symbole '_start' et de placer la séquence magique de 12 octets du //bootloader// à une adresse supérieure à 0x100000. En effet, les adresses < 1MiB sont réservées pour le BIOS, la RAM Video, etc. +Lors de l'édition de lien, il est important de préciser que le point d'entrée est le symbole '_start' et de placer la séquence magique de 12 octets du //bootloader// à une adresse supérieure à 0x100000, suivi du code (segment .text). En effet, les adresses < 1MiB sont réservées pour le BIOS, la RAM Video, etc. 
  
 On peut aussi utiliser un //external linker script// pour compiler notre //kernel// :  On peut aussi utiliser un //external linker script// pour compiler notre //kernel// : 
Line 175: Line 176:
  
   qemu-system-i386 -enable-kvm -kernel kernel   qemu-system-i386 -enable-kvm -kernel kernel
 +  
 +L'option //-kernel// permet de "booter" directement sur un noyau linux au format //bzimage// ou sur un code au format //multiboot// comme celui décrit dans cette section. Notons que c'est le format standard supporté par GRUB.
      
 ==== Kernel en C ==== ==== Kernel en C ====
Line 295: Line 298:
 ==== Booter son Kernel depuis un disque (sans GRUB) ==== ==== Booter son Kernel depuis un disque (sans GRUB) ====
  
-Pour booter son Kernel depuis un disque (//floppy//, //hard disk// ou //usb disk//), il faut tout d'abord modifier la séquence de boot du BIOS pour qu'il puisse amorcer le système depuis ce périphérique au démarrage de l'ordinateur. Ces 3 types de disque utilisent la même organisation en secteur de 512 octets. Pour rendre un dique bootable, il faut ajouter la signature de boot (i.e. //0x55aa//) à la fin du secteur 0.+Pour booter son Kernel depuis un disque (//floppy//, //hard disk// ou //usb disk//), il faut tout d'abord modifier la séquence de boot du BIOS pour qu'il puisse amorcer le système depuis ce périphérique au démarrage de l'ordinateur. Ces 3 types de disque utilisent la même organisation en secteur de 512 octets. Pour rendre un disque bootable, il faut ajouter la signature de boot (i.e. //0x55aa//) à la fin du secteur 0.
  
 <code hello.s> <code hello.s>
Line 337: Line 340:
 </code> </code>
  
-Attention, dans ce cas précis, le BIOS recopie en mémoire physique le secteur 0 (512 octets) et passe la main au CPU pour qu'il commence à exécuter en //mode real// (16 bits) les instructions au début du secteur 0... Notons que dans ce cas, il est possible de faire appel aux interruptions du BIOS pour écrire en mémoire VGA (//int 0x10//).+Attention, dans ce cas précis, le BIOS recopie en mémoire physique le secteur 0 (512 octets) et passe la main au CPU pour qu'il commence à exécuter en //mode real// (16 bits) les instructions au début du secteur 0... Notons que dans ce cas, il est possible de faire appel aux interruptions du BIOS pour écrire en mémoire VGA (//int 0x10//). 
  
 Il faut ensuite compiler ce programme //en flat binary// (et non en ELF) puis le copier sur sa disquette : Il faut ensuite compiler ce programme //en flat binary// (et non en ELF) puis le copier sur sa disquette :
Line 350: Line 353:
   qemu-system-i386 -fda floppy.img -boot a   # boot on floppy disk   qemu-system-i386 -fda floppy.img -boot a   # boot on floppy disk
   qemu-system-i386 -hda floppy.img           # boot on hard disk     qemu-system-i386 -hda floppy.img           # boot on hard disk  
 +  
 +On peut également mettre son bootloader sur le premier secteur d'une clef USB : /dev/sdc sur ma machine (fdisk -l). Mais, attention de ne pas se tromper au risque de perdre toutes vos données !   
 +
 +  cat hello.bin > /dev/sdc
 +  
 +Puis on reboote la "vraie" machine avec la clef USB et voici le résultat. Notons que nous n'avons pas préparé de table des partitions, d'où le message affiché par le BIOS : //Invalid Partition Table// avant notre fameux //Hello World// :-)
 +
 +{{ :archi:helloboot-laptop.jpg?direct&300 |}}
  
 Pour aller plus loin :  Pour aller plus loin : 
Line 365: Line 376:
  
  
-==== Pour aller plus loin ====+==== Pour aller encore plus loin ====
  
   * http://viralpatel.net/taj/operating-system-tutorial.php   * http://viralpatel.net/taj/operating-system-tutorial.php
archi/x86.1458170448.txt.gz · Last modified: 2024/03/18 15:05 (external edit)