Autor Thema: Probleme mit Grub  (Gelesen 3335 mal)

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« am: 04. February 2007, 14:32 »
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. :oops: Mein Englisch ist werri bäd. :oops:)

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?
« Letzte Änderung: 05. February 2007, 18:28 von M.Nemo »
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 05. February 2007, 18:35 »
Wenn ich mein kernel noch kleiner mache. Also auf
int c_kernel()
{
 return 0;
}
+
asm code mit multiboot header und call c_kernel

beschränke kann ich auch ohne '-N' linken und Grub läd mein kernel auch ohne zu meckern. Liegt als warscheinlich an dem '-N', weil viel kleiner wird das kernel dadurch nicht.

Warum kann ich mein kernel ohne '-N' nicht linken?
« Letzte Änderung: 16. February 2007, 22:08 von M.Nemo »
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 13. February 2007, 21:36 »
kann mir keiner helfen?
 :?
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 16. February 2007, 22:09 »
Hab jetzt rausgefunden, dass das irgendwie an meinem Yasm liegt. Wenn ich mit NASM assembliere kommt kein fehler und ich kann problemlos linken.

Jetzt Sagt mir grub allerdings:

#13: Invalid or unsupported executable format.
« Letzte Änderung: 16. February 2007, 22:22 von M.Nemo »
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 17. February 2007, 15:59 »
Du musst dafür sorgen, dass der Multibootheader innerhalb der ersten 16 Kilobytes (oder warens 4?) liegt.
Dieser Text wird unter jedem Beitrag angezeigt.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 17. February 2007, 23:24 »
Du musst dafür sorgen, dass der Multibootheader innerhalb der ersten 16 Kilobytes (oder warens 4?) liegt.
Danke, ich hab zwar nicht draufgeachtet aber der Multibootheader war in den ersten 16KB.

Hab aber jetzt den fehler gefunden. Es hat daran gelegen, dass ich die .bss section in die .daten section reingelinkt habe.

so gehts jetzt:
.data : AT(...)
{
 *(.data)
}
.bss : AT (...)
{
 *(.bss)
}
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

 

Einloggen