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/17 07:52] – [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 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.1458201167.txt.gz · Last modified: 2024/03/18 15:05 (external edit)