OS-Entwicklung in C ++ Fragen

9

Als Masterprojekt entwerfe ich ein einfaches Betriebssystem. Es wurde für die Ausführung im 16-Bit-Real-Modus auf einer x86-Architektur entwickelt. Idealerweise möchte ich dieses Betriebssystem in C ++ entwickeln und nur bei Bedarf Assembly verwenden. Bisher habe ich einen Bootloader in Assembly geschrieben, der einen Kernel lädt, der eine Mischung aus C ++ und asm ist. Meine Frage bezieht sich auf die Verwendung von C ++. Bis jetzt wurde es kompiliert und kann ausgeführt werden, aber ich habe keine dynamische Speicherzuordnung verwendet.

Wenn ich C verwenden würde, wäre es sinnvoll, Malloc-Funktionen zu schreiben, die die Speicherzuweisung übernehmen, aber in C ++ wird das neue Schlüsselwort verwendet. So...

Wie funktioniert 'neu' hinter den Kulissen, um Speicher zuzuweisen, und wie würde ich damit umgehen?

Und als Folge ...

Ist es sinnvoll, C ++ zu verwenden, um die Abstinenz auf höherer Ebene zu nutzen? Oder wäre es eher ein Kopfschmerz, es zu benutzen und sollte ich bei C bleiben?

Bitte begründen Sie, wenn Sie der Meinung sind, dass C ++ keine gute Wahl ist.

Mistkerl
quelle

Antworten:

9

Das newSchlüsselwort übergibt die eigentliche Zuordnung an operator new, was sich ziemlich ähnlich verhält malloc: Es erhält Speicher von irgendwoher. Der Compiler erledigt dann die gesamte Konstruktormagie. Daher erwartet der C ++ - Compiler, dass die C ++ - Laufzeitbibliothek (oder Ihr Code) eine Implementierung von bereitstellt operator new.

Es ist sicherlich sinnvoll, C ++ für bestimmte Abstraktionen zu verwenden. Es gibt keinen Grund, warum ein Betriebssystem sein eigenes rollen sollte std::list<>. Ausnahmen sind weitaus problematischer. Dazwischen gibt es einen Gradienten von nützlichem zu nutzlosem Zeug. std::complex? Es funktioniert perfekt, aber warum brauchen Sie es?

MSalters
quelle
5

Viele der Vorteile von C ++ gegenüber C haben nichts mit Laufzeitunterstützung zu tun, und in diesen Fällen gibt es wirklich keinen Unterschied zwischen in C geschriebenem Code und in C ++ geschriebenem Code. Vorlagen tun beispielsweise zur Laufzeit nichts. Sie tun nichts, was Sie mit viel zusätzlicher Eingabe nicht tun könnten. C ++ ist eine sehr vernünftige Sprache zum Schreiben von Betriebssystemen, da es bei Bedarf Zugriff auf niedriger Ebene bietet, kombiniert mit Abstraktionen auf höherer Ebene als C, wenn Sie sich nicht auf das Bit-Twiddling konzentrieren müssen.

newmacht zwei Dinge: Es bekommt Speicher von irgendwoher und es führt alle notwendigen Konstruktoren aus. Wenn man die Erinnerung bekommt, unterscheidet es sich nicht von malloc.

David Thornley
quelle
3

Vielleicht wäre es vernünftig, eine grobe Vorstellung von dem Code zu geben, der normalerweise für einen newAusdruck generiert wird . Es wird vom Compiler generiert, aber wenn Sie es als Funktion implementieren würden, würde es ungefähr so ​​aussehen:

template <class T>
T *new_object() { 
    void *raw_data = ::operator new(sizeof(T));
    return new(raw_data) T;
}

Wenn Sie sich dafür interessieren, wie es newfunktioniert, ist das (fast) unvermeidliche Follow-up, wie es deletefunktioniert:

template <class T>
void delete_object(T const *object) { 
    object->~T();
    ::operator delete(object);
}

Wie andere bereits betont haben ::operator newund ::operator deleteziemlich einfache Speicherzuordnungen sind. Auf einem Unix-ähnlichen System würden sie beispielsweise wahrscheinlich so etwas wie brkoder nennen sbrk, um große Speicherblöcke zuzuweisen, und dann kleinere Blöcke aus diesen großen Blöcken verteilen. In Ihrem eigenen Betriebssystem möchten Sie wahrscheinlich immer noch eine Art Analogon sbrkund dergleichen - etwas, das im Wesentlichen mit dem gesamten Speicher als "frei" beginnt und nach Bedarf Speicherteile zuweist. Angesichts der Tatsache, dass Sie im Real-Modus arbeiten, ist dies wahrscheinlich recht einfach. Angesichts des geringen verfügbaren Arbeitsspeichers muss ein praktisches Design die geringe Größe gegenüber aufwändigen Algorithmen fast hervorheben.

Jerry Sarg
quelle
-4

Die meisten Betriebssysteme sind in CI think geschrieben. Auf der anderen Seite ist es ein Masterprojekt, also mach etwas anderes und interessantes.

Kevin
quelle
1
Die meisten großen Betriebssysteme wurden ursprünglich geschrieben, bevor C ++ verfügbar war. Das begrenzte die Auswahl. :-)
Bo Persson
1
manchmal denke ich, dass Abstimmungen ansteckend sind.
Kevin