< Créer et lancer une application au format ELF à partir du système de fichier | TutoOS | Quelques structures élémentaires pour gérer les fichiers >
Le package contenant les sources est téléchargeable ici : kernel_Grub2.tgz
Pour naviguer dans l'arborescence : Grub2
Le fait de booter sur un disque IDE apporte un changement fondamental par rapport au boot sur une disquette : il faut partitionner le disque. Cela apporte une petite complexité supplémentaire dont le contournement est expliqué ci-dessous...
On commence par créer une image avec bximage
:
$ bximage > hd > flat > 2 > c.img
Celà a pour effet de créer un fichier nommé ici c.img
et affiche le message suivant à l'écran :
The following line should appear in your bochsrc: ata0-master: type=disk, path="c.img", mode=flat, cylinders=4, heads=16, spt=63
Cette ligne est à reporter dans le fichier .bochsrc
. N'oublier pas aussi de préciser le périphérique de boot :
boot: disk
Il faut ensuite partitionner l'image du disque. Les commandes c
, h
et s
indiquent quelle est la géométrie du disque :
$ fdisk c.img > x > c 4 > h 16 > s 63 > r > n, p, 1 > a 1 > w
Après ça, il faut obtenir le numéro de secteur de la partition créée :
$ fdisk -l -u c.img Disk c.img: 0 MB, 0 bytes 16 heads, 63 sectors/track, 0 cylinders, total 0 sectors Units = sectors of 1 * 512 = 512 bytes Disk identifier: 0x7337b4ff Device Boot Start End Blocks Id System c.img1 * 63 4031 1984+ 83 Linux
Nous allons maintenant associer la partition créée à un loop device, qui est un pseudo périphérique qui permet à un fichier d'être accédé comme s'il s'agissait d'un périphérique de type bloc. On utilise pour celà la commande losetup
avec comme argument l'offset, en octet, où se trouve le début de la partition (c'est la raison de la commande précédente).
L'offset calculé est de 63 * 512 = 32356 :
# losetup -o 32256 /dev/loop0 c.img
Note : pour détacher le loop device de l'image :
# losetup -d /dev/loop0
A partir de maintenant, la partition de l'image disque est vue comme un vrai périphérique de type bloc. On peut donc déposer un système de fichiers dessus :
# mke2fs /dev/loop0
Ensuite, pour monter la partition :
# mount -t ext2 /dev/loop0 /mnt/loop
On ajoute quelques fichiers sur la partition montée :
$ mkdir /mnt/loop/grub $ cp /boot/grub/stage* /mnt/loop/grub $ cat > /mnt/loop/grub/menu.lst << EOF title=Pepin root (hd0,0) kernel /kernel boot EOF
Ensuite, il faut démonter la partition pour installer grub dessus :
$ umount /mnt/loop $ grub --device-map=/dev/null << EOF device (hd0) c.img root (hd0,0) setup (hd0) quit EOF
Ouf ! C'est fait, maintenant, on peut remonter la partition quelque part pour copier le kernel dessus.
La table des partition primaires du MBR permet de gérer jusqu'à 4 partitions. Les informations sur ces partitions sont situés à des offsets prédéfinis par rapport au début du disque :
Partition | Offset |
---|---|
Partition 1 | 0x01BE |
Partition 2 | 0x01CE |
Partition 3 | 0x01DE |
Partition 4 | 0x01EE |
Chaque entrée de la table fait 16 octets et obéit au format suivant :
La valeur s_lba
permet de connaître l'offset où commence une partition par rapport au début du disque. En l'occurence, les données débuterons à partir de l'offset s_lba*512
(en octets).
Nous avons vu au chapitre sur l'utilisation d'un système de fichiers Ext2 comment lire des données tels que le superbloc, une inode, etc. Quelques changements sont à apporter pour que ces fonctions continuent de fonctionner car les lectures ne se font plus à partir du début du disque mais à partir du début de la partition. Chaque donnée subit donc un décalage de s_lba*512
octets :
< Créer et lancer une application au format ELF à partir du système de fichier | TutoOS | Quelques structures élémentaires pour gérer les fichiers >