Je suis pas em> essayer de faire une telle chose, mais je me demandais de la curiosité si on pouvait mettre en œuvre un "système d'exploitation entier" (pas nécessairement quelque chose de gros comme Linux ou Microsoft Windows, mais plus un petit système d'exploitation de type DOS) en C et / ou C ++ en utilisant non ou peu d'assemblage. P>
En mettant en œuvre un système d'exploitation, je veux dire faire un système d'exploitation à partir de zéro Démarrage du chargeur de démarrage et du noyau vers les pilotes graphiques (et éventuellement GUI) en C ou C ++. J'ai vu quelques choses de bas niveau en C ++ en accédant à des fonctionnalités de bas niveau via le compilateur. Peut-il être fait pour un système d'exploitation complet? P>
Je ne demande pas si c'est une bonne idée, je demande simplement si c'est même possible à distance? P>
3 Réponses :
obligatoire lien vers le wiki OSDev , qui décrit la plupart des étapes nécessaires à la création d'un système d'exploitation tel que décrit sur x86 / x64. p>
Pour répondre à votre question, il est va être extrêmement difficile / désagréable pour créer le chargeur de démarrage et activer le mode protégé sans avoir recours à au moins une assemblée, mais il peut être réduit au minimum (surtout si vous n'êtes pas vraiment compter en utilisant des choses comme Un grand obstacle (à nouveau sur x86) est que le processeur démarre en mode réel 16 bits, vous avez donc besoin du code 16 bits. Selon cette discussion vous pouvez GCC de générer du code 16 bits , mais vous aurez encore besoin d'une certaine façon à la mémoire de configuration, le code de charge de certains supports de stockage et ainsi de suite, tous ce qui nécessite une interface avec le matériel de manière à la norme C vient pas de notion de (interruptions, ports IO etc.). < / p>
Pour les architectures qui communiquent avec le matériel uniquement par la mémoire mappée IO vous pourriez probablement avec écrit tout sauf le code de démarrage C (qui met en place la pile, initialise les variables et ainsi de suite) en C pur, bien que les exigences de spécifiques routines d'interruption / exception ou portes syscall, etc. peuvent être difficiles à mettre en œuvre impossible de (que vous avez aux registres d'accès CPU spécial). p> __ asm__ ( "lidt% 0 \ n":: "m" (* idt));. code> comme 'ensemble') p>
OTOH, Architectures avec uniquement des E / S MmePed ont tendance à avoir un micrologiciel qui initialise moins de matériel que les bioses PC (dans des cas extrêmes dans des appareils incorporés, vous devrez initialiser le dram et les caches).
Je suppose que vous avez un système d'exploitation pour X86 à l'esprit. Dans ce cas, vous avez besoin d'au moins quelques pages d'assembleur pour configurer le mode protégé et que cela ressemble à cela, et en outre que beaucoup de connaissances de toutes les choses telles que la pagination, les portes d'appel, les bagues, les exceptions, etc. Si vous allez Utilisez une forme d'appels système Vous aurez également besoin de certaines lignes de code d'assemblage pour basculer entre le noyau et le mode d'utilisateurpace. p>
Outre ces choses, le reste d'un système d'exploitation peut facilement être programmé dans C ++, vous aurez besoin d'un environnement d'exécution pour soutenir des éléments comme des membres virtuels et des exceptions, mais aussi loin que je sache que tous peuvent être programmés dans C. p>
Jetez un coup d'oeil à Linux source de noyau , le code d'assembleur le plus important (pour x86) peut être trouvé dans arc / x86 / boot, mais vous remarquerez que même dans ce répertoire, la plupart des fichiers sont écrits dans C. En outre, vous 'LL Trouver quelques lignes d'assemblage dans le répertoire Arch / X86 / noyau pour la manipulation des appels de système et des trucs de ce type. P>
En dehors du répertoire d'arc, il n'y a pratiquement aucun assembleur utilisé (car l'assembleur est spécifique à la machine, que le code spécifique de la machine appartient dans le répertoire d'arc). Même les chauffeurs graphiques n'utilisent pas l'assembleur (Pilote E.G. NVIDIA dans les conducteurs / GPU / DRM / NOUVEAU). P>
Un chargeur de démarrage? Vous voudrez peut-être ignorer ce bit. Par exemple, Linux est souvent démarré par des chargeuses de démarrage non-Linux tels que Uboot . Après tout, une fois le système exécuté, le système d'exploitation sera présent mais pas le chargeur de démarrage, c'est juste là pour obtenir le système d'exploitation approprié en mémoire. P>
Et une fois que vous avez sélectionné un chargeur de démarrage existant décent, le reste est à peu près tout simple. Eh bien, vous devez vous faire face à la mémoire et aux fichiers vous-même; Vous ne pouvez pas compter sur fopen code> évidemment. Mais même un compilateur C ++ a peu de code de génération de problèmes pouvant fonctionner sans support de système d'exploitation. P>
+1 - toujours demandé si c'était possible
Vraiment Début Unix a été écrit en C - sur Dec PDP, vous pouvez obtenir une bande de Bell Labs avec C code C pour le système d'exploitation.
@Schnommus suppose que je ne suis pas le seul à détester le codage dans l'ASM. :RÉ
Oui. Le système OS-9 amélioré Microware a été écrit presque entièrement en C avec quelques pièces d'assembleur où elles sont absolument nécessaires. FYI - OS-9 est un NIX multi-utilisateur très robuste * NIX comme des RTO incorporés.