Autor Thema: Booten mit Grub  (Gelesen 15542 mal)

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #20 am: 03. June 2012, 00:54 »
Jup, schau ich mir mal an.
Dieser Text wird unter jedem Beitrag angezeigt.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #21 am: 03. June 2012, 01:26 »
Also, wenn ich das CD-Image in meinem qemu boote (qemu -cdrom os.iso), bekomm ich die Meldung

error: out of memory.
error: no loaded kernel.

Das liegt daran, dass wohl 128 MB RAM nicht ausreichen. Wenn ich den RAM auf 512 MB setze komm ich auch bis zu dem blinkenden Cursor.

Das Problem kann man auch sehen, wenn man den Kernel mal mit objdump -x V0.0.1 analysiert.
    LOAD off    0x00000000000000c0 vaddr 0x0000000000100000 paddr 0x0000000000100000 align 2**5
         filesz 0x0000000000001268 memsz 0x00000000060120a0 flags rwx

Am memsz sieht man, dass der Kernel ziemlich genau 100 MB Speicher braucht. Keine Ahnung warum GRUB dadraus so viel mehr macht, aber auf jeden Fall ist das ein Problem mit dem Kernel.

Weiter im Listing von objdump sieht man folgende Symbole an diesen hohen Adressen:
0000000006112040 g     O .bss 0000000000000010 gdtr
...
0000000006112050 g     O .bss 000000000000000c gdt_entry
0000000006112060 g     O .bss 0000000000000040 cr3
Da die alle im .bss-Segment liegen, schließe ich erstmal, dass irgendwas an der Definition des .bss-Segments im Linkerskript nicht richtig ist. Wenn du allerdings immer noch das Linkerskript aus deinem zweiten Post verwendest, dann weiß ich auch nicht was da falsch sein soll.

Eigentlich wollte ich jetzt noch mehr erzählen, was alles nicht funktioniert, aber ich steig auch gerade nicht durch, was qemu mit dem Kernel macht. Ist schon zu spät für sowas. Deswegen nur so viel: Das Problem ist definitiv, dass du einen 64-Bit-Kernel erstellst. Der kann nicht ausgeführt werden. Du musst den Compiler und den Linker anweisen 32-Bit-Code zu erzeugen. Das geht, indem du GCC als Flags -m32 übergibst und LD -melf_i386. Für AS ist --32 nötig. Wenn du zum Linken oder Assemblieren GCC verwendest, sollte bei beiden aber auch -m32 gehen. Keine Ahnung wie genau man das Eclipse beibringt, aber wenn du das mit dem Linkerskript hingekriegt hast, sollte auch das gehen. Wenn nicht, solltest du Eclipse nicht mehr zum Kompilieren verwenden, sondern nur noch als Editor. In einer Shell make eintippen (oder Pfeil-nach-oben + Enter) ist auch nicht viel umständlicher.
Dieser Text wird unter jedem Beitrag angezeigt.

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #22 am: 03. June 2012, 01:52 »
Hallo,
aber wie kann ich dann einen 64-Bit Kernel erstellen, wenn ich ihn mit 32-Bit compilieren soll/muss?
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #23 am: 03. June 2012, 02:12 »
Willst du vielleicht nicht erstmal einen 32-Bit-Kernel schreiben? Das ist etwas einfacher.

Wenn nicht: Du musst trotzdem einen kleinen 32-Bit-"Kernel" schreiben, der nichts anderes macht als in den 64-Bit-Modus zu wechseln, die Binary des 64-Bit Kernels zu laden, diese korrekt im virtuellen Adressraum zu platzieren und dann dahinspringen. (Das heißt du brauchst zwei Binaries, die erste ist der Loader und die zweite der Kernel, den du dann als Multiboot-Modul lädst.)

Die Alternative wäre, dass du 32-Bit- und 64-Bit-Code zu einer Binary kombinierst. Du könntest zum Beispiel mit .code32 den Assembler anweisen 32-Bit-Code zu generieren, damit du in den Long Mode wechseln kannst. Das hab ich allerdings bisher nicht ausprobiert. Möglicherweise kannst du sogar 32-Bit C-Code dazulinken, aber auch das hab ich nicht ausprobiert.
« Letzte Änderung: 03. June 2012, 02:15 von Jidder »
Dieser Text wird unter jedem Beitrag angezeigt.

 

Einloggen