Autor Thema: Bootloader mit gcc  (Gelesen 4156 mal)

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« am: 05. February 2012, 19:06 »
Hallo,
ich bin neu hier und habe schon meine erste Frage.
Ich habe einen Bootloader geschrieben und versuche ihn mit gcc unter Debian zu assemblieren. Im Wiki wird nur der Befehl zum Auffüllen auf 512 Bytes nur für NASM erklärt und ich suche schon lange den Ersatz des Befehls times 512-($-$$)-2 db 0 für den gcc-Assembler. Meine zweite Frage ist wie ich dem Assembler sagen kann, dass er 16-Bit Code erzeugen soll?
Danke schon im Voraus.
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 05. February 2012, 20:46 »
Hallo und Willkommen im Forum,

Bootloader mit GAS habe ich noch nicht geschrieben, aber versuch mal damit:
 .fill … und .code16

--
HINWEIS: Eigener Bootloader
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 05. February 2012, 22:56 »
Hallo,

mit GAS sollte ein ".balign 510" helfen.
Den Hinweis auf eigene Bootloader wiederhole ich.

Gruß,
Svenska

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #3 am: 05. February 2012, 23:58 »
Hallo,
danke für die schnellen Antworten. Und wie sage ich dem C-Compiler, dass er 16-Bit Code erzeugen soll?
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 06. February 2012, 00:55 »
Der GCC ist nicht wirklich dafür geeignet 16-Bit Code zu erzeugen. Um dein OS in 16-Bit C zu schreiben, müsstest du einen DOS-Compiler missbrauchen. Ich würde dir raten, das nicht zu versuchen.

Wenn du offen für Alternativen bist: Hast du schon unsere Tutorialreihe gesehen?
« Letzte Änderung: 06. February 2012, 00:57 von Jidder »
Dieser Text wird unter jedem Beitrag angezeigt.

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #5 am: 06. February 2012, 01:29 »
Danke vielmals,
wie würdest du ein 16-Bit Kernel auf einem 64-Bit Linux übersetzen?
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 06. February 2012, 07:45 »
Danke vielmals,
wie würdest du ein 16-Bit Kernel auf einem 64-Bit Linux übersetzen?
Abgesehen davon das ich das nie tun wollte: wenn schon Real-Mode dann komplett in Assembler.

Seit ich ein 64-Bit System habe interessiert mich nicht mal mehr der Protected-Mode. Ich wechsle so schnell wie möglich in den Long-Mode und vergesse das meine CPU überflüssiger weise noch 286er kompatibel ist.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

Dimension

  • Beiträge: 155
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 06. February 2012, 07:52 »
Generell ist der "eigene Bootloader" für das erste eigene OS eine unverhältnismäßig schwierige Angelegenheit und deshalb keine gute Idee. Hier würde ich GRUB empfehlen.

Wenn du erst etwas Erfahrung im 16-Bit Real-Mode sammeln willst, nimm NASM. Ich vermute, du kennst bereits Bochs und Qemu?

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 06. February 2012, 10:02 »
Wenn schon eigener Bootloader, dann würde ich nur einen kleinen Stub als 16-Bit-RM-Code schreiben (und das eben in Assembler) und den Hauptteil im Protected Mode (und in C) erledigen. Ein anstängier Bootloader muss sowieso mit mehr als einem MB Speicher zurechtkommen.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #9 am: 06. February 2012, 10:27 »
Mein Bootloader ist eigentlich schon fertiggestellt und hoffentlich funktionstüchtig. Ich habe auch vor so schnell wie möglich in den x86-64 Modus zu wechseln, nur wollte ich halt klein anfangen und erstmal ein Hello World! ausgeben.
Danke für den Hinweis mit Grub, aber braucht man da nicht ein Dateisystem das von ihm unterstützt wird? Ich habe gelesen, dass man mithilfe von Grub auch einzelne Sektoren auslesen kann, aber woher weiss ich wie grosss der Kernel ist?
Danke für eure zahlreichen Antworten.
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 06. February 2012, 14:19 »
Hallo,

wenn du 16-Bit Code mit C erzeugen möchtest, kannst du bcc und bin86 verwenden. Davon ist aber abzuraten.

Mein Bootloader ist eigentlich schon fertiggestellt und hoffentlich funktionstüchtig. Ich habe auch vor so schnell wie möglich in den x86-64 Modus zu wechseln, nur wollte ich halt klein anfangen und erstmal ein Hello World! ausgeben.
Dann nimm das ernst, was wir alle gemeinsam sagen: Schreibe keinen Bootloader, sondern einen (Multiboot-kompatiblen) Kernel.

Danke für den Hinweis mit Grub, aber braucht man da nicht ein Dateisystem das von ihm unterstützt wird?
Ja. Du kopierst also die Kerneldatei z.B. auf eine Diskette und Grub macht den Rest. Dazu muss dein Kernel kein Dateisystem und keine Diskettenlaufwerke können. Du kannst auch "qemu -kernel Kerneldatei" benutzen, um einen Multibootkernel zu starten. Das geht dann ganz ohne Grub.

Ich habe gelesen, dass man mithilfe von Grub auch einzelne Sektoren auslesen kann, aber woher weiss ich wie grosss der Kernel ist?
Das gleiche Problem hast du mit deinem eigenen Bootloader auch.
(a) Du analysierst den Kernel, während du ihn lädst und errechnest die Größe.
(b) Du sagst, dass der Kernel niemals größer als z.B. 4 Sektoren ist und lädst nur die.
(c) Du machst hinten an deinen Kernel eine Ende-Markierung.

Lass den Bootloader sein und spiele einmal die Tutorialreihe durch (ist zwar nur für den 32-Bit-Modus, aber da werden die wichtigen Dinge alle mal kurz behandelt). Dann siehst du auch, wie das mit Multiboot und Grub funktioniert.

Gruß,
Svenska

 

Einloggen