Question

Cela pourrait être vain, car je sais qu’écrire un système d’exploitation est extrêmement compliqué (surtout par soi-même).

  • Je ne m'attends pas à créer le prochain Linux ou Windows.

  • Je sais que ce sera horrible, buggé et ne fonctionnera pas, mais c'est correct.

Je veux tout écrire moi-même, dans Assemblée , C et (certains) C ++ .

Ceci est un projet futur, car je suis occupé par d'autres choses pour le moment et que je n'ai pas le temps de le faire, mais je me suis dit que je le demanderais maintenant, alors peut-être que je pourrais avoir beaucoup de réponses à cela, et cela pourrait constituer une ressource utile pour ce type d’approche (tout ce que j’ai vu auparavant concerne la construction de minix, l’utilisation d’un chargeur de démarrage existant, sa construction dans un programme de démarrage virtuel, etc.).

Je souhaite configurer l'un de mes anciens ordinateurs de bureau avec un moniteur, 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é de nombreuses ressources à ce sujet, mais pour être complet, ajoutez-en quelques-unes de bonnes), mon propre pilote USB (si nécessaire), un lecteur de CD ( si cela est nécessaire), etc. Tout, à partir de zéro.

  • Comment puis-je 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 entrer en mode protégé, etc.

  • Comment gérer la mémoire sans l'aide d'un système d'exploitation? Dois-je simplement utiliser les adresses que je veux? Aucune initialisation nécessaire?

  • Qu'est-ce que je vais sans doute rencontrer et qui va me dérouter?

  • Comment puis-je en faire un O / S en ligne de commande et un graphique?

  • Qu'est-ce qu'un système d'exploitation graphique construit? Par exemple, comment pourrais-je faire quelque chose comme une ligne de commande, avec une police et une image en haut?

  • Où puis-je en savoir plus sur la configuration d'un environnement multitâche? (c.-à-d. ayant deux lignes de commande de type graphique fonctionnant côte à côte).

  • Comment pourrais-je installer une sorte de système de fenêtrage? Comment puis-je afficher des graphiques à l'écran une fois le multitâche simple configuré?

Croyez-moi, je comprends qu'il s'agit d'un projet très très compliqué, et que je ne parviendrai probablement jamais à le terminer ou à l'écrire de quelque manière que ce soit.

Il y a beaucoup d'autres choses que je n'ai pas mentionnées, si vous en pensez, n'hésitez pas à les ajouter aussi.

Veuillez mettre un "sujet" " par réponse - par exemple, les pilotes USB, puis peut-être une liste de ressources, des éléments à surveiller, etc.

De même, veuillez ne pas suggérer de créer à partir d'un autre système d'exploitation ou d'un code préexistant. Je sais que je vais lire beaucoup de codes préexistants (tels que le noyau Linux, des exemples de ressources, des pilotes existants, etc.), mais je souhaite en fin de compte écrire moi-même. Je sais que je devrais partir de quelque chose d'autre, et il y a beaucoup d'autres questions à ce sujet que je peux lire si je change d'idée et si je vais dans cette voie. Mais celui-ci est tout à propos de faire le tout à 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.?

Était-ce utile?

La solution

Premières choses d'abord. Lire, lire, lire, lire, lire. 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. Ceci est celui que nous avons utilisé dans ma classe OS au collège:

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 aussi un livre qui traite plus de la mise en œuvre. Je ne l'ai jamais lu, alors je ne peux pas en parler.

Cela devrait vous aider à mieux gérer les 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 obtenir un état de démarrage. À partir de ce moment, il s’agit essentiellement d’écrire des pilotes de périphérique pour le matériel que vous devez prendre en charge et de proposer des implémentations des fonctions de la bibliothèque C afin de faire des appels au noyau pour ouvrir des fichiers et des périphériques, lire et écrire, transmettre des messages entre processus, etc. .

Lisez sur l'assemblage x86 (en supposant que vous concevez ceci pour une machine x86). Cela devrait répondre à beaucoup de vos questions concernant le passage d’un mode de processeur à l’autre.

