Autor Thema: ganz einfacher kernel + multiboot mit grub  (Gelesen 4847 mal)

tomm

  • Beiträge: 2
    • Profil anzeigen
Gespeichert
« am: 28. September 2008, 16:49 »
Halli Hallo

Ich habe mir vorgenommen einen eigenen, sehr sehr minimalen Kernel, mit dem ich herumspielen und testen kann, zu bauen. Ich bin ein absoluter Anfaenger und deshalb auf bestehende tutorials angewiesen.

das is mein Kernel:
my_boot.asm
FLAGS    equ 0
MAGIC    equ 0x1BADB002       ; Magicnumber - Erkennungsmerkmal f?r Grub
CHECKSUM equ -(MAGIC + FLAGS) ; Checksum
 
section .text
align 4
MultiBootHeader:
  dd MAGIC       ; Magic number
  dd FLAGS       ; Flags
  dd CHECKSUM    ; Checksum

global _start

_start:
  mov esp,0x200000 ; Stack an die 2MB-Grenze platzieren
;  push eax         ; Multiboot Magicnumber auf den Stack legen
;  push ebx         ; Adresse der Multiboot-Structure auf den Stack legen
;  call main        ; main-Funktion des C-Kernels aufrufen

endless:
    jmp endless
wie man bemerkt hat er einige Aehnlichkeit mit dem hier: http://lowlevel.brainsware.org/wiki/index.php/C-Kernel_mit_Grub#Kernel_-_Assembler
das wiki ist einfach spitze.

die object-datei bilde ich so:
yasm -f elf -m amd64 -o my_boot.o my_boot.asm
und gelinkt wird so:
ld -s -o my_boot my_boot.o

wenn ich jetzt my_boot ausfuehre, dann scheint es als sollte mein assembler-code funktionieren, denn ich gelange in eine Endlosschleife ohne anzeige von Fehlern ^^

also kopiere ich my_boot nach /boot/my_boot und editiere /boot/grub/menu.lst:

title  Arch Linux
root   (hd0,2)
kernel /boot/vmlinuz26 root=/dev/sda3 ro
initrd /boot/kernel26.img

title my_own
root (hd0,2)
kernel /boot/my_boot
Die Position meines kernels muesste also auch stimmen, weil ich im moment ja mit arch unterwegs bin und meinen kernel nur neben den von arch (linux distribution) gelegt habe.

Doch mein Problem bekomme ich wenn ich versuche den Kernel nun wirklich auch zu booten, denn grub sendet mir den Fehler:
"Error 13
Invalid or unsupported executable format"

Ich denke dass das auf einen fehler in der magic-number oder den flags hindeutet, jedoch kann ich keinen Fehler finden. Ausserdem bereitet mit mein 64-prozessor ein bisschen Kopfzerbrechen, liegt es an ihm -> ist mein kernel 64 bit (wegen der option -m amd64 bei yasm) und grub will einen 32 bit kernel laden?
Auch der output von hexdump /boot/my_boot irritiert mich:
0000000 457f 464c 0102 0001 0000 0000 0000 0000
0000010 0002 003e 0001 0000 008c 0040 0000 0000
0000020 0040 0000 0000 0000 00a8 0000 0000 0000
0000030 0000 0000 0040 0038 0001 0040 0003 0002
0000040 0001 0000 0005 0000 0000 0000 0000 0000
0000050 0000 0040 0000 0000 0000 0040 0000 0000
0000060 0093 0000 0000 0000 0093 0000 0000 0000
0000070 0000 0020 0000 0000 0000 0000 0000 0000
0000080 b002 1bad 0000 0000 4ffe e452 00bc 2000
0000090 eb00 00fe 732e 7368 7274 6174 0062 742e
00000a0 7865 0074 0000 0000 0000 0000 0000 0000
00000b0 0000 0000 0000 0000 0000 0000 0000 0000
...
sollte dort nich in Zeile 0000080 1bad b002 anstatt b002 1bad stehen? warum sind die 4 byte-bloecke umgekehrt?

Ich hoffe ihr koennt mir helfen, dankeschoen schonmal im Voraus!

jgraef

  • Beiträge: 67
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 28. September 2008, 17:08 »
Der normale Grub kann keinen 64Bit-Code laden. Eine Möglichkeit wäre mit Grub einen 32bit-Kernel zu laden, der dann 64bit initialisiert. AFAIK gibt es aber auch 64Bit-Grub.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #2 am: 28. September 2008, 17:45 »
sollte dort nich in Zeile 0000080 1bad b002 anstatt b002 1bad stehen? warum sind die 4 byte-bloecke umgekehrt?
Nein, das stimmt so. Die höheren Bits an der höheren Adresse.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

tomm

  • Beiträge: 2
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 02. October 2008, 17:34 »
danke @jgraef für die Info, dann ist mir mein Problem jetzt auch bewusst.

achso @bluecode, das ist wegen dem big- und small-ending, alles klar

vielen Dank ihr Beiden!

 

Einloggen