Autor Thema: Problem beim Linken -> C-Kernel mit Grub Tutorial  (Gelesen 5793 mal)

ThinkPad

  • Beiträge: 5
    • Profil anzeigen
Gespeichert
« am: 08. February 2009, 17:37 »
Hallo,

ich habe noch nicht viel Ahnung von Assembler und arbeite mich gerade durch das "C-Kernel mit Grub" Tutorial.

Ich möchte erstmal auf Linux verzichten und haben mir deswegen djgpp auf meinem Windows XP installiert und eingerichtet.
Aus der Assembler Datei und der C Datei kann ich jeweils eine Objektdatei erzeugen.

Nur beim linken bekomme ich folgende Fehlermeldung:

W:\ASM\TestOS\src>ld -T link.txt -o kernel.bin kernel_asm.o k
kernel_asm.o: file not recognized: File format not recognized

Wäre dankbar, wenn mir da jemand weiterhelfen würde.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 08. February 2009, 18:10 »
Wie erzeugst du denn deine kernel_asm.o?

Wenn du DJGPP benutzt, brauchst du natürlich keine ELF-Datei, sondern das Format, das DJGPP benutzt - meines Wissens COFF. In diesem Fall kannst du dich auch gleich mal über den sogenannten a.out-Kludge schlau machen: Wenn du einen Nicht-ELF-Kernel mit GRUB verwenden willst, mußt du in den Multiboot-Header ein paar Informationen mehr schreiben.
« Letzte Änderung: 08. February 2009, 18:13 von taljeth »
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

ThinkPad

  • Beiträge: 5
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 08. February 2009, 19:10 »
Die kernel_asm.o erzeuge ich wie im Artikel angegeben mit:

nasm -f elf -o kernel_asm.o kernel.asm

Was muss ich denn statt "-f elf" schreiben und wie schreibe ich dann mehr (und vorallem welche) Informationen in den Multiboot-Header ?

Grüße
« Letzte Änderung: 08. February 2009, 19:12 von ThinkPad »

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #3 am: 08. February 2009, 19:26 »
Was muss ich denn statt "-f elf" schreiben
-f aout

Zitat
wie schreibe ich dann mehr (und vorallem welche) Informationen in den Multiboot-Header ?
hier (unter "DJGPP COFF kernels and other file formats")
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

ThinkPad

  • Beiträge: 5
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 08. February 2009, 19:51 »
Danke für eure Hilfe,
meine Kenntnisse in Assemlber sind derzeit aber noch sehr stark begrenzt und ich weiss nicht was ich genau in meine kernel.asm Datei schreiben muss.
Derzeit sieht meine kernel.asm wie folgt aus:

global loader ; loader für Linker sichtbar machen
extern main   ; main-Funktion des C-Kernels
 
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
 
loader:
  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
 
  cli ; falls der Kernel bis hier her kommt, CPU anhalten
  hlt

Wie genau muss denn jetzt die kernel.asm Datei aussehen (also wo muss der Code von http://osdev.berlios.de/grub.html#multiboot hin) ?
Wäre nett wenn jemand den richtigen kernel.asm code posten könnte, dann würde der kernel schonmal booten und ich könnte mich erstmal etwas mit der C Programmierung beschäftigen.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #5 am: 08. February 2009, 20:22 »
global loader ; loader für Linker sichtbar machen
extern main   ; main-Funktion des C-Kernels
extern code
extern edata
extern end

MULTIBOOT_PAGE_ALIGN   equ 1<<0
MULTIBOOT_MEMORY_INFO  equ 1<<1
MULTIBOOT_AOUT_KLUDGE  equ 1<<16

MULTIBOOT_HEADER_MAGIC equ 0x1BADB002
MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_AOUT_KLUDGE
CHECKSUM               equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)

section .text
; The Multiboot header
   align 4
mboot:
   dd MULTIBOOT_HEADER_MAGIC
   dd MULTIBOOT_HEADER_FLAGS
   dd CHECKSUM
; fields used if MULTIBOOT_AOUT_KLUDGE is set in MULTIBOOT_HEADER_FLAGS
   dd mboot ; these are PHYSICAL addresses
   dd code  ; start of kernel .text (code) section
   dd edata ; end of kernel .data section
   dd end   ; end of kernel BSS
   dd loader ; kernel entry point (initial EIP)

loader:
  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
 
  cli ; falls der Kernel bis hier her kommt, CPU anhalten
  hlt

Wobei "code", "edata" und "end" im Linkerskript definiert sein müssen, da ich dein momentanes nicht habe, kann ich es natürlich auch nicht anpassen.
« Letzte Änderung: 09. February 2009, 09:41 von bluecode »
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

ThinkPad

  • Beiträge: 5
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 08. February 2009, 20:29 »
Mein Linkerscript ist das aus dem Tutorial und sieht wie folgt aus:

ENTRY (loader)

SECTIONS
{
  . = 0x00100000;

  .text :
  {
    *(.text)
  }

  .rodata ALIGN (0x1000) :
  {
    *(.rodata)
  }

  .data ALIGN (0x1000):
  {
    *(.data)
  }

  .bss :
  {
    _sbss = .;
    *(COMMON)
    *(.bss)
    _ebss = .;
  }
}


Grüße

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #7 am: 08. February 2009, 20:38 »
ENTRY (loader)

SECTIONS
{
  . = 0x00100000;

  code = .;
  .text :
  {
    *(.text)
  }

  .rodata ALIGN (0x1000) :
  {
    *(.rodata)
  }

  .data ALIGN (0x1000):
  {
    *(.data)
  }

  edata = .;

  .bss :
  {
    *(COMMON)
    *(.bss)
  }
  end = .;
}
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

ThinkPad

  • Beiträge: 5
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 08. February 2009, 21:24 »
Bekomme beim erzeugen der Objekt Datei von kernel.asm folgende Fehler:

W:\ASM\TestOS\src>nasm -f aout -o kernel_asm.o kernel.asm
kernel.asm:21: error: symbol `code' undefined
kernel.asm:22: error: symbol `edata' undefined
kernel.asm:23: error: symbol `end' undefined
kernel.asm:33: error: phase error detected at end of assembly.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 08. February 2009, 21:26 »
Die drei Symbole jeweils als extern deklarieren wäre vermutlich noch schlau.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #10 am: 09. February 2009, 09:42 »
Hab das mal oben korrigiert, falls du es nicht selbst hinbekommst. :|
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

 

Einloggen