Je suis un étudiant universitaire très ambitieux qui souhaite apprendre à peu près tout ce qu'il y a à savoir sur les ordinateurs (bash moi si vous voulez, j'aime apprendre). Récemment, j'ai pensé que ce serait un projet amusant (quoique long) de concevoir et de construire mon propre noyau.
J'ai obtenu quelques informations de base et j'ai compris que je devais maîtriser Assembly et C / C ++ pour vraiment faire ce travail. Pendant que j'y travaille, j'aimerais savoir COMMENT fonctionne un noyau du point de vue de la programmation. J'ai passé des heures à parcourir le code du noyau linux mais cela ne peut que vous mener jusqu'ici.
Quelles sont les étapes de base de la construction d'un noyau? Choses que vous devez aborder? Commander ou faire des choses? Je sais que je mord beaucoup, mais je suis suffisamment déterminé pour y faire face.
Réponses:
Ce que vous devez faire, c'est concevoir le système d'exploitation. Même si, par exemple, vous décidez qu'il doit s'agir d'un système de type UNIX, il reste encore beaucoup de décisions à prendre. Dans quelle mesure voulez-vous que ce soit UNIX? Quelles parties d'UNIX aimez-vous et lesquelles pensez-vous avoir besoin d'être améliorées?
Si vous n'êtes pas déterminé à ce qu'il ressemble à UNIX, vous vous retrouvez avec encore plus de questions à répondre: les processus devraient-ils former un arbre, ou sont-ils "plats"? Quels types de communication inter-processus souhaitez-vous prendre en charge? Voulez-vous qu'il soit multi-utilisateur, ou simplement multi-tâches (ou éventuellement mono-tâches)? Voulez-vous que ce soit un système en temps réel? Quel degré d'isolement souhaitez-vous assurer entre les tâches? Où voulez-vous qu'il tombe à l'échelle monolithique vs micro-noyau? Dans quelle mesure (le cas échéant) souhaitez-vous qu'il prenne en charge le fonctionnement distribué?
Je conseille généralement contre étudier le noyau Linux pour votre inspiration. Ce n'est rien contre le noyau Linux lui-même, mais un simple fait que Linux est principalement destiné à la production, pas à l'éducation. Il a beaucoup d'optimisation, de hacks de compatibilité descendante, etc., qui sont extrêmement utiles pour la production mais plus susceptibles de distraire que d'éduquer.
Si vous pouvez le trouver, une copie du livre de Lion ( Commentaire des Lions sur UNIX 6e édition , avec code source , par John Lions) est un point de départ beaucoup plus facile. La 6e édition d'UNIX était encore petite et assez simple pour lire et comprendre assez rapidement, sans être un système de jouets trop simplifié.
Si vous prévoyez de cibler le x86 (au moins principalement), vous pouvez également consulter MMURTL V 1.0 de Richard Burgess. Cela présente un système pour le x86 qui utilise le matériel x86 beaucoup plus que les concepteurs de CPU l'ont prévu à l'origine - quelque chose que la plupart des vrais systèmes évitent en faveur de la portabilité vers d'autres CPU. Comme vous pouvez le deviner, cela tend à être orienté beaucoup plus fortement vers la fin matérielle des choses. Les copies imprimées semblent coûteuses et difficiles à trouver, mais vous pouvez télécharger le texte et le code gratuitement.
Heureusement, il existe également quelques possibilités supplémentaires - Conception et mise en œuvre de systèmes d'exploitation , par Andrew Tanenbaum et Albert Woodhull, par exemple.
la source
Je suggérerais de commencer par une petite tâche très ciblée: utiliser l'assemblage, écrire un programme d'amorçage jouet. Cela ne doit pas faire grand-chose. Vous souhaitez simplement que l'ordinateur charge automatiquement le programme au démarrage, imprime un message confirmant qu'il est en cours d'exécution, lit certaines entrées du clavier, imprime un autre message, puis arrêtez l'ordinateur.
Cela aurait plusieurs avantages:
Une fois que vous pouvez le faire, vous aurez une bien meilleure idée de ce dans quoi vous vous embarquez.
la source
Apprendre à programmer dans l'assembleur est un bon premier départ et le faire à partir de MSDOS 6.0 peut également être utile en raison d'un manque de fonctionnalités intégrées.
La lecture d'un bon livre comme Operating System Concepts serait un bon début pour concevoir votre propre noyau. Vous devrez gérer le chargement de démarrage, la gestion des pilotes de périphériques, l'interfaçage avec le BIOS, la création et la gestion du système de fichiers, la planification des programmes, le chargement et le déchargement des programmes, implémenter au moins une sorte de shell (beaucoup plus facile que de construire un système de fenêtrage).
C / C ++ ne fonctionnera que si votre noyau est compatible avec les bibliothèques standard pour ces langages, sinon vous devrez également écrire une copie de ces bibliothèques.
Cela ne commence même pas à penser au multithreading, à la sécurité du système, au réseautage.
la source
Minix est un joli clone Unix (qui a inspiré Linux) qui a été écrit pour l'enseignement.
Andrew S. Tannenbaum est un excellent écrivain et enseignant et a écrit un livre entier sur les systèmes d'exploitation utilisant Minix comme exemple (et inclut le code source à suivre): http://en.wikipedia.org/wiki/Operating_Systems:_Design_and_Implementation
Personnellement, je trouve qu'il est un peu meilleur écrivain que programmeur, donc certaines choses ne sont pas aussi claires que je le souhaiterais personnellement, mais - hé - ça marche!
Je peux fortement recommander d'envisager cela comme une ressource d'apprentissage. Cela vous donnera également une idée de la quantité de travail nécessaire pour produire réellement quelque chose qui peut réellement être utile.
la source
Je l'ai aussi appris. Vous pouvez consulter ces ressources. Ils sont très bons!
http://www.osdever.net/tutorials/index
http://kernelnewbies.org/
Amusez-vous en chemin!
la source