etalon Geschrieben 30. Mai 2005 Geschrieben 30. Mai 2005 Hallo, ich brauche einen Bootmanager der in CPP geschrieben ist. Der Bootmanager muss auf einer Diskette liegen und mir den MBR auslesen. Anschließend soll er die aktive Partition festlegen können. Hat jemand von euch vielleicht ein wenig Code oder vielleicht ein paar Tipps für die Programmierung? :floet: Zitieren
Timon Geschrieben 30. Mai 2005 Geschrieben 30. Mai 2005 Also Bootlader kann ich dir keinen anbieten. Aber ich denke du wirst auf jeden Fall einen Native x86 Compiler brauchen. Zitieren
etalon Geschrieben 30. Mai 2005 Autor Geschrieben 30. Mai 2005 Hast eine PN mit meiner E-Mail. Danke schonmal. Falls jemand natürlich noch einen kompletten BM in CPP mit Quellcode hat, wär das natürlich noch besser *g* Zitieren
Guybrush Threepwood Geschrieben 31. Mai 2005 Geschrieben 31. Mai 2005 Hmm vielleicht sollte man diesen Thread mal zusammen mit einem der "Wie programmiere ich mein eigenes Betriebssystem" oben anpinnen. Die kommen ja doch immer wieder... :hells: Zitieren
etalon Geschrieben 31. Mai 2005 Autor Geschrieben 31. Mai 2005 Hmm.. naja Also ich brauch ja eigentlich nur einen Bootmanager den man auf Diskette packen kann und der einem "nur" den MBR umschreibt. Wär dafür dass der Thread eigenständig bleibt Zitieren
Guybrush Threepwood Geschrieben 1. Juni 2005 Geschrieben 1. Juni 2005 Wozu brauchst du dann den Quellcode und warum muss er in C++ geschrieben sein? Bei google solltest du dutzende finden. Zitieren
Bubble Geschrieben 1. Juni 2005 Geschrieben 1. Juni 2005 Du wirst keine Lösung in C++ finden. Es ginge vielleicht in C, aber ohne die C-Library zu verwenden und zusätzlich bräuchtest Du noch anderen Start-Code, als er beispielsweise für Windows oder Linux verwendet wird, da kein OS verfügbar ist. Ob es ganz ohne Assembler möglich wäre, kann ich Dir allerdings auch nicht sagen. Zitieren
Guybrush Threepwood Geschrieben 1. Juni 2005 Geschrieben 1. Juni 2005 Rein C++ geht sicherlich nicht da, aber ob man die C Teile nicht auch mit C++ realisieren kann weiß ich nicht. Ich hab bisher auf jeden Fall noch keinen gesehen wo die Grundbausteine nicht in Assembler verfasst waren. Ich weiß auch nicht ob man das in irgendeiner anderen Sprache machen kann, denke aber das es keinen Sinn machen würde. Zitieren
etalon Geschrieben 2. Juni 2005 Autor Geschrieben 2. Juni 2005 Im Netz gibt es Programme die heißen GETSECT und SETSECT. Mit diesen kann man den MBR auslesen. Diese Programme müsste man dann entsprechend im C++ Programm aufrufen... Zitieren
Klotzkopp Geschrieben 2. Juni 2005 Geschrieben 2. Juni 2005 Im Netz gibt es Programme die heißen GETSECT und SETSECT. Mit diesen kann man den MBR auslesen. Diese Programme müsste man dann entsprechend im C++ Programm aufrufen...Um Programme aufzurufen, brauchst du ein Betriebssystem. Das hast du bei einem Bootmanager nicht. Du solltest dich an den Gedanken gewöhnen, dass das vielleicht nicht so einfach geht, wie du dir das vorstellst. Zitieren
etalon Geschrieben 3. Juni 2005 Autor Geschrieben 3. Juni 2005 Also ich denke dass man ein paar Systemdateien benötigt um diesen Bootmanager aufzurufen. Zitieren
Crush Geschrieben 3. Juni 2005 Geschrieben 3. Juni 2005 Es geht aus bestimmten Gründen nicht in C++: 1.) Der Bootsector-Code muß auf Adresse 0x7c00h adressiert sein (Inititalisieren der Adresszeiger) 2.) Es gibt keinen Platz für Libraries, also müssen die Zugriffe auf die Festplatte über das Bios erfolgen (initialisieren von Registern, Aufruf über Interrupts) 3.) Der Bootsector-Code muß insgesamt 512 Bytes groß sein (künstlich darauf gebracht werden) und als letzte Word 0xAA55h als Boot-Signatur enthalten Das sind 3 Punkte, die sowas unter C/C++ oder was auch immer, was nicht Assembler ist, das ganze unmöglich machen! Zitieren
etalon Geschrieben 3. Juni 2005 Autor Geschrieben 3. Juni 2005 Komisch nur dass mein Betriebssystemlehrer das für möglich hält?? Hmmm....werde es aber wohl zwangsläufig mal so probieren müssen... Zitieren
perdian Geschrieben 3. Juni 2005 Geschrieben 3. Juni 2005 Komisch nur dass mein Betriebssystemlehrer das für möglich hält??Na ganz einfach: Dann soll er dir sagen, wie es doch geht. Zitieren
Crush Geschrieben 3. Juni 2005 Geschrieben 3. Juni 2005 Gaaaaanz unmöglich ist das natürlich nicht (also muß ich mal wieder meine eigene Aussage revidieren). Also ein paar Ansätze sind mir da schon noch eingefallen: Mit extremen Tricks kann man das Ziel schon erreichen, aber zuerst muß man wirklich schon unheimlich fortgeschritten sein (will ich sehen, wer das mal kurz macht, was ich nun beschreibe) und etwas Assembler-Ahnung benötigt man wegen der IRQ-Aufrufe schon (siehe Links): Punkt 1 mit der Linker-Option /BASE beim MS Visual Studio (kann bei anderen Linkern anders heißen) kann man die Startadresse des Codes festlegen. Eventuell benötigt man dazu noch die Linker-Option /FIXED, damit der Code nicht woanders realloziert werden kann. Punkt 2 könnte man so hinbekommen: Für sowas gibts beim Studio z.B. die Aufrufkonvention __declspec naked (um derartige Aufrufe selber zu definieren - ist aber trotzdem knallhart und benötigt gute ASM-Kenntnisse um da keinen Fehler zu machen). Oder: Unter C gibt es Int86(), mit dem man in Reg-Unions die Registerinhalte überreichen und zurückerhalten kann. Wie das funktioniert habe ich hier und hier mal gezeigt. Punkt 3 wäre machbar, indem man mit irgendeiner Routine binär die .exe einlädt (einladet, einläd??!?! ****** Rechtschreibung!), auf die entsprechende Länge bringt, das Word zum Schluß reinschreibt und das ganze wieder binär abspeichert. Vielleicht gibts für sowas auch irgendeine Linker-Option, allerdings habe ich da auf anhieb nichts finden können. Oder... man könnte den Linker dazu bewegen das Programm im Tiny-Memory-Model anzulegen, dann würde man mit einem BSS-Segment-Block die restlichen Bytes vom Linker auffüllen lassen können (der dürfte dann direkt hinterm Programmcode angelegt werden müssen. Das Problem mit dem abschließenden Word ist so aber nicht zu lösen denke ich, weil vorher alle DATA-Segmente angelegt und möglichst vom Linker zusammengefaßt werden. int setvect (int nr, void interrupt (*intfkt)() ) würde es ermöglichen, eine eigene Funktion als Interrupt zu setzen und diese dann selber aufzurufen. Das Problem ist, daß C üblicherweise mit dem ASM-Befehl ret Funktionen abschließt und diese aber dann mit iret beendet werden müßte. Das geht aber nur entweder über inline-ASM oder man setzt selber knallhart (ich liebe diesen Ausdruck) im Binärfile an der entsprechenden Code-Position die Bytes so, daß dieser Befehl den ret-Befehl überschreibt (der Opcode ist 0xC3 für near return und 0xCB für far return und iret ist 0xCF). Die neue Dateilänge muß evtl noch irgendwo im Dateiheader eingetragen werden, aber da mach ich mir jetzt keinen Kopf mehr ... Wenn Dein Lehrer so toll ist (was ich als höchst unwahrscheinlich erachte - viele sind nicht ganz so genial wie sie sich gerne geben), dann soll er das mal zusammencoden - dabei darf er aber bitte nichts Fertiges aus dem Internet klauen, sondern selber machen! Gib ihm mal nicht meine Tipps, dann können wir mal schauen, ob er selber drauf kommt oder doch geniale Alternativen kennt. Wenn Dein Lehrer das Programm fertig hat, soll er mir mal bitte den Code zuposten. Den will ich gerne mal sehen =8-) Zitieren
Crush Geschrieben 3. Juni 2005 Geschrieben 3. Juni 2005 Hab noch was vergessen: Das mit dem Auslesen vom MBR und setzen der aktiven Partition kann man komplett mit Bios-Aufrufen abdecken. Ein Betriebssystem ist dafür nicht notwendig, sondern ein Bios. Trotzdem ist alles was man dafür tun muß nicht ganz so einfach. Zitieren
etalon Geschrieben 10. Juni 2005 Autor Geschrieben 10. Juni 2005 Hi, danke crush für deine ausführliche Hilfe. Als ersten Schritt habe ich jetzt erstmal versucht ein CPP-Programm von Diskette zu starten und da habe ich schon Probleme bekommen. Ich habe mir ein DOS 6.x geschnappt, es auf Diskette installiert, die autoexec.bat auf die bm.exe gelinkt und mein System mit Diskette gebootet. Bootet tut das ganze auch, nur erhalte ich die Meldung dass bm.exe auf einem Win32 System gestartet werden muss... (war ja eigentlich klar) Mein BS-Lehrer hat natürlich auch Dateien aufgeschrieben die auf der Diskette sein müssen. Das DOS hat natürlich alle Dateien, aber die Diskette funzt trotzdem nicht. Gibt es einen Workaround? Zitieren
Klotzkopp Geschrieben 10. Juni 2005 Geschrieben 10. Juni 2005 trotzdem nicht. Gibt es einen Workaround?Wenn du Programme für DOS schreiben willst, brauchst du einen Compiler, der solche Programme erstellen kann (16 Bit). Das bringt dich aber einem Bootmanager keinen Schritt näher. Zitieren
etalon Geschrieben 10. Juni 2005 Autor Geschrieben 10. Juni 2005 Wenn du Programme für DOS schreiben willst, brauchst du einen Compiler, der solche Programme erstellen kann (16 Bit). Das bringt dich aber einem Bootmanager keinen Schritt näher. Danke für die Info. Kennst du einen 16Bit-Compiler? Eigentlich bringt mich das schon näher Zitieren
Guybrush Threepwood Geschrieben 10. Juni 2005 Geschrieben 10. Juni 2005 Eigentlich bringt mich das schon näher Nein bringt es nicht. Dann hast du keinen Bootmanager sondern ein Programm das unter DOS läuft. Zitieren
Klotzkopp Geschrieben 10. Juni 2005 Geschrieben 10. Juni 2005 Kennst du einen 16Bit-Compiler?Microsoft Visual C++ 1.0, Borland C Compiler bis 4.52, Turbo C/C++, und die 16bit-Version des DJGPP (Quelle) Eigentlich bringt mich das schon näher Eigentlich nicht. Du hast dann ein Programm für ein anderes Betriebssystem. Du brauchst ein Programm, das ohne Betriebssystem auskommt. Zitieren
etalon Geschrieben 10. Juni 2005 Autor Geschrieben 10. Juni 2005 Microsoft Visual C++ 1.0, Borland C Compiler bis 4.52, Turbo C/C++, und die 16bit-Version des DJGPP (Quelle) Eigentlich nicht. Du hast dann ein Programm für ein anderes Betriebssystem. Du brauchst ein Programm, das ohne Betriebssystem auskommt. Danke für die Hinweise. Also DOS ist doch 16 Bit oder? Das Programm sollte dann doch von Diskette bootbar und ausführbar sein oder nicht? Oder steh ich grad auf dem Schlauch? Zitieren
Monty82 Geschrieben 10. Juni 2005 Geschrieben 10. Juni 2005 Ja, das geht...allerdings ist es dann kein Bootmanager. Zitieren
Timon Geschrieben 10. Juni 2005 Geschrieben 10. Juni 2005 Hi, Ich habe mir ein DOS 6.x geschnappt, es auf Diskette installiert, die autoexec.bat auf die bm.exe gelinkt und mein System mit Diskette gebootet. Bootet tut das ganze auch, nur erhalte ich die Meldung dass bm.exe auf einem Win32 System gestartet werden muss... (war ja eigentlich klar) Mein BS-Lehrer hat natürlich auch Dateien aufgeschrieben die auf der Diskette sein müssen. Das DOS hat natürlich alle Dateien, aber die Diskette funzt trotzdem nicht. Gibt es einen Workaround? Ich glaube langsam du willst garkeinen Bootlader schreiben, sondern nur ein DOS-Utility das den MBR liest? Zitieren
Guybrush Threepwood Geschrieben 10. Juni 2005 Geschrieben 10. Juni 2005 Danke für die Hinweise. Also DOS ist doch 16 Bit oder? Das Programm sollte dann doch von Diskette bootbar und ausführbar sein oder nicht? Oder steh ich grad auf dem Schlauch? Nein ist es nicht. Du kannst es aus einem 16 Bit Dos System aufrufen. Ob du dieses DOS nun von Diskette, Festplatte oder sonst woher bootest ist egal. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.