Développement du système d'exploitation dans les questions C ++

9

En tant que projet de Master, je conçois un système d'exploitation simple. Il est conçu pour fonctionner en mode réel 16 bits sur une architecture x86. Idéalement, je voudrais développer ce système d'exploitation en C ++, et n'utiliser l'assemblage que si nécessaire. Jusqu'à présent, j'ai un chargeur de démarrage écrit en assembleur, qui charge un noyau qui est un mélange de C ++ et asm. Ma question concerne l'utilisation de C ++. Pour l'instant, il a compilé et peut fonctionner, mais je n'ai utilisé aucune allocation de mémoire dynamique.

Si j'utilisais C, il serait logique d'écrire des fonctions malloc qui géreraient l'allocation de mémoire, mais en C ++ le nouveau mot-clé est utilisé. Donc...

Comment le «nouveau» fonctionne-t-il en arrière-plan pour allouer de la mémoire et comment pourrais-je gérer cela?

Et en corollaire ...

Est-il judicieux d'essayer d'utiliser C ++ pour tirer parti de ses abstactions de niveau supérieur? Ou serait-ce plus un mal de tête de l'utiliser et devrais-je m'en tenir à C?

Veuillez fournir une justification si vous pensez que le C ++ ne serait pas un bon choix.

bunglestink
la source

Réponses:

9

Le newmot-clé transmet l'allocation réelle à operator new, qui se comporte plutôt comme malloc: il obtient de la mémoire quelque part. Le compilateur fera alors toute la magie du constructeur. Par conséquent, le compilateur C ++ attendra que la bibliothèque d'exécution C ++ (ou votre code) fournisse une implémentation de operator new.

Il est certainement judicieux d'utiliser C ++ pour certaines abstractions. Il n'y a aucune raison pour qu'un système d'exploitation fonctionne de manière autonome std::list<>. Les exceptions sont beaucoup plus gênantes. Entre les deux, il y a un gradient de choses utiles à inutiles. std::complex? Cela fonctionne parfaitement, mais pourquoi en auriez-vous besoin?

MSalters
la source
5

De nombreux avantages de C ++ sur C n'ont rien à voir avec la prise en charge de l'exécution, et dans ces cas, il n'y a vraiment aucune différence entre le code écrit en C et le code écrit en C ++. Les modèles, par exemple, ne font rien au moment de l'exécution. Ils ne font rien que vous ne pourriez pas faire avec beaucoup de frappe supplémentaire. C ++ est un langage très raisonnable pour écrire des systèmes d'exploitation, car il fournit un accès de bas niveau lorsque vous en avez besoin, combiné à des abstractions de plus haut niveau que C lorsque vous n'avez pas besoin de vous concentrer sur le bit-twiddling.

newfait deux choses: il obtient de la mémoire quelque part et exécute tous les constructeurs nécessaires. En obtenant la mémoire, ce n'est pas différent de malloc.

David Thornley
la source
3

Il serait peut-être raisonnable de donner une idée approximative du code qui est normalement généré pour une newexpression. Il est généré par le compilateur, mais si vous l'implémentiez en tant que fonction, il ressemblerait à ceci:

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

Si vous vous souciez de la façon dont newfonctionne, le suivi (presque) inévitable est de savoir comment deletefonctionne:

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

Comme d'autres l'ont déjà souligné, ::operator newet ::operator deletesont des allocateurs de mémoire assez basiques. Par exemple, sur un système de type Unix, ils appelleraient probablement quelque chose comme brkou sbrkpour allouer de gros morceaux de mémoire, puis distribueraient de plus petits morceaux à partir de ces gros blocs. Dans votre propre système d'exploitation, vous voulez probablement une sorte d'analogue vers sbrket tel - quelque chose qui commence avec essentiellement toute la mémoire comme «libre», et alloue des morceaux de mémoire selon les besoins. Étant donné que vous travaillez en mode réel, ce sera probablement assez simple - étant donné la petite quantité de mémoire disponible, une conception pratique doit presque mettre l'accent sur la petite taille par rapport aux algorithmes élaborés.

Jerry Coffin
la source
-4

La plupart des systèmes d'exploitation sont écrits dans CI think. D'un autre côté, c'est un projet de master, alors faites quelque chose de différent et d'intéressant.

Kevin
la source
1
La plupart des grands systèmes d'exploitation ont été initialement écrits avant que C ++ ne soit disponible. Cela a limité le choix. :-)
Bo Persson
1
parfois je pense que les downvotes sont contagieux.
Kevin