Autor Thema: OS-Dev mit Intelassembler  (Gelesen 18352 mal)

Buschpilot

  • Beiträge: 12
    • Profil anzeigen
Gespeichert
« Antwort #20 am: 24. December 2011, 15:48 »
Hallo,

so habe jetzt GRUB als bootmanager und auch als .iso mit meinem kernel drauf. beim booten kann ich auch mein os auswählen aber dann kommt die meldung: "error: no loaded kernel"

dachte es liegt daran dass ich den multiboot header falsch erstellt habe aber mit der version von littlefox funktioniert es auch nicht.

woran kann es liegen?

EDIT:

am multibootheader liegt es nicht

die fehlermeldung lautet jetzt: "unknown ELF class"

habe mit nasm anstatt bin eine elf datei zu erzeugen "nasm -f elf -o kernel.elf kernel.asm" bzw "nasm -f elf32 -o kernel.elf kernel.asm"
habe die grub.cfg entsprechend geändert.

dann taucht die fehlermeldung auf: "invalid ELF file type"
« Letzte Änderung: 24. December 2011, 16:12 von Buschpilot »

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #21 am: 24. December 2011, 16:20 »
Du hast eine Objektdatei erstellt (relocatable), die musst die jetzt zu einer ausführbaren ELF-Datei (executable) linken.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Buschpilot

  • Beiträge: 12
    • Profil anzeigen
Gespeichert
« Antwort #22 am: 24. December 2011, 17:08 »
und wie mache ich das? hat nasm da einen integriert? habe nichts gefunden und mir ALINK geladen aber da kann ich nur zu .COM .EXE und .PE dateien linken

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #23 am: 24. December 2011, 18:04 »
Mit ld, so wie du es mit einem C-Kernel auch machen würdest.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Buschpilot

  • Beiträge: 12
    • Profil anzeigen
Gespeichert
« Antwort #24 am: 26. December 2011, 01:12 »
stimmt gibts ja auch noch hab ich gar nicht dran gedacht da ich ja mit nasm und nicht mehr mit gcc arbeite.

ich verstehe allerdings nicht diese linkerscripts. habe schon das manual dazu gelesen aber verstehe es trotzdem nicht.

Dimension

  • Beiträge: 155
    • Profil anzeigen
Gespeichert
« Antwort #25 am: 26. December 2011, 17:12 »
Bei NASM kannst du entweder das BIN-Format (-f bin) und die ORG-Direktive verwenden, oder das ELF-Format (-f elf) und mit ld linken. Wenn du deinen ASM-Code mit C kombinieren willst, musst du in jedem Fall linken. Beim Linken werden die Objektdateien an eine feste Adresse ausgerichtet und alle Labels durch feste Adressen ersetzt. btw: ELF gibt es sowohl als relocatable als auch als executable. Images kannst du mit dd zusammensetzen.

Im Linker-Script (einbinden mit -T) stehen sowohl Ausgabeformat, Startadressen der einzelnen Sections, als auch das Label des Einstiegspunkts.

Tutorial im Wiki: http://www.lowlevel.eu/wiki/C-Kernel_mit_GRUB
« Letzte Änderung: 27. December 2011, 02:03 von Dimension »

Buschpilot

  • Beiträge: 12
    • Profil anzeigen
Gespeichert
« Antwort #26 am: 27. December 2011, 15:59 »
ja aber wenn ich mit grub .bin laden will erscheint "unknown ELF class"

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #27 am: 27. December 2011, 17:32 »
Wenn du eine flache Binary mit GRUB laden willst, musst du den a.out-Kludge benutzen, d.h. Bit 16 in den Flags setzen und die entsprechenden zusätzlichen Felder im Multibootheader angeben.

Aber über kurz oder lang willst du sowieso einen Linker benutzen.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Buschpilot

  • Beiträge: 12
    • Profil anzeigen
Gespeichert
« Antwort #28 am: 28. December 2011, 12:29 »
wie genau sieht das aus? tut mir leid wenn ich so viel frage :)

Dimension

  • Beiträge: 155
    • Profil anzeigen
Gespeichert
« Antwort #29 am: 10. January 2012, 16:54 »
Das Tutorial hat bei mir funktioniert. Du kannst dir ja erstmal alles kopieren und das zum Laufen bringen.

nnosdev

  • Beiträge: 61
    • Profil anzeigen
Gespeichert
« Antwort #30 am: 15. February 2012, 21:51 »
Ich hab mich ebenfalls für die Intel-Syntax entschieden:



section multiboot
MB_MODULEALIGN equ 0x0 ;not used
MB_MEMINFO equ 0x0 ;not used
MB_FLAGS equ MB_MODULEALIGN | MB_MEMINFO
MB_MAGIC equ 0x1BADB002
MB_CHECKSUM equ -(MB_MAGIC + MB_FLAGS)

align 4
dd MB_MAGIC
dd MB_FLAGS
dd MB_CHECKSUM

section .text

extern init

global _start
_start:
mov esp, kernel_stack
call init

_stop:
    cli
    hlt

    jmp _stop

section .bss
resb 8192 ; 8kB stack
kernel_stack:

Und das dafür vorgesehene Makefile entsprechend geändert:

# Main Makefile

SRCS = $(shell find -name '*.[cS]')
OBJS = $(addsuffix .o,$(basename $(SRCS)))

CC = gcc
AS = nasm
LD = ld

ASFLAGS = -f elf
CFLAGS = -m32 -Wall -g -fno-stack-protector -nostdinc
LDFLAGS = -melf_i386 -Ttext=0x100000

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

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

%.o: %.S
$(AS) $^ $(ASFLAGS) -f elf -o $@

clean:
rm $(OBJS)

qemu:
qemu -kernel nnOS

.PHONY: clean

 

Einloggen