Autor Thema: Kernel booten mit Grub2  (Gelesen 11684 mal)

OdinX

  • Beiträge: 25
    • Profil anzeigen
Gespeichert
« am: 19. June 2013, 23:46 »
Hallo

Ich habe da ein kleines Problem.
Ich wollte den folgenden Artikel ausprobieren: http://www.lowlevel.eu/wiki/C-Kernel_mit_GRUB#Kernel
Aber ich bringe es nicht hin, die .bin-Datei zu booten.

Ich habe folgendes versucht:

Ich kompilliere, assembliere und linke den Assembler- und C-code erfolgreich (denke ich) und habe nun eine Datei kernel.bin. Dafür habe ich ein bash-script erstellt.
Ich habe dann noch das folgende bash-script erstellt, um das iso-image zu erstellen:

mkdir cdroot/
mkdir cdroot/boot/
mkdir cdroot/boot/grub/

cp grub.cfg cdroot/boot/grub/
cp dev/kernel.bin cdroot/boot/

grub-mkrescue --output=GRUB2.iso cdroot/

rm -R cdroot
Nun habe ich ein iso-image und es hat auch die richtige Datei im Ordner "boot"
Die grub.cfg hat folgenden Inhalt:
set timeout=15
set default=0
 
menuentry "_OS_"
{
   multiboot /boot/kernel.bin
   boot                         
}
Das ist alles
Es wäre super, wenn ihr mir helfen könntet

Freundliche Grüsse

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 20. June 2013, 09:07 »
Du hast leider vergessen, den Fehler zu beschreiben.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

OdinX

  • Beiträge: 25
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 20. June 2013, 12:16 »
Ups, sorry

Was also passiert, wenn ich das daraus resultierende ISO image in einer Virtualbox VM boote ist folgendes:
Es wird grub geladen, aber grub lädt mein .bin-file nicht

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 20. June 2013, 14:18 »
Gibt GRUB eine Fehlermeldung aus?
Dieser Text wird unter jedem Beitrag angezeigt.

OdinX

  • Beiträge: 25
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 20. June 2013, 21:39 »
Nein, gar nichts.
Es steht nur:

GNU GRUB version 1.99-12ubuntu5.1

Minimal BASH-like line editing is supported. For the first word, TAB lists possible command  completions. Anywhere else TAB lists possible device or file completions

grub>

Vielleicht könnte ich also manuell meinen Code aus GRUB raus booten, um zu sehen ob das funktioniert?

streetrunner

  • Beiträge: 67
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 20. June 2013, 21:45 »
Das sieht mir stark nach der Grub-eigenen Konsole aus, daraus kannst du manuell Deinen Kernel booten. Wenn du aber in der Konsole landest dann spricht das dafür dass Dein Eintrag in der Grub.cfg nicht geladen/ausgeführt wird

OdinX

  • Beiträge: 25
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 20. June 2013, 22:30 »
Hab gerade gesehen, dass es doch ein Fehlermeldung gibt, sie verschwindet nur so schnell wieder, dass man sie nicht lesen kann.

Ich krieg es nicht hin, mein file manuell zu booten, der "kernel" befehl ist aber anscheinend nicht für GRUB2, wies aussieht.

Bin also noch am suchen, wie ich das hinkriege

Also, wenn ich multiboot /boot/kernel.bin eingebe, dann reklamiert er: "error: no multiboot header found"
« Letzte Änderung: 20. June 2013, 22:34 von OdinX »

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 20. June 2013, 22:31 »
Dann kannst du mal die beiden Befehle in die Konsole manuell eingeben:
   multiboot /boot/kernel.bin
   boot       
Dieser Text wird unter jedem Beitrag angezeigt.

OdinX

  • Beiträge: 25
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 20. June 2013, 22:41 »
Ich habe folgendes Script geschrieben zum kompillieren und linken:

#!/bin/bash
nasm -f elf -o kernel_asm.o kernel.asm
gcc -m32 -ffreestanding -o kernel_c.o -c kernel.c -Wall -Werror -nostdinc
ld -T kernel.ld -o kernel.bin kernel_asm.o kernel_c.o
rm kernel_c.o
rm kernel_asm.o