Si vous avez des connaissances en électronique, il peut être plus facile de commencer à écrire un système d'exploitation pour un périphérique intégré doté d'une documentation abondante, car ce 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 à noyau souple MicroBlaze de Xilinx, qui dispose d'une documentation très complète. Il contient également de la RAM, du stockage de données flash, des voyants, des commutateurs, des boutons, une sortie VGA, etc. Une multitude de choses à jouer pour écrire des pilotes simples.

L’un des avantages d’un périphérique intégré est qu’il est également possible d’é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é, ce qui me permet d’utiliser efficacement la sortie série en tant que console pour tout lancer et démarrer sur une ligne de commande en toute simplicité.

Assurez-vous simplement que ce que vous choisissez de cibler dispose d'un compilateur facilement disponible et bien testé. Vous ne voulez pas écrire un système d’exploitation et un compilateur en même temps.

Autres conseils

http://www.osdev.org/ et http://www.osdever.net/

bienvenue dans le monde du développement OS.

Voir aussi d'autres liens sur la documentation x86 dans les tag wiki : manuels Intel et AMD, documents de compilation / assemblage et divers guides.

Il suggère également d'utiliser BOCHS ou un autre environnement virtuel pour le débogage, car vous pouvez installer votre chargeur de démarrage en une seule étape et examiner les registres.

Je suggérerais de travailler, au moins au début, sur la Bochs ou une autre machine virtuelle, la raison étant que vous pouvez l'emporter avec vous où vous voulez, il est plus facile de déboguer (vous pouvez voir l'état exact du matériel), et si vous avez besoin d'aide pour le débogage de l'aide extérieure, 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 le code C aussi rapidement que possible - c'est-à-dire, démarrez, configurez vos tableaux de descripteurs et atteignez un point où vous pouvez exécuter une compilation sans danger. C. La plupart sinon la totalité du 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 difficile à déboguer.

À son niveau le plus bas, le système d’exploitation doit au minimum pouvoir piloter le matériel d’un système d’une manière ou d’une autre et charger d’une manière ou d’une autre une sorte de "code utilisateur". Si vous commencez avec un PC, vous devez écrire un code pouvant être chargé par un périphérique ou un autre. Les anciens PC ont un BIOS dans le micrologiciel qui détermine la manière dont le matériel procède à l’initialisation (au moins vidéo, clavier, et une certaine forme de stockage ou de chargeur de démarrage). (Mise à jour octobre 2017: les PC les 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 base sur l’utilisation du BIOS ou d’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: "Bonjour, Linus". directement à partir du processus de démarrage du micrologiciel (sur une disquette ou une clé USB, ce serait un bon début ... ou sur un disque dur, si vous le souhaitez).

À partir de là, je vous recommande d'écrire un pilote série très simple ... mettez à jour votre chargeur de démarrage pour initialiser un port série, puis lancez le téléchargement à partir de celui-ci. Ensuite, il peut exécuter le code qu'il traverse. À partir de là, écrivez un peu de boot qui peut écrire sur un autre ensemble de blocs (nous n'avons pas encore implémenté de système de fichiers ... pas même l'analyse de table de partition; nous ne traiterions donc que des plages brutes de blocs sur le disque. ).

À ce stade, votre chargeur de démarrage devrait pouvoir extraire le nouveau code sur la ligne série, le vider dans une partition (oui, mettre en œuvre un type de traitement de la table de partition ... qu'il soit conforme aux conventions PC standard à ce stade), et exécutez-le.

À partir de là, vous devriez pouvoir travailler sur des fonctionnalités beaucoup plus sophistiquées. À partir de cette base, vous pouvez écrire et compiler un nouveau "noyau". ... redémarrez votre banc d'essai et déployez-y le nouveau noyau.

(Votre chargeur de démarrage devrait prendre un signal, tel qu'un arrêt sur les lignes série d'établissement de liaison comme une commande pour ignorer le téléchargement et simplement démarrer l'image existante; il devrait également gérer un certain délai d'attente de cette façon).

À partir de là, écrivez une couche de terminal 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 de quelque sorte). Et ainsi de suite.

Naturellement, vous auriez pu commencer avec un pilote de console utilisant le clavier du PC et la vidéo (les commandes BIOS INT 0x16h et INT 0x10H, respectivement, si je me souviens bien). Cependant, je suggérerais de commencer avec 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émarrera sous la forme d'un projet compilé de manière croisée, il sera essentiel que vous disposiez d'une méthode de traitement simplifiée.

Je ne sais pas jusqu'où vous voulez mener votre projet. Un objectif assez impressionnant serait de parvenir à un "auto-hébergement". Si vous pouvez créer un assembleur / compilateur simple qui vous permette d'utiliser votre nouveau système d'exploitation pour (reconstruire), relier et démarrer une version de travail de votre nouveau système d'exploitation ... alors vous avez atteint cet objectif. (Notez que ce n’est pas une obligation. De nombreux systèmes embarqués ne seront jamais auto-hébergés et il n’ya rien de mal à cela.)

Si vous ne craignez pas l’utilisation de la virtualisation matérielle, il existe un cours (livre + conférences + logiciel) qui vous mènera de «De Nand à Tetris». Vous créez vous-même un système informatique complet à partir de la porte NAND électrique (à ces fins, atomique et donnée), jusqu'à la création du système d'exploitation, d'un langage et enfin du codage d'un jeu simple sur votre machine personnelle.

Je pense que c'est une excellente idée et une chose dans laquelle je compte bien me tenir prochainement. Le livre est étonnamment bon marché et je crois que le cours est enseigné au MIT. Je ne peux pas imaginer de plus grand sentiment que d'avoir la connaissance complète d'un système que vous avez construit vous-même à partir de la base.

Lien: http://www1.idc.ac.il/tecs/

Je commencerais petit, achèterais un kit de développement intégré 8086 et développerais un système d’exploitation multitâche à ce sujet. Une fois que vous avez un noyau et que vous maîtrisez le matériel, vous êtes prêt à faire quelque chose de plus stimulant.

Construire même un clone d’affichage VGA est un défi de taille. Les détails sont énormes. : -)

