Autor Thema: Archiv in Datei linken  (Gelesen 9696 mal)

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« am: 15. August 2012, 14:31 »
Hallo zusammen,

endlich finde ich mal wieder Zeit an meinem Kernel zu arbeiten.
Wie kann ich eine beliebige Datei in eine Sektion meines Kernels linken?
Ich weiß, dass das mit dem NASM geht, aber den möchte ich nicht verwenden.

Grüße,
rizor
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 15. August 2012, 15:42 »
Im Linkerskript kannst du auch Dateinamen angeben. Ist das, was du meinst? Im Zweifelsfalll einfach mal das ld-Handbuch anschauen.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 16. August 2012, 12:05 »
Das Problem daran ist, dass er die Datei nicht beachtet, da er mit dem Dateiformat nichts anfangen kann.
Es ist ein TAR.
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 16. August 2012, 13:14 »
Du möchtest ein initramfs wie bei Linux implementieren, oder?

Häng doch deine tar-Datei einfach an den Kernel an (mit z.B. 512-Byte-Padding). Wo im Linkerscript dann kernel_end steht, beginnt sie.

Gruß,
Svenska

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 16. August 2012, 13:34 »
Ja, sowas in der Art.
Habe das jetzt durch ein eingebettetes Linker-Skript gemacht.
Ein Skript wandelt das Tar in ein Skript um, dass in den Linker eingebunden wird.
Für die erste Version ist das i.O., auch wenn er etwas lange baut.

Wenn es dann mal komplexer wird, wird das dann auch anders gemacht.
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 16. August 2012, 14:25 »
Du müsstest den Tarball mit objcopy von Binary in eine ELF umwandeln können, die du dann normal mitlinken kannst.

Die andere Frage wäre natürlich, warum du es nicht extern lässt und als Multibootmodul oder so übergibst.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 17. August 2012, 10:29 »
Stimmt, das könnte auch noch funktionieren.
Ich möchte das so machen, damit ich unabhängig vom Bootloader bin.
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 17. August 2012, 11:02 »
Naja, deine Entscheidung. Was ich an initrds unter Linux überhaupt nicht mag ist der Aufwand, sie zu modifizieren. Wenn du sie in den Kernel reinbackst, wird das sicher nicht einfacher. Sprich du kannst dann theoretisch einen Bootloader nehmen, der nix kann (warum sollte man das wollen?), aber dafür ist halt die Usability am Allerwertesten.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 17. August 2012, 11:59 »
Naja, wenn man von vorn herein auf Plattformunabhängigkeit setzt, dann sollte man sich ja nicht auf den Bootloader verlassen.
Außerdem soll es ein System werden, das an sich nichts kann und dann nur durch die Module mit Leben gefüllt wird.
Genau genommen besteht der Kernel nur aus Modulen.
Und da es zu so frühen Stadien keine HDD-Treiber etc. gibt, kommt das alles in die initrd.
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 17. August 2012, 12:24 »
Naja, wenn man von vorn herein auf Plattformunabhängigkeit setzt, dann sollte man sich ja nicht auf den Bootloader verlassen.
Keine Ahnung was du damit meinst, macht für mich jedenfalls keinen Sinn. Wenn du damit meinst, dass man sich nicht an einen bestimmten Bootloader binden will, von mir aus. Aber ein paar mehr Features als ein flache Binary in den Speicher zu laden und anzuspringen sollte man ja schon erwarten können, auf jeder Plattform.

Zitat
Außerdem soll es ein System werden, das an sich nichts kann und dann nur durch die Module mit Leben gefüllt wird.
Genau genommen besteht der Kernel nur aus Modulen.
Und da es zu so frühen Stadien keine HDD-Treiber etc. gibt, kommt das alles in die initrd.
Ich sage nicht, dass du einen Monolithen bauen sollst, sondern dass du einen gescheiten Bootloader nehmen sollst, der im Idealfall die Module einzeln laden kann, oder der wenigstens eine einzige externe initrd laden kann, die nicht in den Kernel eingebaut ist (wie halt bei Linux).
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Dimension

  • Beiträge: 155
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 17. August 2012, 23:55 »
generier ein linkbares Format (wie etwa ELF) oder nimm dd.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 18. August 2012, 15:49 »
Habe ich jetzt auch gemacht.
Bei drei kleineren Modulen dauert der Linkvorgang schon ca. 5 Minuten.
Mit einem Object-File ist es viel schneller.
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 18. August 2012, 18:10 »
Überraschung. ;)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

 

Einloggen