hallo,
ich habe mich dazu entschieden für den Anfang Grub zum laden meines Kernels zu benutzen, weil, wie ich hier so oft gelesen habe das soviel einfacher sein soll. Am liebsten würde ich Grub einfach mein kernel im Binärformat(Kein ELF, etc.) übergeben und ihm sagen wo ich es hinhaben will. Da ich aber nichts darüber gefunden habe wie das geht, bzw. dass das geht hab ich es halt mit einem ELF-Kernel probiert. Doch beim linken gab es schon die ersten Fehler:
ld: kernel.sys: Not enough room for program headers, try linking with -N
ld: final link failed: Bad value
Naja. Mit dem Parameter -N konnte ich es dann linken. (Aber was -N bewirkt hab ich nicht verstanden.
Mein Englisch ist werri bäd.
)
Ich hab das kernel auf (Lost-)Grub-Image geschoben hab die menu.lst angepasst("kernel /kernel.sys") und mit Bochs gebootet.
Das ganze hab ich meht mals mit verschieden gelinkten Kernels probiert und es gab volgende fehler:
1.
----
linkscript
...
6 physical = 0x00100000;
7 logical = 0x00000000;
...
fehler:
#7 Loading below 1MB is not supported
2.
----
linkscript
...
6 physical = 0x00100000;
7 logical = 0x00100000;
...
fehler:
#28 Selectet Item cannot fit into memory.
Mein komplettes Linkscript sieht so aus:
1 INPUT(main_asm.o init.o video.o)
2 OUTPUT(kernel.sys)
3 OUTPUT_FORMAT(elf32-i386)
4 ENTRY(main)
5
6 physical = 0x00100000;
7 logical = 0x00100000;
8 SECTIONS
9 {
10 .text logical : AT(physical)
11 {
12 code = .;
13 *(.text)
14 . = ALIGN(4096);
15 }
16 .data : AT(physical + (data - code))
17 {
18 data = .;
19 *(.data)
20 . = ALIGN(4096);
21 *(.bss)
22 }
23 kernel_end = .;
24 }
zu 1.
Ist das ein bochs fehler? der soll mein kernel doch nach 1mb laden das andere ist doch nur die virtuelle adresse!
zu 2.
In der .bochsrc hab ich 32mb ram eingestellt und mein kernel is gerade ma 9,4kb größ.
Könnt ihr mir sagen was ich falsch mache?
Liegt das vieleicht am parameter '-N' den ich zum linken benutzen muss?