Sviluppo del sistema operativo in domande C ++

9

Come progetto di un Master, sto progettando un semplice sistema operativo. È progettato per funzionare in modalità Real a 16 bit su un'architettura x86. Idealmente, mi piacerebbe sviluppare questo sistema operativo in C ++ e utilizzare solo l'assembly, laddove 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'utilizzo di C ++. A partire da ora, ha compilato e può essere eseguito, ma non ho usato alcuna allocazione di memoria dinamica.

Se stavo usando C, avrebbe senso scrivere funzioni malloc che gestissero l'allocazione della memoria, ma in C ++ viene usata la nuova parola chiave. Quindi ...

In che modo "nuovo" funziona dietro le quinte per allocare memoria e come dovrei gestirlo?

E come corollario ...

Ha senso cercare di usare C ++ per sfruttare le sue astrazioni di livello più alto? O sarebbe più un mal di testa usarlo e dovrei rimanere con C?

Fornisci spiegazioni logiche se ritieni che C ++ non sia una buona scelta.

    
posta bunglestink 23.05.2011 - 16:49
fonte

4 risposte

9

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

Certamente ha senso usare C ++ per certe astrazioni. Non c'è alcun motivo per cui un sistema operativo deve rollare il proprio std::list<> . Le eccezioni sono molto più problematiche. In mezzo c'è una sfumatura da utile a roba inutile. %codice% ? Funziona perfettamente, ma perché ne avresti bisogno?

    
risposta data 23.05.2011 - 17:05
fonte
5

Molti dei vantaggi di C ++ su C non hanno nulla a che fare con il supporto di runtime, e in questi casi non c'è davvero differenza tra codice scritto in C e codice scritto in C ++. I modelli, per esempio, non fanno nulla in fase di runtime. Non fanno nulla che non potresti fare con un sacco di digitazione extra. C ++ è un linguaggio molto ragionevole per scrivere i sistemi operativi in quanto fornisce un accesso di basso livello quando ne hai bisogno, combinato con astrazioni di livello superiore rispetto a C quando non hai bisogno di concentrarti sul bit-twing.

new fa due cose: riceve la memoria da qualche parte e esegue tutti i costruttori necessari. Nell'ottenere la memoria, non è diverso da malloc .

    
risposta data 23.05.2011 - 18:50
fonte
3

Forse sarebbe ragionevole dare una vaga idea del codice che viene normalmente generato per un'espressione new . È generato dal compilatore, ma se lo stavi implementando come 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 funziona new , il (quasi) inevitabile follow-up è come funziona delete :

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

Come altri hanno già sottolineato, ::operator new e ::operator delete sono allocatori di memoria piuttosto semplici. Ad esempio, su un sistema simile a Unix probabilmente chiamerebbero qualcosa come brk o sbrk per allocare grandi blocchi di memoria, e quindi distribuire pezzi più piccoli da quei grandi blocchi. Nel tuo sistema operativo, probabilmente vorrai ancora una sorta di analogico a sbrk e simili - qualcosa che inizia essenzialmente con tutta la memoria come "libero" e assegna pezzi di memoria se necessario. Dato che stai lavorando in modalità reale, probabilmente sarà abbastanza semplice - data la piccola quantità di memoria disponibile, un design pratico ha quasi bisogno di enfatizzare le dimensioni ridotte rispetto ad algoritmi elaborati.

    
risposta data 23.05.2011 - 20:46
fonte
-4

La maggior parte dei sistemi operativi sono scritti in C credo. D'altra parte è un progetto di master, quindi fai qualcosa di diverso e interessante.

    
risposta data 23.05.2011 - 18:33
fonte

Leggi altre domande sui tag