Sviluppo del sistema operativo in domande C ++


9

Come progetto di un Master, sto progettando un semplice sistema operativo. È stato progettato per funzionare in modalità reale a 16 bit su un'architettura x86. Idealmente, vorrei sviluppare questo sistema operativo in C ++ e usare assembly solo se necessario. Finora, ho un boot loader scritto in assembly, che carica un kernel che è un mix di C ++ e asm. La mia domanda riguarda l'uso del C ++. A partire da ora, è stato compilato e può essere eseguito, ma non ho utilizzato alcuna allocazione dinamica della memoria.

Se usassi C, sarebbe logico scrivere funzioni malloc che gestiscano l'allocazione di memoria, ma in C ++ viene usata la nuova parola chiave. Così...

Come funzionano i "nuovi" dietro le quinte per allocare la memoria e come potrei fare per gestirli?

E come corollario ...

Ha senso provare a usare il C ++ per trarre vantaggio dalle sue astensioni di livello superiore? O sarebbe più un mal di testa usarlo e dovrei rimanere con C?

Fornisci le motivazioni se ritieni che C ++ non sia una buona scelta.

Risposte:


9

La newparola chiave passa l'allocazione effettiva a operator new, che si comporta in modo simile a malloc: ottiene memoria da qualche parte. Il compilatore eseguirà quindi tutta la magia del costruttore. Pertanto, il compilatore C ++ si aspetterà che la libreria di runtime C ++ (o il codice) fornisca un'implementazione di operator new.

Ha certamente senso usare C ++ per certe astrazioni. Non c'è motivo per cui un sistema operativo debba eseguire il proprio rollback std::list<>. Le eccezioni sono molto più problematiche. Nel mezzo c'è una sfumatura da cose utili a cose inutili. std::complex? Funziona perfettamente, ma perché dovresti averne bisogno?


5

Molti dei vantaggi di C ++ su C non hanno nulla a che fare con il supporto di runtime e in quei casi non c'è davvero alcuna differenza tra il codice scritto in C e il codice scritto in C ++. I modelli, ad esempio, non fanno nulla in fase di esecuzione. Non fanno nulla che tu non possa fare con molta digitazione extra. C ++ è un linguaggio molto ragionevole in cui scrivere i sistemi operativi, poiché fornisce un accesso di basso livello quando ne hai bisogno, combinato con astrazioni di livello superiore rispetto a C quando non è necessario concentrarsi sul bit-twiddling.

newfa due cose: ottiene memoria da qualche parte ed esegue tutti i costruttori necessari. Nell'ottenere la memoria, non è diverso da malloc.


3

Forse sarebbe ragionevole dare un'idea approssimativa del codice che normalmente viene generato per newun'espressione. È generato dal compilatore, ma se lo implementassi come una funzione, sarebbe simile a questo:

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

Se ti interessa come newfunziona, il (quasi) inevitabile follow-up è come deletefunziona:

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

Come altri hanno già sottolineato, ::operator newe ::operator deletesono allocatori di memoria piuttosto basilari. Ad esempio, su un sistema simile a Unix probabilmente chiamerebbero qualcosa di simile brko sbrkper allocare grandi blocchi di memoria, e quindi distribuiranno blocchi più piccoli da quei grandi blocchi. Nel tuo sistema operativo, probabilmente vuoi ancora una sorta di analogico sbrke simili - qualcosa che inizia essenzialmente con tutta la memoria come "libera" e alloca pezzi di memoria secondo necessità. Dato che stai lavorando in modalità reale, sarà probabilmente abbastanza semplice - data la piccola quantità di memoria disponibile, un design pratico ha quasi bisogno di enfatizzare le piccole dimensioni rispetto a algoritmi elaborati.


-4

La maggior parte dei sistemi operativi sono scritti in CI think. D'altra parte è un progetto da maestro, quindi fai qualcosa di diverso e interessante.


1
La maggior parte dei sistemi operativi di grandi dimensioni sono stati inizialmente scritti prima che fosse disponibile C ++. Ciò ha limitato la scelta. :-)
Bo Persson,

1
a volte penso che i downvotes siano contagiosi.
Kevin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.