Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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:

Geschrieben

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*

Geschrieben

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 :rolleyes:

Geschrieben

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.

Geschrieben

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.

Geschrieben

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...

Geschrieben
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.

Geschrieben

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!

Geschrieben

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-)

Geschrieben

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.

Geschrieben

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?

Geschrieben
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.
Geschrieben
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 ;)

Geschrieben
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.
Geschrieben
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?

Geschrieben
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?

Geschrieben
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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...