Autor Thema: C-Kernel aus dem Tutorial -> No Multiboot header.  (Gelesen 2946 mal)

Loui

  • Beiträge: 3
    • Profil anzeigen
Gespeichert
« am: 14. June 2010, 23:12 »
Hallo alle zusammen,

anhand des Tutorials im Wiki habe ich versucht einen kleinen Kernel in C zu schreiben. Das Hello World hat eigentlich noch ganz gut geklappt, aber als ich jetzt noch die kprintf Funktion implementiert habe streikt der Kernel.
Nach dem Kompilieren des Kernels bekomme ich beim Überprüfen mit mbchk folgende Meldung:
$ mbchk kernel
kernel: No Multiboot header.

Mein Multiboot Header ist der selbe wie aus dem Wiki:
.section .multiboot
#define MB_MAGIC 0x1badb002
#define MB_FLAGS 0x0
#define MB_CHECKSUM -(MB_MAGIC + MB_FLAGS)
 
.align 4
.int    MB_MAGIC
.int    MB_FLAGS
.int    MB_CHECKSUM
 
 .section .text
 
.extern init

.global _start
_start:
    mov $kernel_stack, %esp
 
    call init
 
    jmp .
 
.section .bss
.space 8192
kernel_stack:

Das Makefile habe ich etwas abgeändert:
SRCS = $(shell find -name '*.[cS]')
OBJS = $(addsuffix .o,$(basename $(SRCS)))

CC = gcc
LD = ld

ASFLAGS = -m32
CFLAGS = -m32 -Wall -g -fno-stack-protector -nostdinc -I include -std=c99
LDFLAGS = -melf_i386 -Tkernel.ld --nmagic

kernel: $(OBJS)
$(LD) $(LDFLAGS) -o $@ $^

%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $^

%.o: %.S
$(CC) $(ASFLAGS) -c -o $@ $^

clean:
rm $(OBJS)

.PHONY: clean
Ich habe den C Standard auf c99 gesetzt und das ld Kommando um "--nmagic" erweitert weil ich in einem anderen Thread gelesen habe dass es etwas nützen soll was in meinem Fall leider auch nicht funktioniert hat.

Hat jemand noch eine Idee an was das liegen könnte?
Vielen Dank schonmal.

MfG

Loui

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 15. June 2010, 09:29 »
Hast du dir die Kernel-Binary mal näher angeschaut (z.B. mit einem Hexeditor oder objdump) und nach dem Multibootheader gesucht? Da wäre erstmal interessant herauszufinden, wo er denn wirklich landet und was noch davor kommt und in Wirklichkeit erst hinterher (oder gar nicht) kommen sollte.

Der Ansatzpunkt für die Lösung ist vermutlich das Linkerskript.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Loui

  • Beiträge: 3
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 15. June 2010, 10:19 »
Ich habe auch das standard Linkerscript vom Tutorial verwendet:
http://www.lowlevel.eu/wiki/Teil_4_-_Hello_World

Die Binary werde ich zu Hause nochmal untersuchen.

Edit:
So ich hab mal nen objdump von dem Kernel gemacht:
http://pastie.org/private/jb9uc2xu8eztmjbeiljqa


in der init.c steht auch bloß das hier drin:
//#include "console.h"

void init(void)
{
    //kprintf("Hello World!\n...");
}

Leider kann ich nichts erkennen. Ich meine es fängt ja auch erst alles bei 0x100000 an so wie es im Linker Script steht. Gleich danach sollte er ja auch in die init Funktion springen - eigentlich^^.

Loui
« Letzte Änderung: 15. June 2010, 17:06 von Loui »

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 15. June 2010, 18:20 »
im original heißt die setction nicht ".multiboot" sondern "multiboot"
d.h. du musst warscheinlich dein linkscript leicht anpassen wenn du es 1:1 übernommen hast
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

Loui

  • Beiträge: 3
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 15. June 2010, 18:54 »
Ich bin blöd -.-
Danke für die Lösung meines peinlichen Problems^^.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 15. June 2010, 19:08 »
Ich bin blöd -.-
Danke für die Lösung meines peinlichen Problems^^.

es zeigt immerhin das du dir dein kernel nicht nur mit copy&past zusammen bastelst
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

 

Einloggen