sujets spécifiques.

Comment puis-je 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 fera l’amorçage é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 une opération cpu / mémoire directe. Tout ce qui ne se trouve pas directement dans le manuel de référence de la CPU.

Après la séquence de démarrage, alors quoi? Comment entrer en mode protégé, etc.

Le mode protégé fera partie de la séquence de démarrage.

Ensuite, vous commencez à effectuer plusieurs tâches à la fois et à déterminer comment démarrer les processus.

Comment gérer la mémoire sans l'aide d'un système d'exploitation? Dois-je simplement utiliser les adresses que je veux? Aucune initialisation nécessaire?

Corrigez. Vous voudrez probablement trier éventuellement un système de mémoire virtuelle.

Que vais-je sans doute rencontrer dans la confusion?

ne pas avoir d'outils de débogage, ni d'IO

Comment puis-je en faire une ligne de commande O / S et une ligne graphique?

Avec chagrin. Recherchez Windows 3.1 et Linux, en particulier X Windows.

Qu'est-ce qu'un système d'exploitation graphique construit? Comme, comment pourrais-je faire quelque chose comme une ligne de commande, avec une police et une image en haut?

Recherchez les fenêtres X.

conseil final: étudiez linux / x windows. Ce n'est pas parfait, mais cela permet de comprendre l'approche one . Etudiez également les systèmes embarqués.

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 souhaitez expérimenter la mise en œuvre d’un système d’exploitation sans système d'exploitation, les choix matériels sont bien meilleurs que ceux d'un ancien PC. Avec l'architecture PC, vous passerez une quantité excessive de votre temps à coder des artefacts sans intérêt de ses 30 années d'histoire de conception. Par exemple, seule la partie du chargeur de démarrage du projet a probablement épuisé de nombreux programmeurs courageux.

Par exemple, vous aurez besoin d’un ensemble de pilotes pour lire votre noyau sur un disque et / ou sur le réseau. Ensuite, vous aurez besoin de code pour entrer en mode protégé. À ce stade, vous avez besoin d'un autre ensemble de pilotes! Très peu de travail que vous effectuerez 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 jeu de pilotes.

