Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet 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.
-
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.
-
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
-
Was muss ich denn statt "-f elf" schreiben
-f aout
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")
-
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.
-
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.
-
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
-
ENTRY (loader)
SECTIONS
{
. = 0x00100000;
code = .;
.text :
{
*(.text)
}
.rodata ALIGN (0x1000) :
{
*(.rodata)
}
.data ALIGN (0x1000):
{
*(.data)
}
edata = .;
.bss :
{
*(COMMON)
*(.bss)
}
end = .;
}
-
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.
-
Die drei Symbole jeweils als extern deklarieren wäre vermutlich noch schlau.
-
Hab das mal oben korrigiert, falls du es nicht selbst hinbekommst. :|