[SOS] Multiboot

Nicolas Duboc nicolas at duboc.net
Mer 17 Nov 16:17:00 CET 2004


On Wed, Nov 17, 2004 at 02:27:09PM +0100, Nicolas Duboc wrote:
> [...]
>  Il semble que GRUB ne soit pas géné par cela car le fichier image du
> noyau est au format ELF. Du code de grub [2] je comprend qu'il utilise
> les infos des headers ELF plutot que celles de la structure multiboot.
> 
>  Bref, je pense que SOS n'est pas compatible Multiboot. Un autre
> bootloader que GRUB pourrait refuser de lancer SOS.

  Je joins un petit patch (sur le source de l'article 1) qui montre ce
que j'aurais fait pour corriger. En gros, on ne crée plus une section
spéciale .multiboot et on déplace son contenu dans la section .text. Les
symboles multiboot_header et __b_kernel pointent alors vers la même
adresse. La spec est contente (/bin/mbcheck aussi d'ailleurs).

  Après application du patch, SOS boote toujours avec GRUB (ouf! mais
normal puisque GRUB n'utilise pas ces champs). Par contre j'ai du mal à
analyser les éventuels effets de bord de ce patch.

-- 
Nicolas Duboc <nicolas at duboc.net>
-------------- section suivante --------------
diff -ur sos-code-article1.original/support/sos.lds sos-code-article1/support/sos.lds
--- sos-code-article1.original/support/sos.lds	2004-07-01 10:51:45.000000000 +0200
+++ sos-code-article1/support/sos.lds	2004-11-17 16:03:24.000000000 +0100
@@ -31,26 +31,6 @@
     . = 0x200000;
     __b_load   = .;
 
-    /* the multiboot header MUST come early enough in the output
-       object file */
-    .multiboot :
-    {
-        /* The multiboot section (containing the multiboot header)
-           goes here */
-	*(.multiboot);
-	
-	/*
-	 * With the following line, we force this section to be
-	 * allocated in the output file as soon as possible, no matter
-	 * when the file containing the multiboot header (multiboot.S)
-	 * is compiled. This is to conform to the multiboot spec, which
-	 * says "The Multiboot header must be contained completely
-	 * within the first 8192 bytes of the OS image, and must be
-	 * longword (32-bit) aligned."
-	 */
-	LONG(0);
-    }
-
     /* Defines a symbol '__b_kernel to mark the start of the kernel
        code/data */
     . = ALIGN(4096);
@@ -59,6 +39,8 @@
     /* Beginning of the text section */
     .text ALIGN(4096) :
     {   
+        *(.multiboot);
+        LONG(0)
 	/* This section includes the code */
         *(.text*)
 	/* Defines the 'etext' and '_etext' at the end */


Plus d'informations sur la liste de diffusion Sos