Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: OsDevNewbie 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.
-
Hallo und Willkommen im Forum,
Bootloader mit GAS habe ich noch nicht geschrieben, aber versuch mal damit:
.fill … (http://sourceware.org/binutils/docs-2.17/as/Fill.htm) und .code16 (http://sourceware.org/binutils/docs-2.17/as/i386_002d16bit.html)
--
HINWEIS: Eigener Bootloader
-
Hallo,
mit GAS sollte ein ".balign 510" helfen.
Den Hinweis auf eigene Bootloader wiederhole ich.
Gruß,
Svenska
-
Hallo,
danke für die schnellen Antworten. Und wie sage ich dem C-Compiler, dass er 16-Bit Code erzeugen soll?
-
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 (http://www.lowlevel.eu/wiki/OS-Dev_f%C3%BCr_Einsteiger) gesehen?
-
Danke vielmals,
wie würdest du ein 16-Bit Kernel auf einem 64-Bit Linux übersetzen?
-
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.
-
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?
-
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.
-
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.
-
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