Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: ThinkPad am 08. February 2009, 17:37

Titel: Problem beim Linken -> C-Kernel mit Grub Tutorial
Beitrag von: ThinkPad 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.
Titel: Re: Problem beim Linken -> C-Kernel mit Grub Tutorial
Beitrag von: kevin 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.
Titel: Re: Problem beim Linken -> C-Kernel mit Grub Tutorial
Beitrag von: ThinkPad 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
Titel: Re: Problem beim Linken -> C-Kernel mit Grub Tutorial
Beitrag von: bluecode 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 (http://osdev.berlios.de/grub.html#multiboot) (unter "DJGPP COFF kernels and other file formats")
Titel: Re: Problem beim Linken -> C-Kernel mit Grub Tutorial
Beitrag von: ThinkPad 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.
Titel: Re: Problem beim Linken -> C-Kernel mit Grub Tutorial
Beitrag von: bluecode 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.
Titel: Re: Problem beim Linken -> C-Kernel mit Grub Tutorial
Beitrag von: ThinkPad 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
Titel: Re: Problem beim Linken -> C-Kernel mit Grub Tutorial
Beitrag von: bluecode 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 = .;
}
Titel: Re: Problem beim Linken -> C-Kernel mit Grub Tutorial
Beitrag von: ThinkPad 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.
Titel: Re: Problem beim Linken -> C-Kernel mit Grub Tutorial
Beitrag von: kevin am 08. February 2009, 21:26
Die drei Symbole jeweils als extern deklarieren wäre vermutlich noch schlau.
Titel: Re: Problem beim Linken -> C-Kernel mit Grub Tutorial
Beitrag von: bluecode am 09. February 2009, 09:42
Hab das mal oben korrigiert, falls du es nicht selbst hinbekommst. :|