Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: elfish_rider am 28. December 2005, 13:21
-
Ich habe Probleme mit dem Linken eines GRUB-konformen Kernels. Ich hatte diese Linkerfiles noch nie im Griff:
Link.txt
OUTPUT_FORMAT("binary")
INPUT(start1.o start2.o)
SECTIONS
{
. = 0x100000;
.text : { *(.text) }
.data : { *(.data) }
.bss : { *(.bss) }
}
Ich weiss, da fehlt noch viel.
start.asm
CPU 386
BITS 32
EXTERN _start
GLOBAL Start
MULTIBOOT_PAGE_ALIGN equ 1<<0
MULTIBOOT_MEMORY_INFO equ 1<<1
MULTIBOOT_AOUT_KLUDGE equ 1<<16
MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_AOUT_KLUDGE
CHECKSUM equ -(0x1BADB002 + MULTIBOOT_HEADER_FLAGS)
ALIGN 4
MultibootHeader:
DD 0x1BADB002
DD MULTIBOOT_HEADER_FLAGS
DD CHECKSUM
DD MultibootHeader
DD 0x00100000
DD 0x00200000
DD 0x00200000
DD Start
Start:
CALL _start
JMP $
GRUB akzeptiert das nicht. Ich müsste noch irgendetwas bei der Data-Section ändern, weiss aber nicht was.
-
Link deinen Kernel einfach zu einer ELF Datei, dann kannst du dir die Addressen und Offsets im Multibootheader sparen, und brauchst nur Magic, Flags und Checksum.
-
Mein Linker unterstützt ELF nicht. :(
Edit:
Es ist jetzt gegangen, ich musste nur die Grösse der Daten im Multiboot-Header ändern. Ich weiss aber nicht, wie ich das eintragen soll, ich weiss ja erst nach dem Kompilieren, wie gross die BIN wird...
Edit:
Ich habe jetzt eifach am Schluss eine ASM dazugelinkt, die nur ein Symbol hat. Dessen Adresse wird dann eingetragen. Total unelegant. Sorry für den blöden Thread, ich hasse diese Linkerfiles eifach...;)
Edit:
Wieso funktioniert das nicht? :(
link.txt
OUTPUT_FORMAT("binary")
SECTIONS
{
. = 0x100000;
.text : { *(.text) }
.data : { *(.data) }
.bss : { *(.bss) }
Ending = SIZEOF(.text+.data);
}
INPUT(start1.o start2.o text.o)
.asm (Auszug)
DD Ending
-
Kann mir jmd. vielleicht nen link zu nem tutorial geben wo beschrieben wird wie man einen grub kompatiblen kernel schreibt?
-
Tut hab ich nicht, aber Docs und ne Wiki zu GRUB:
http://www.gnu.org/software/grub/manual/html_node/
http://grub.enbug.org/FrontPage