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!