Cela pourrait être en vain, car je sais qu'écrire un système d'exploitation est insupportablement compliqué (surtout par soi-même).
Je ne m'attends pas à construire le prochain Linux ou Windows.
Je sais que ce sera horrible, bogué et ne fonctionnera pas, mais c'est bien.
Je veux tout écrire moi-même, en Assembly , C et (un peu) C ++ .
C'est un projet futur, car je suis occupé avec d'autres choses pour le moment et je n'ai pas le temps immédiatement, mais j'ai pensé que je le poserais maintenant, alors peut-être que je pourrais obtenir beaucoup de réponses à cela, et cela pourrait construire et être une ressource utile pour ce type d'approche (tout le reste que j'ai vu impliquait de construire à partir de minix, en utilisant un chargeur de démarrage existant, en le construisant dans un programme de démarrage virtuel, etc.).
Je souhaite configurer l'un de mes anciens ordinateurs de bureau avec un écran, un clavier et une souris, et commencer à travailler sur un disque dur vierge .
Je veux apprendre à écrire mon propre chargeur de démarrage (j'ai trouvé beaucoup de ressources à ce sujet, mais par souci d'exhaustivité, veuillez toujours en ajouter de bonnes), mon propre pilote USB (si nécessaire), un pilote de CD (si nécessaire) ), etc. Tout, de A à Z.
Comment mettre le code sur l'ordinateur? Est-il préférable de le faire avec une disquette? La plupart des ordinateurs peuvent-ils le faire à partir d'une clé USB?
De quels pilotes ai-je besoin et pouvez-vous suggérer des références pour les construire?
Après la séquence de démarrage - alors quoi? Comment passer en mode protégé, etc.
Comment gérer la mémoire sans l'aide d'un système d'exploitation? Dois-je utiliser les adresses que je veux? Aucune initialisation nécessaire?
Que vais-je sans aucun doute rencontrer qui me déroutera?
Comment puis-je en faire une ligne de commande O / S et une graphique?
Sur quoi repose un O / S graphique? Par exemple, comment pourrais-je faire quelque chose comme, une ligne de commande, avec une police et une image en haut?
Où puis-je lire sur la configuration d'un environnement multitâche? (c'est-à-dire, ayant deux lignes de commande de type graphique fonctionnant côte à côte).
Comment mettre en place une sorte de système de fenêtrage? Comment afficher des graphiques à l'écran une fois que le multitâche simple est configuré?
Croyez-moi, je comprends que c'est un projet très compliqué, et je ne pourrai probablement jamais le terminer ou y écrire quoi que ce soit.
Il y a beaucoup d'autres éléments que je n'ai pas mentionnés, si vous en pensez, n'hésitez pas à les ajouter également.
Veuillez mettre un "sujet" par réponse - par exemple, les pilotes USB, puis peut-être une liste de ressources, de choses à surveiller, etc.
De plus, veuillez ne pas suggérer de construire à partir d'un autre O / S ou d'un code préexistant. Je sais que je lirai beaucoup de code préexistant (comme le noyau Linux, ou des exemples de ressources, des pilotes existants, etc.) mais finalement je veux faire toute l'écriture moi-même. Je sais que je devrais partir de quelque chose d'autre, et il y a beaucoup d'autres questions sur SO à ce sujet que je pourrais lire si je change d'avis et emprunte cette voie. Mais celui-ci consiste à tout faire à partir de zéro.
Des suggestions sur la façon de le rendre graphique? Différents modes vidéo et comment travailler avec eux, etc.?
la source
Réponses:
Tout d'abord. Lisez, lisez, lisez, lisez, lisez. Vous devez avoir une bonne compréhension du fonctionnement du système d'exploitation avant de pouvoir espérer mettre en œuvre le vôtre.
Prenez l'un des livres d'Andrew Tanenbaum sur les systèmes d'exploitation. C'est celui que nous avons utilisé dans ma classe OS à l'université:
Systèmes d'exploitation modernes PDF
Systèmes d'exploitation modernes sur Amazon
Malgré la couverture ridicule, c'est une lecture fantastique, en particulier pour un manuel. Tanenbaum est vraiment un expert dans ce domaine et ses explications sur le fonctionnement du système d'exploitation sous le capot sont claires et faciles à comprendre. Ce livre est principalement de la théorie, mais je crois qu'il a également un livre qui traite davantage de la mise en œuvre. Cependant, je ne l'ai jamais lu, donc je ne peux pas le commenter.
Cela devrait vous aider à améliorer la gestion des processus, la gestion de la mémoire, les systèmes de fichiers et tout ce que votre noyau de système d'exploitation doit faire pour le mettre dans un état amorçable. À partir de là, il s'agit essentiellement d'écrire des pilotes de périphériques pour le matériel que vous devez prendre en charge et d'offrir des implémentations des fonctions de la bibliothèque C pour faire des appels du noyau pour des choses comme l'ouverture de fichiers et de périphériques, la lecture et l'écriture, la transmission de messages entre les processus, etc. .
Renseignez-vous sur l'assemblage x86 (en supposant que vous concevez ceci pour une machine x86). Cela devrait répondre à beaucoup de vos questions concernant le déplacement entre les modes de fonctionnement du processeur.
Si vous avez des connaissances en électronique, il peut être plus facile de commencer par écrire un système d'exploitation pour un périphérique intégré doté d'une documentation abondante, car il sera généralement plus simple qu'un PC x86. J'ai toujours voulu écrire mon propre système d'exploitation, et je commence par écrire un système d'exploitation intégré au micro-noyau pour cette carte de développement de Digilent. Il peut exécuter le processeur MicroBlaze soft-core de Xilinx, qui dispose d'une documentation très complète. Il a également de la RAM, un stockage de données flash, des LED, des commutateurs, des boutons, une sortie VGA, etc. Beaucoup de choses à jouer avec l'écriture de pilotes simples.
L'un des avantages d'un périphérique intégré est également que vous pouvez éviter d'écrire un pilote VGA pendant une longue période. Dans mon cas, la carte de développement Digilent a un UART intégré, je peux donc utiliser efficacement la sortie série comme console pour tout démarrer et démarrer sur une ligne de commande avec un minimum de tracas.
Assurez-vous simplement que tout ce que vous choisissez de cibler dispose d'un compilateur facilement disponible et bien testé. Vous ne pas voulez être écrire un système d' exploitation et un compilateur en même temps.
la source
http://www.osdev.org/ et http://www.osdever.net/
Bienvenue dans le monde du développement OS.
Voir aussi d'autres liens de documentation x86 dans SO x86 tag wiki : manuels Intel et AMD, documentation du compilateur / assembleur et divers guides.
Il suggère également d'utiliser BOCHS ou un autre environnement virtuel pour le débogage, car vous pouvez effectuer une seule étape de votre chargeur de démarrage et examiner les registres.
la source
Je suggérerais de travailler, au moins au début, sur Bochs ou une autre machine virtuelle, la raison étant que vous pouvez l'emporter avec vous où vous voulez, c'est plus facile à déboguer (vous pouvez voir l'état exact du matériel), et si vous ont besoin d'une aide extérieure pour le débogage, ils peuvent utiliser exactement le même «matériel» que vous.
Le conseil le plus utile que j'ai est de vous mettre dans un état où vous pouvez exécuter du code C le plus rapidement possible - c'est-à-dire démarrer, configurer vos tables de descripteurs et arriver à un point où il est sûr d'exécuter le C. compilé. sinon tout le noyau devrait être en C si vous voulez rester sain d'esprit et continuer à travailler dessus. L'assemblage, bien que requis à certains endroits, est fastidieux et a tendance à être difficile à déboguer.
la source
Au niveau le plus bas, le minimum qu'un système d'exploitation doit être capable de faire est de piloter le matériel d'un système d'une manière ou d'une autre et de charger en quelque sorte et d'exécuter une sorte de «code utilisateur». Si vous allez commencer avec un PC, vous devez écrire du code qui peut être chargé par celui-ci à partir d'un appareil ou d'un autre. Les PC plus anciens ont un BIOS dans le micrologiciel qui détermine comment le matériel effectue une certaine initialisation (au moins la vidéo, le clavier et une forme de stockage ou de chargeur de démarrage). (Mise à jour d'octobre 2017: les PC plus récents ont un micrologiciel EFI ou UEFI ... ce qui est en grande partie une différence pédante; ils servent les mêmes objectifs pour cette discussion).
Commencez donc par apprendre les détails de bas niveau sur la façon d'utiliser le BIOS ou un autre micrologiciel sur votre système cible. Autrement dit, apprenez à écrire un programme que le BIOS peut charger et exécuter. Cela finira par se transformer en votre chargeur de démarrage. Commencer petit. Procurez-vous simplement un programme qui imprime: "Hello, Linus" directement à partir du processus de démarrage du firmware (sur une disquette, ou une clé USB, serait un bon début ... ou sur un disque dur si vous le souhaitez).
À partir de là, je recommanderais d'écrire un pilote série très simple ... mettez à jour votre chargeur de démarrage pour initialiser un port série et commencer un téléchargement à partir de là. Ensuite, il peut exécuter le code qu'il extrait. À partir de là, écrivez un peu de bootstrap qui peut écrire sur un autre ensemble de blocs (nous n'avons pas encore implémenté de système de fichiers ... pas même d'analyse de table de partition; donc nous traiterions simplement des plages brutes de blocs sur le disque au début ).
À ce stade, votre chargeur de démarrage devrait être en mesure d'extraire le nouveau code sur la ligne série, de le vider dans une partition (oui, implémenter une gestion de table de partition d'une sorte ... s'il est conforme aux conventions PC standard, c'est à vous de décider à ce stade. ) et exécutez-le.
À partir de là, vous devriez pouvoir travailler sur des fonctionnalités beaucoup plus sophistiquées. A partir de cette base, vous pouvez écrire et compiler un nouveau "noyau" ... redémarrer votre banc d'essai et y faire déployer le nouveau noyau.
(Votre chargeur de démarrage devrait prendre un signal, tel qu'un BREAK sur les lignes de liaison série comme une commande pour ignorer le téléchargement et simplement démarrer l'image existante; et il devrait également gérer un certain délai d'expiration de cette manière).
À partir de là, écrire une couche terminale très simple et un shell de commande? Un système de fichiers? Implémentez des commandes pour télécharger un nouveau contenu exécutable autre que le noyau (fichiers ou objets d'une certaine sorte). Etc.
Naturellement, vous auriez pu commencer avec un pilote de console en utilisant le clavier et la vidéo du PC (le BIOS INT 0x16h et INT 0x10H, respectivement, si je me souviens bien). Cependant, je suggérerais de commencer par un pilote série car vous pouvez ensuite automatiser votre cycle de construction / déploiement / test à partir de tout autre système (fonctionnel) existant. Étant donné que votre nouveau système d'exploitation débutera comme un projet compilé de manière croisée, il sera essentiel pour vous d'avoir une manière rationalisée de gérer cela.
Je ne sais pas jusqu'où vous souhaitez mener votre projet. Un objectif raisonnablement impressionnant serait de parvenir à «l'auto-hébergement». Si vous pouvez créer un assembleur / compilateur simple qui peut vous permettre d'utiliser votre nouveau système d'exploitation pour (re) construire, lier et démarrer dans une version fonctionnelle de votre nouveau système d'exploitation ... alors vous avez atteint cet objectif. (Notez que ce n'est pas une exigence. De nombreux systèmes embarqués ne seront jamais auto-hébergés et il n'y a rien de mal à cela).
la source
Si cela ne vous dérange pas d'utiliser la virtualisation matérielle, il existe un cours (livre + cours + logiciel) qui vous mènera «De Nand à Tetris». Vous créez un système informatique complet entièrement vous-même à partir de la porte NAND électrique (à ces fins atomique et donnée), jusqu'à la construction du système d'exploitation, d'un langage, et enfin au codage d'un jeu simple sur votre machine personnelle.
Je pense que c'est une excellente idée et quelque chose dans lequel je compte bien m'engager bientôt. Le livre est étonnamment bon marché et je pense que le cours est enseigné au MIT. Je ne peux imaginer aucune sensation plus grande que d'avoir la connaissance complète et complète de tout un système que vous avez vous-même construit à partir de zéro.
Lien: http://www1.idc.ac.il/tecs/
la source
Je commencerais petit et j'achèterais un kit de développement intégré 8086 et je développerais un système d'exploitation multitâche à ce sujet. Une fois que vous avez un noyau et que vous êtes familiarisé avec le travail au niveau matériel, vous serez prêt à faire quelque chose de plus difficile.
Construire même un clone DOS d'affichage VGA est une chose assez difficile. Les détails sont énormes. :-)
sujets spécifiques.
Comment mettre le code sur l'ordinateur? Est-il préférable de le faire avec une disquette? La plupart des ordinateurs peuvent-ils le faire à partir d'une clé USB?
Le BIOS effectuera un bootstrap élémentaire.
De quels pilotes ai-je besoin et pouvez-vous suggérer des références pour les construire?
tout ce qui n'est pas des opérations directes de processeur / mémoire. Tout ce qui n'est pas directement dans le manuel de référence du processeur.
Après la séquence de démarrage - alors quoi? Comment passer en mode protégé, etc.
Le mode protégé fera partie de la séquence de démarrage.
Ensuite, vous commencez le multitâche et découvrez comment démarrer les processus.
Comment gérer la mémoire sans l'aide d'un système d'exploitation? Dois-je utiliser les adresses que je veux? Aucune initialisation nécessaire?
Correct. Vous voudrez probablement trier un système de mémoire virtuelle éventuellement.
Que vais-je sans aucun doute rencontrer qui me déroutera?
ne pas avoir d'outils de débogage, pas d'E / S
Comment puis-je en faire une ligne de commande O / S et une graphique?
Avec chagrin. Recherchez Windows 3.1 et Linux, en particulier X windows.
Sur quoi repose un O / S graphique? Par exemple, comment pourrais-je faire quelque chose comme, une ligne de commande, avec une police et une image en haut?
Recherchez X windows.
dernier conseil: étudiez Linux / x Windows. Ce n'est pas parfait, mais cela permet de comprendre une approche. Etudiez également les systèmes embarqués.
la source
Je vois beaucoup de bonnes références aux sites de développement de systèmes d'exploitation, je vais donc décrire une approche différente:
Si vous voulez avoir l'expérience de l'implémentation d'un système d'exploitation à partir de métal nu, il existe de meilleurs choix de matériel qu'un ancien PC. Avec l'architecture PC, vous passerez une quantité excessive de temps à coder autour d'artefacts inintéressants de ses 30 ans d'histoire de conception. Par exemple, seule la partie bootloader du projet a probablement épuisé de nombreux programmeurs courageux.
Par exemple, vous aurez besoin d'un ensemble de pilotes pour lire votre noyau hors du disque et / ou du réseau. Ensuite, vous aurez besoin de code pour passer en mode protégé. À ce stade, vous avez besoin d'un autre ensemble de pilotes! Très peu de travail que vous effectuez pour mettre la puce en mode protégé sera transférable après ce point. Vous voulez l'exécuter sur un autre PC + - 4 ans et vous aurez besoin d'un autre ensemble de pilotes.
Examinez l'amorçage d'un ARM ou d'une autre puce «intégrée» 32 bits. Des cartes de développement bon marché sont disponibles, ou vous pouvez souder les vôtres! Certains ont Ethernet et USB intégrés. Je pense que vous aurez plus de plaisir à travailler sur une architecture saine et non croustillante, et peut-être vous retrouverez avec des compétences réutilisables.
la source
Plus que toute autre chose, si vous voulez que cela fonctionne sur du matériel réel, vous avez absolument besoin d'une copie du manuel de votre processeur. Les manuels Intel ( http://www.intel.com/products/processor/manuals/ ) sont inestimables. Ils couvrent tout, des modes de commutation (réel / protégé) à la gestion de la mémoire virtuelle (si vous choisissez d'aller jusque-là) en passant par les appels système (si jamais vous arrivez en mode utilisateur). Plus important encore, ils expliquent en détail un certain nombre de choses qui doivent être configurées pour que les choses fonctionnent, comme le TSS et les registres de segments, que la plupart des textes du système d'exploitation ne discutent pas car ils sont plus concernés par des concepts de niveau supérieur que par le processeur. détails spécifiques.
la source
La série de développement de système d'exploitation @ BrokenThorn pourrait vous intéresser.
la source
Essayez de lire le code d'un petit système d'exploitation open source de base, tel que MikeOS.
Alternativement, je suggère les étapes suivantes (devraient être amusantes!):
Les étapes ci-dessus peuvent sembler un peu stupides pour écrire un système d'exploitation simple, mais bon, c'est vraiment amusant.
la source
consultez MikeOS . C'est un système d'exploitation assez simple écrit et lisible (comme dans un assemblage commenté). Même si c'est assez simple, il possède une interface graphique et prend en charge certains réseaux et multimédia.
edit : MenuetOS est graphique. Il est également écrit en simple asm, mais il est plus sophistiqué que MikeOS
la source
Vous avez un objectif ambitieux. Mais l'exécution est la clé.
La plupart des approches structurées (manuel ou classe universitaire) vous guideront tout au long du processus, mais elles fournissent une grande partie du code de fond qui passe sous silence les détails mystérieux de la plate-forme choisie et vous permet de vous concentrer sur les idées générales: planification des processus, gestion de la mémoire, prévention des interblocages, E / S, etc.
Mon conseil est le suivant: réduisez vos attentes et commencez par une question de base.
Qu'est-ce qu'un système d'exploitation?
Un informaticien ne dira jamais (espérons-le) qu'un système d'exploitation est une interface utilisateur graphique, ou un navigateur Web, ou un moyen de connecter des périphériques USB, ou tout ce qu'un utilisateur peut réellement voir ou toucher. Au lieu de cela, un système d'exploitation à son niveau le plus fondamental sont les choses que j'ai mentionnées ci-dessus. Ils relèvent tous d'un seul et même grand parapluie: la gestion des ressources.
Un système d'exploitation n'est rien de plus qu'un programme qui gère les ressources matérielles de l'ordinateur: mémoire, CPU et périphériques.
Voici un système d'exploitation simple: un programme permet à l'utilisateur de saisir un programme (en hexadécimal ou en binaire) à l'aide d'une connexion série. Une fois que le programme a été saisi, il exécute le programme. Lorsque le programme est terminé, le contrôle est retourné à l'utilisateur où il peut soit réexécuter le programme, soit en taper un nouveau.
Faites ceci sur une architecture «propre» telle qu'un processeur ARM intégré avec environ 64 Ko de mémoire. Vous pouvez coder cela en assemblage après quelques jours d'apprentissage des tenants et aboutissants de l'ARM. Et voila!, vous avez vous-même un système d'exploitation.
Il fait tout ce qu'un système d'exploitation est censé faire:
Cela vous donne un élément de base pour commencer. Vous avez maintenant beaucoup de choix. L'une d'elles serait peut-être d'autoriser le chargement de deux programmes en mémoire et de laisser l'utilisateur décider lequel exécuter ensuite.
Ou vous pouvez laisser l'utilisateur suspendre l'exécution d'un programme, passer à l'autre, suspendre et revenir en arrière. C'est du multitâche rudimentaire, même s'il est entièrement manuel.
Vos choix sont illimités, mais chacun est un petit pas par rapport à ce que vous aviez auparavant.
C'est amusant si vous ne visez pas trop haut!
la source
Je maintiens une liste de ressources sur StackOverflow: Comment démarrer dans le développement du système d'exploitation . Veuillez y ajouter de nouvelles ressources au début de votre aventure (je suis sur le point de commencer :))
la source
De nombreuses écoles ont des classes OS qui font une grande partie de ce que vous décrivez. Mon école (CMU) a enseigné le système d'exploitation en C, et nous avons écrit un noyau, un système de fichiers et un shell, et avons reçu le code d'un chargeur de démarrage.
Malheureusement, je n'ai pas pu trouver de ressources définitives pour ce cours (15-412) sur le Web, et il a évolué avec le temps. Mais peut-être que les gens pourraient publier des liens vers des sources et des devoirs pour les écoles qui ont de bonnes ressources sur le Web.
la source
Vous pourriez apprécier ça didacticiel intitulé "Roll your own toy UNIX-clone OS", il est très perspicace et devrait vous aider sur votre chemin.
Bonne chance.
la source
Étudiez le système A2 (anciennement appelé système Oberon ) pour des idées que vous pouvez voler. C'est un système d'exploitation graphique construit par seulement deux personnes, bien que l'un d'eux soit, certes, Niklaus Wirth. Première sortie vers 1990 et la vitesse est étonnamment bonne. Il y a un livre de Gutknecht.
la source
À propos de la programmation graphique de bas niveau, cela vous donnera beaucoup d'informations: http://www.osdever.net/FreeVGA/home.htm . (C'est aussi très intéressant pour le mode texte.)
Vous vous rendrez compte que sur PC, il y a énormément de choses qui ne sont pas claires: le jeu d'instructions x86 lui-même est compliqué, et lorsque vous obtenez un accès direct au matériel, cela peut prendre un certain temps avant de comprendre comment écrire un seul caractère à l'écran .
Ne vous inquiétez pas pour les disquettes et autres, la plupart du temps, vous utiliserez un émulateur tel que Bochs ou QEmu.
la source
Vous voudrez peut-être envisager de jeter un œil aux concepts des systèmes d'exploitation, par Abraham Silberschatz - Comprendre les concepts de programmation des systèmes est une exigence fondamentale, jetez un coup d'œil aux internes du noyau F / OSS des systèmes d'exploitation linux * BSD et GNU / Linux , en particulier les versions antérieures, qui sont probablement un peu plus documentés.
la source
Jetez un œil à Minix . Etudiez le code source avec " Conception et implémentation des systèmes d'exploitation ". Envisagez de contribuer au projet. Je pense que Minix est un système d'exploitation vraiment bon et prometteur en devenir. C'est aussi un projet bien financé. Cela signifie que vous pourriez même être payé pour vos contributions!
la source
C'est très facile grâce au fait que le BIOS possède déjà de nombreuses fonctions d'entrée / sortie intégrées pour changer le mode d'écran, changer la couleur des pixels, écrire du texte à l'écran et bien d'autres choses. Cependant, il n'inclut pas la prise en charge des systèmes de fichiers, c'est l'une des rares choses que vous devez intégrer dans votre système d'exploitation.
Le BIOS charge le premier secteur sur le disque dur et commence à exécuter le code à partir de là, donc votre système d'exploitation doit être placé avec la première instruction dans le premier secteur sur le disque dur.
Cet article de Wikipédia devrait vous aider à démarrer sur les interruptions du BIOS pour écrire du texte à l'écran, recevoir des touches du clavier et d'autres choses. https://en.wikipedia.org/wiki/BIOS_interrupt_call
Même si vous envisagez d'utiliser C ++, je vous recommande fortement de lire sur la programmation d'assemblage, car il est essentiel de comprendre le fonctionnement du matériel.
la source