Grub bringt aber nach dem Befehl multiboot /boot/kernel.bin die Fehlermeldung: error: no multiboot header found
Ich habe auch noch mal nachgeprüft, ob ich mich nicht verschrieben habe oder so etwas blödes, scheint aber nicht der fall zu sein.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 20. June 2013, 22:47 »
Die Meldung ist ja recht eindeutig. Du kannst ja mal mbchk kernel.bin (von Linux aus) ausführen, und gucken was der sagt, oder die Datei auf dieser Seite http://jidder.de/stuff/mbchk/ prüfen lassen.
Dieser Text wird unter jedem Beitrag angezeigt.

OdinX

  • Beiträge: 25
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 20. June 2013, 22:56 »
Super, das hilft mir schon sehr viel weiter, denke ich.

Das script sagt foldendes:
Der Multiboot-Header wurde an Offset 0x00100000 gefunden.
Der Bootloader wird den Multiboot-Header nicht finden, weil die Signatur sich außerhalb der ersten 8 KByte befindet.

Tip: Verwende ein Linker-Skript um den Header entsprechend zu platzieren. Das wird zum Beispiel in diesem Tutorial beschrieben.

Ich werde mir das Tutorial also erst mal durchlesen.

Danke für die Hilfe

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 20. June 2013, 23:05 »
Ich bin mir nicht ganz sicher, ob sich das Problem damit lösen lässt. Ein Effekt ist ja auch, dass kernel.bin 1 Megabyte groß ist, was mal viel zu groß ist. Falls du ein 64-Bit-System hast, könnte es damit zusammenhängen. Allerdings ist auch das Tutorial, das du im ersten Post verlinkt hast, dafür ausreichend. Da kann vielleicht jemand, der ein 64-Bit Linux nutzt, mehr dazu sagen, falls du das nicht gelöst kriegst.
Dieser Text wird unter jedem Beitrag angezeigt.

OdinX

  • Beiträge: 25
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 20. June 2013, 23:06 »
Sorry, hab noch eine Frage.

Im tutorial http://www.lowlevel.eu/wiki/C-Kernel_mit_GRUB#Kernel wird ja explizit alles auf die Adresse 0x00100000 geladen (kapitel "linken").
Das scheint aber nun genau das problem zu sein, welches ich habe. Hat das tutorial da einen fehler, oder versteh ich was falsch?

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 20. June 2013, 23:08 »
Das 0x100000 ist die Link-Adresse. Wenn der Linker richtig funktioniert/benutzt wird, sollte er die Datei deswegen nicht 1 MB groß machen und alles davor mit Nullen auffüllen, sondern die Sektionen in der Datei an die ersten paar Kilobyte positionieren. Die Link-Adresse ist nicht das Offset in der Datei. Das Skript ist also eigentlich richtig.

Edit: Wenn man einen 64-Bit-Kernel erstellt, hat man ähnliche Probleme. Es könnte sein, dass die Lösung dafür auch hier funktioniert. Du kannst ja mal ausprobieren, ob sich was ändert, wenn du entweder -nostdlib an gcc oder -z max-page-size=0x1000 an ld übergibst.
« Letzte Änderung: 20. June 2013, 23:14 von Jidder »
Dieser Text wird unter jedem Beitrag angezeigt.

OdinX

  • Beiträge: 25
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 20. June 2013, 23:21 »
Super, hat funktioniert. Jetzt gibt er mein hello world endlich aus ^^

Danke für die tolle und schnelle hilfe

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 20. June 2013, 23:31 »
Bitte. :)

Interessehalber: Welche der beiden Parameter hat es gebracht?
Dieser Text wird unter jedem Beitrag angezeigt.

OdinX

  • Beiträge: 25
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 20. June 2013, 23:41 »
Keine Ahnung, ich habe "oder" also logisches oder verstanden und direkt beides gemacht.

Aber ich probiers mal kurz aus und editier dann diesen Beitrag hier.

edit:  es war " -z max-page-size=0x1000"

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 20. June 2013, 23:54 »
Seltsam, dass das passiert. Eigentlich sollte max-page-size bei 32-Bit standardmäßig 4 kB sein. Vielleicht spielen da trotzdem Page Size Extensions mit. Aber ist ja egal, wenn es klappt. ;)

(Und ich hätte auch keine Erklärung, wenn -nostdinc die Lösung gewesen wäre ;))
Dieser Text wird unter jedem Beitrag angezeigt.

 

Einloggen