Programm starten ohne Betriebssystem-Boot, wie?



  • Ich hätte da eine Frage an euch, und hoffe, es ist die richtige Kategorie... Wie kann man ein Programm, das auf der Festplatte liegt (oder auch auf einem USB-Stick?), starten, ohne dabei vorher ein Betriebssystem zu starten?

    Zum Beispiel soll man 7 + 7 eingeben können, und daraufhin soll 14 ausgegeben werden. Wie ginge das oder wo könnte man etwas darüber nachlesen?



  • @EinNutzer0 Dann muss der Computer dieses Programm booten.
    Dafür müssen einige Voraussetzungen passen.
    Eine .exe geht nicht, da diese Windows haben möchte.

    Das Stichwort dafür ist Bootsektor Bootloader, z.B. https://de.wikipedia.org/wiki/Bootloader



  • Welche Architektur? x86 mit BIOS?

    Programm schreiben (keine Funktionen irgendeiner Runtime verwenden, Hardware direkt oder über BIOS-Interrupts ansprechen), ein (rohes) 16-bit-Binary daraus basteln (x86-kompatible sind direkt nach dem Boot im Realmode) das auch die nötigen Strukturen für einen Boot-Record an den richtigen Stellen beinhaltet. Dieses Binary in den ersten Sektor des zu verwendenden Mediums schreiben. Dem BIOS verklickern daß es von diesem Medium booten soll. Bios lädt das Programm nach 0x07C0 absolut (Segmentregister vorsichtshalber selbst setzten) und führt es aus.


  • Mod

    Im OS-Entwicklungsforum gibt es Anfängerlinks, die beschreiben, wie man einen Computer dazu bringt, Code auszuführen. Ich behaupte aber mal: Dass du und wie du diese Frage stellst, deutet darauf hin, dass du sehr weit davon entfernt bist, das korrekt umzusetzen.



  • @SeppJ sagte in Programm starten ohne Betriebssystem-Boot, wie?:

    Ich behaupte aber mal: Dass du und wie du diese Frage stellst, deutet darauf hin, dass du sehr weit davon entfernt bist, das korrekt umzusetzen.

    Dem würd ich nicht widersprechen... Ich bräuchte eine Schritt-für-Schritt-Anleitung, bei der ich die Zwischenschritte sogar nachvollziehen kann.

    Sehe ich das denn richtig, dass ich das Programm vorher im Betriebssystem für die Ziel-Architektur (hier wahrscheinlich x86_64) compilieren kann, und dann in den Bootsektor platzieren kann, woraufhin dann mein Programm bootet? Und wahrscheinlich würd dann Windows nicht mehr booten.

    Ich möchte das auch ohne Hilfe des BIOS starten können, damit das wirklich "low-level" wäre...

    Bill Gates hat das bei IBM doch auch hinbekommen. 😃



  • @EinNutzer0 sagte in Programm starten ohne Betriebssystem-Boot, wie?:

    Bill Gates hat das bei IBM doch auch hinbekommen.

    @SeppJ sagte in Programm starten ohne Betriebssystem-Boot, wie?:

    Ich behaupte aber mal: Dass du und wie du diese Frage stellst, deutet darauf hin, dass du sehr weit davon entfernt bist, das korrekt umzusetzen.



  • @EinNutzer0 sagte in Programm starten ohne Betriebssystem-Boot, wie?:

    Bill Gates hat das bei IBM doch auch hinbekommen. 😃

    ich lehne mich jetzt mal ein bisschen aus dem fenster und behaupte, dass das einzige, das bill gates über "sein" betriebssystem weiß, ist, dass es "Windows 10" heißt. mein tipp: kauf dir ein msp430-launchpad, das kostet knapp 35€ und du kannst da auch low-level (ja so richtig mit char *dataptr = 0x0815;, d.h. du kannst da direkt in den speicher schreiben) programmieren. bau dir dein eigenes mainboard mit flash-speicher, parallelport, seriellport, ethernet usw. aber "normale" pc-mainboards von hand programmieren ist einfach zum 🤮 , zumal du gar nicht an die adressen rankommst.


  • Mod

    Warum? Ich glaube du verstehst nicht, was das bedeutet, wonach du fragst. Verstehst du überhaupt, was ein OS überhaupt machen für dein Programm? Sagen wir mal so: Wenn du beispielsweise in C irgendein include aus der Standardbibliothek brauchst, dann ist das zu 99% irgendetwas, dass das Betriebssystem für dich macht. Du kannst nicht einmal Text ausgeben ohne OS, du müsstest das alles selber neu schreiben.

    @EinNutzer0 sagte in Programm starten ohne Betriebssystem-Boot, wie?:

    Ich möchte das auch ohne Hilfe des BIOS starten können, damit das wirklich "low-level" wäre...

    Jetzt redest du noch mehr Unsinn über Dinge, die du nicht verstehst. Ohne BIOS/UEFI bekommst du dein Programm nicht einmal in den Speicher geladen, ohne dass du vorher selber Code dafür schreibst. Und auch die Ausgabefunktionen von oben laufen nicht darauf hinaus, Zeichenketten an das BIOS zu übergeben, sondern selber mit der Grafikkarte zu verhandeln. Und damit ist nicht Anschauliches Setzen von Pixeln gemeint, sondern Verhandlungen darüber führen wie das Gerät überhaupt elektrisch angeschlossen ist.

    (Abgesehen davon, musst du dafür erst deinen eigenen Rechner löten, da ein BIOS/UEFI auf jedem Board fest eingebaut ist)

    Du hast es nicht einmal geschafft, selbstständig den dir gegebenen Links zu folgen…



  • @EinNutzer0 sagte in Programm starten ohne Betriebssystem-Boot, wie?:

    Ich möchte das auch ohne Hilfe des BIOS starten können, damit das wirklich "low-level" wäre...
    Bill Gates hat das bei IBM doch auch hinbekommen.

    Nein hat er nicht. Denn das BIOS lädt den Bootsektor in den Speicher und führt diesen aus.
    Auch stellt es rudimentäre Funktionen für die Ein-/Ausgabe auf Tastatur, Bildschirm (Textmodus), Festplatte zur Verfügung
    BIOS = Basic Input Output System

    Das MS-DOS hat sogar recht viel Gebrauch vom BIOS gemacht.

    @EinNutzer0 sagte in Programm starten ohne Betriebssystem-Boot, wie?:

    und dann in den Bootsektor platzieren kann, woraufhin dann mein Programm bootet? Und wahrscheinlich würd dann Windows nicht mehr booten.

    Es gibt Bootloader, die verschiedene Betriebssysteme (Bootsektoren) laden können. Auch Open Source. Da kannst du dich ja mal umsehen denn es sind die Art von "Programmen" die du suchst (laufen ohne Betriebssystem).



  • @EinNutzer0 sagte in Programm starten ohne Betriebssystem-Boot, wie?:

    Ich bräuchte eine Schritt-für-Schritt-Anleitung, bei der ich die Zwischenschritte sogar nachvollziehen kann.

    Dann viel Glück damit jemand zu finden der dir so eine Schritt-für-Schritt-Anleitung schreibt.


  • Mod

    @hustbaer sagte in Programm starten ohne Betriebssystem-Boot, wie?:

    @EinNutzer0 sagte in Programm starten ohne Betriebssystem-Boot, wie?:

    Ich bräuchte eine Schritt-für-Schritt-Anleitung, bei der ich die Zwischenschritte sogar nachvollziehen kann.

    Dann viel Glück damit jemand zu finden der dir so eine Schritt-für-Schritt-Anleitung schreibt.

    Gibt es ja sogar in den Sticky-Threads im OS-Forum…
    (Hier sollte eigentlich ein Kommentar über Eigeninitiative und Erfolgsaussichten für dieses Projekt folgen, aber ich bekomme ihn nicht formuliert, ohne den TE zu beleidigen)



  • @hustbaer sagte in Programm starten ohne Betriebssystem-Boot, wie?:

    @EinNutzer0 sagte in Programm starten ohne Betriebssystem-Boot, wie?:

    Ich bräuchte eine Schritt-für-Schritt-Anleitung, bei der ich die Zwischenschritte sogar nachvollziehen kann.

    Dann viel Glück damit jemand zu finden der dir so eine Schritt-für-Schritt-Anleitung schreibt.

    Schon gut, wer nicht helfen möchte, muss es auch nicht. Kein Grund, unfreundlich demgegenüber zu werden...



  • @EinNutzer0
    Ich glaube, du bist dir über die Tragweite und Komplexität deiner Frage nicht im Klaren.
    Das ist in etwa die gleiche Kategorie wie "Ich möchte gern Auto bauen, kann mir jemand Schritt für Schritt erklären, was ich da tun muss?" Die Rede ist hier von "Bauen", und nicht von "Zusammenschrauben".



  • @EinNutzer0 sagte in Programm starten ohne Betriebssystem-Boot, wie?:

    Schon gut, wer nicht helfen möchte, muss es auch nicht. Kein Grund, unfreundlich demgegenüber zu werden...

    Rezept mit Mengenangaben: Writing an x86 "Hello world" bootloader with assembly



  • @EinNutzer0 Ja, es geht um das was @DocShoe geschrieben hat. Gut, ein Auto von Grund auf zu bauen ist mehr Aufwand als ein selbst bootendes Programm das zwei Zahlen einlesen, addieren und das Ergebnis wieder ausgeben kann. Aber einiges an Arbeit ist es trotzdem. Und es erfordert halt einiges an Kenntnissen. Das nach einer einfachen "Java für Dummies in 21 Tagen" Anleitung Schritt für Schritt abzuarbeiten bringt dir auch nichts. Wenn du weiter in dem Bereich tätig sein willst dann musst du dir das Hintergrundwissen sowieso erarbeiten. Und wenn nicht, wieso willst du es dann machen? Und wenn die Antwort darauf "aus Spass an der Sache" ist, na dann mach mal. Aber selber. Erwartet dir nicht dass dir jemand so spezielles und auch gar nicht triviales "Spass an der Sache" Projekt vorkaut.

    Hier meine Schritt für Schritt Anleitung für dich:

    • Entscheide dich für BIOS vs. UEFI. BIOS ist veraltet, dafür aber relativ einfach. Wie aufwendig es mit UEFI wird kann ich nicht sagen. Mag sein dass es sogar einfacher ist, mag sein dass es viel schwieriger ist.
    • Google dir raus wie man Bootcode für den Firmware-Standard deiner Wahl schreibt.
    • Lern die Sprache mit der du das machen kannst (bei BIOS geht quasi nur Assembler).
    • Schreib das 7 + 7 Programm.
    • Google dir raus wie man den Bootcode auf einen Datenträger bekommt so dass man mit dem Firmware-Standard deiner Wahl davon booten kann.
    • L1: Übersetze den Bootcode, schreib ihn auf den Datenträger und boote davon.
    • Google dir raus wie man Bootcode debuggen kann damit du den den Crash/Fehler den du gerade erlebt hast finden und beheben kannst.
    • Beheb den Fehler.
    • Goto L1

    Tip: Um bei dem ganzen Prozess nicht irre zu werden verwende zum Testen eine Virtual-Machine. Also VirtualBox, Hyper-V, VMware Player - irgendsowas.

    Und nochwas: Das 7 + 7 Programm sollte noch relativ einfach sein, weil du es komplett im Bootcode unterbringen kannst. Sobald du mit dem Bootcode nicht mehr auskommst, wird es allerdings ungleich viel schwerer.



  • Noch ein Tip: Sowas debuggt man am besten mit printf Debugging. Ein Emulator/Hypervisor mit eingebautem Debugger ala QEMU wäre auch eine Möglichkeit. Und für Härtefälle kann man die VGA Farbregister verwenden. Evtl. auch IO port 80, falls man einen Emulator/Hypervisor hat der "POST codes" anzeigen kann.



  • @hustbaer sagte in Programm starten ohne Betriebssystem-Boot, wie?:

    BIOS ist veraltet, dafür aber relativ einfach. Wie aufwendig es mit UEFI wird kann ich nicht sagen.

    Das sollte doch so einen Legacy Modus haben. In dem sollten die BIOS Interrupts gehen.



  • Ja, eh, den Legacy-Modus meine ich ja wenn ich "BIOS" schreibe. Reines BIOS hat je quasi kein aktuelles Mainboard mehr.

    Ich weiss aber nichtmal ob das noch alle aktuellen Boards können. Vermutlich. Aber dann ist gleich die nächste Frage: wie lange noch.



  • @hustbaer sagte in Programm starten ohne Betriebssystem-Boot, wie?:

    Wie aufwendig es mit UEFI wird kann ich nicht sagen. Mag sein dass es sogar einfacher ist, mag sein dass es viel schwieriger ist.

    UEFI ist recht nah an der Vorstellung von EinNutzer0. Es wird ein PE Executable von einer FAT32 Partition geladen und gestartet. Man hat zwar immer noch auf die Standardbibliothek verzichten, aber nicht mehr mit rohen Binaries arbeiten.


  • Mod

    @Tobiking2 sagte in Programm starten ohne Betriebssystem-Boot, wie?:

    @hustbaer sagte in Programm starten ohne Betriebssystem-Boot, wie?:

    Wie aufwendig es mit UEFI wird kann ich nicht sagen. Mag sein dass es sogar einfacher ist, mag sein dass es viel schwieriger ist.

    UEFI ist recht nah an der Vorstellung von EinNutzer0.

    Naja, EinNutzer0 hat ganz explizit danach gefragt, wie das denn ohne BIOS ginge. Das ist in der Analogie nicht nur das Auto selber bauen, sondern mit Steinzeitmitteln angefangen sich ohne Hilfe den gesamten Technologiebaum hocharbeiten, bis man selber Aluminiumbleche formen kann, selber Gummi pressen kann, und selbst Benzin raffinieren kann.

    Es ist dann sogar praktisch noch eine Stufe schlimmer, da man im normalen Handel gar keine Hardware ohne jedes BIOS finden wird, man sich also erst einmal Spezialhardware besorgen muss, auf der man eigene Firmware flashen kann. Also quasi auch noch die Straße für das selbstgemachte Auto bauen.


Log in to reply