Cherchez à amorcer un processus ARM ou autre "intégré" & 32 bits puce. Des cartes de développement peu coûteuses 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 aurez-vous des compétences réutilisables.

Plus que tout autre chose, si vous voulez que cela fonctionne sur du vrai matériel, 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 vont de tout, des modes de commutation (réel / protégé) à la gestion de la mémoire virtuelle (si vous choisissez d'aller jusque-là) à la réalisation d'appels système (si vous arrivez au mode utilisateur). Plus important encore , ils expliquent en détail un certain nombre d'éléments à configurer pour fonctionner, tels que les registres TSS et les registres de segments, dont la plupart des textes de système d'exploitation ne traitent pas, car ils concernent davantage Concepts de niveau supérieur aux détails spécifiques au processeur.

La série de développement du système d'exploitation @ BrokenThorn pourrait vous intéresser.

Essayez de lire le code d’un petit système d’exploitation libre, tel que MikeOS.

Sinon, je suggère les étapes suivantes (ça devrait être amusant!):

  1. Écrivez une machine virtuelle. Définissez toutes les instructions de votre processeur afin de connaître votre système de fond en comble. Interfacez-le avec SDL pour le clavier, la souris, l'écran, l'accès audio. Restez simple afin que vous puissiez tout mettre dans votre tête à la fois. Il n’est pas nécessaire que ce soit une machine virtuelle à la pointe de la technologie, mais une machine capable d’émuler la fonction d’un «vrai» ordinateur.
  2. Écrivez un assembleur pour le processeur de votre machine virtuelle. N'oubliez pas que cet assembleur ne doit pas nécessairement être un programme écrit dans le langage de la machine virtuelle, mais tout ce qui peut convertir votre langage d'assemblage en code machine.
  3. Définissez un format exécutable et écrivez un simple éditeur de liens.
  4. Vous avez maintenant toutes les pièces pour écrire votre système d'exploitation! Écrivez-le dans le langage d'assemblage, assemblez-le, etc., vous n'avez pas besoin d'un processus de chargement d'amorçage aussi compliqué, il suffit simplement que votre machine exécute votre système d'exploitation.

Les étapes ci-dessus peuvent sembler un peu stupides pour écrire un système d'exploitation simple, mais bon, c'est sacrément amusant.

consultez MikeOS . C'est un système d'exploitation assez simple écrit qui est un assemblage lisible (comme dans commenté). Bien que relativement simple, il possède une interface graphique et prend en charge certains réseaux et le multimédia.

modifier : MenuetOS est graphique. Son également écrit est simple asm, mais son plus sophistiqué que MikeOS

Vous avez un objectif ambitieux. Mais l'exécution est la clé.

La plupart des approches structurées (cours théoriques ou collégial) vous guideront tout au long du processus, mais elles fournissent une bonne partie du code qui glisse sur les détails obscurs de la plate-forme choisie et vous permet de vous concentrer sur les grandes Idées graphiques: planification de processus, gestion de la mémoire, prévention des blocages, E / S, etc.

Mon conseil est le suivant: réduisez vos attentes et commencez par une question élémentaire.

Qu'est-ce qu'un système d'exploitation?

Un informaticien ne dira (espérons-le) jamais qu’un système d’exploitation est une interface utilisateur graphique, un navigateur Web, ou un moyen de connecter des périphériques USB, ou tout ce que l’utilisateur peut réellement voir ou toucher. Au lieu de cela, un système d'exploitation à son niveau le plus fondamental est ce que j'ai mentionné ci-dessus. Ils relèvent tous d’un seul et même ensemble: la gestion des ressources.

Un système d'exploitation n'est rien d'autre 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 binaire) à l'aide d'une connexion série. Une fois le programme saisi, il est exécuté. Lorsque le programme est terminé, l'utilisateur retrouve le contrôle lui permettant de réexécuter le programme ou d'en saisir un nouveau.

Faites ceci sur un "nettoyer". architecture telle qu'un processeur ARM intégré avec 64K de mémoire ou plus. Vous pouvez le coder en assemblée après quelques jours d'apprentissage des détails de l'ARM. Et voila! , vous avez un système d’exploitation.

Il fait tout ce qu'un système d'exploitation est supposé faire:

  • Il gère la mémoire en évitant que l'utilisateur écrase le système d'exploitation lui-même.
  • Un seul processus est planifié.
  • Il gère les E / S vers le périphérique série unique.

Cela vous donne un bloc de construction pour commencer. Vous avez beaucoup de choix maintenant. L’un d’eux serait peut-être d’autoriser le chargement en mémoire de deux programmes et de laisser l’utilisateur choisir le prochain programme à exécuter.

Vous pouvez également laisser l'utilisateur suspendre l'exécution d'un programme, basculer vers l'autre, suspendre et revenir en arrière. Le multitâche est rudimentaire, même s’il est entièrement manuel.

Vos choix sont illimités mais chacun d'entre eux est un pas en avant par rapport à ce que vous aviez auparavant.

C'est amusant si vous ne visez pas trop haut!

Je gère une liste de ressources sur StackOverflow: Comment démarrer dans le développement du système d'exploitation . Ajoutez-y de nouvelles ressources au début de votre aventure (je suis sur le point de commencer :))

De nombreuses écoles ont des classes de système d’exploitation qui font beaucoup de ce que vous décrivez. Mon école (CMU) a enseigné les systèmes 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 trouvé aucune ressource définitive pour ce cours (15-412) sur le Web, et cela a évolué avec le temps. Mais peut-être que les gens pourraient poster des liens vers des sources et des devoirs pour des écoles qui ont de bonnes ressources sur le Web.

Vous pourriez apprécier ce tutoriel intitulé "Faites rouler votre propre jouet UNIX -clone OS ", c'est très perspicace et devrait vous aider sur votre chemin.

Bonne chance.

Étudiez le système A2 (anciennement appelé le système Oberon ). pour des idées que vous pouvez voler. Il s’agit d’un système d’exploitation graphique créé par deux personnes seulement, bien qu’il s’agisse bien de Niklaus Wirth. D'abord publié vers 1990 et la vitesse est étonnamment bonne. Il y a un livre de Gutknecht.

À propos de la programmation graphique de bas niveau, vous obtiendrez de nombreuses informations: http: / /www.osdever.net/FreeVGA/home.htm . (C'est très intéressant aussi pour le mode texte.)

  

Que vais-je sans doute rencontrer dans la confusion?

Vous vous rendrez compte que sur PC, il y a énormément de choses qui ne sont pas claires: le jeu d'instructions x86 est compliqué en soi, et quand vous obtenez un accès direct au matériel, cela peut prendre un bon bout de temps avant de comprendre comment écrire un seul. caractère à l'écran.

Ne vous inquiétez pas des disquettes, par exemple, vous utiliserez la plupart du temps un émulateur tel que Bochs ou QEmu.

Vous voudrez peut-être jeter un coup d'œil sur Conceptions des systèmes d'exploitation, par Abraham Silberschatz - Comprendre les systèmes La programmation est une exigence fondamentale. Jetez un coup d'œil aux composants 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ées.  alt text alt text

Consultez Minix . Étudiez le code source en même temps que " Conception et implémentation de systèmes d'exploitation " ;. Envisagez de faire des contributions au projet. Je pense que Minix est un très bon système d’exploitation prometteur. C'est aussi un projet bien financé. Cela signifie que vous pourriez même être payé pour vos contributions!

C’est très facile grâce au fait que le BIOS possède déjà de nombreuses fonctions d’entrée / sortie pour changer de mode d’écran, changer de couleur de pixel, écrire du texte à l’écran et bien d’autres choses encore. Cependant, il n’inclut pas la prise en charge des systèmes de fichiers, c’est l’une des rares choses à 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à. Votre système d'exploitation doit donc être placé avec la première instruction dans le premier secteur du disque dur.

Cet article de Wikipédia devrait vous familiariser avec les interruptions du BIOS afin d’écrire du texte à l’écran, de recevoir les touches du clavier, etc. https://en.wikipedia.org/wiki/BIOS_interrupt_call

Même si vous envisagez d'utiliser c ++, je vous recommande fortement de lire la programmation d'assemblage, car il est essentiel de comprendre le fonctionnement du matériel.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top