web-dev-qa-db-fra.com

Comment puis-je créer un petit système d'exploitation sur un ancien ordinateur de bureau?

Cela pourrait être en vain, car je sais que l'écriture d'un système d'exploitation est insupportablement compliquée (surtout par soi-même).

  • Je ne m'attends pas à construire le prochain Linux ou Windows.

  • Je sais que ce sera horrible et buggy, et ne fonctionnera pas, mais ça va.

Je veux tout écrire moi-même, en Assembly, C , et (some) C++.

Ceci est un projet futur, car je suis occupé par d'autres choses en ce moment et je n'ai pas le temps immédiatement, mais j'ai pensé que je le demanderais maintenant, alors je pourrais peut-être obtenir beaucoup de réponses à cela, et cela pourrait construire et être une ressource utile pour ce type d'approche (tout ce que j'ai vu impliquait de construire à partir de minix, d'utiliser un chargeur de démarrage existant, de le construire dans un programme de démarrage virtuel, etc.).

Je veux configurer 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é beaucoup de ressources à ce sujet, mais pour être complet, veuillez en ajouter de bonnes), mon propre pilote USB (si cela est nécessaire), un pilote de CD (si cela est 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 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 rencontrerai sans aucun doute qui me confondra?

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

  • Sur quoi s'appuie un O/S graphique? Comme, 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.-à-d., avoir deux lignes de commande de type graphique fonctionnant côte à côte).

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

Croyez-moi, je comprends que c'est un projet très compliqué, et je ne parviendrai 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.

En outre, veuillez ne pas suggérer de construire à partir d'un autre code O/S ou préexistant. Je sais que je vais lire 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 construire à partir d'autre chose, et il y a beaucoup d'autres questions sur SO à ce sujet que je peux lire si je change d'avis et que je prends 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 les utiliser, etc.?

110
Carson Myers

Tout 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. C'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, surtout pour un manuel. Tanenbaum est vraiment un expert dans ce domaine et ses explications sur le fonctionnement de l'OS sous le capot sont claires et faciles à comprendre. Ce livre est principalement de la théorie, mais je pense qu'il a également un livre qui traite davantage de la mise en œuvre. Je ne l'ai jamais lu, cependant, je ne peux donc pas le commenter.

Cela devrait vous aider à vous concentrer sur 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 à un état amorçable. À partir de là, il s'agit essentiellement d'écrire des pilotes de périphérique pour le matériel que vous devez prendre en charge et d'offrir des implémentations des fonctions de la bibliothèque C pour effectuer des appels au 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 le conceviez pour une machine x86). Cela devrait répondre à beaucoup de vos questions concernant le passage d'un mode de fonctionnement de processeur à un autre.

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 a une documentation très complète. Il a également de la RAM, du stockage de données flash, des LED, des commutateurs, des boutons, une sortie VGA, etc. Beaucoup de choses pour 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é, donc je peux efficacement utiliser la sortie série comme console pour obtenir le tout et démarrer sur une ligne de commande avec un minimum d'agitation.

Assurez-vous simplement que tout ce que vous choisissez de cibler dispose d'un compilateur facilement disponible et bien testé. Vous ne voulez pas écrire simultanément un OS et un compilateur.

49
Bob Somers

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

bienvenue dans le monde du développement OS.

Voir également d'autres liens de documentation x86 dans les SO x86tag wiki : manuels Intel et AMD, documentation de 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 étape unique sur votre chargeur de démarrage et examiner les registres.

28
fnurglewitz

Je suggérerais de travailler, au moins au début, sur Bochs ou sur 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 de le matériel), et si vous avez besoin d'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 le code C aussi rapidement que possible - c'est-à-dire démarrer, configurer vos tables de descripteurs et vous rendre à 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.

15
hbar

À son 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 certaine manière et de charger et d'exécuter en quelque sorte 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 firmware qui détermine comment le matériel effectue une initialisation (au moins vidéo, clavier et une certaine forme de stockage ou chargeur de démarrage). (Mise à jour d'octobre 2017: les PC plus récents ont un firmware 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 firmware, 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. Obtenez 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 recommanderais d'écrire un pilote série très simple ... mettez à jour votre chargeur de démarrage pour initialiser un port série et lancez 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 dans un autre ensemble de blocs (nous n'avons pas encore implémenté un système de fichiers ... pas même l'analyse de la table de partition; nous allons donc simplement traiter avec plages brutes de blocs sur le disque au début).

À ce stade, votre chargeur de démarrage devrait pouvoir extraire le nouveau code sur la ligne série, le vider dans une partition (oui, implémenter la gestion de la table de partition d'une manière ou d'une autre ... s'il est conforme aux conventions PC standard, c'est à vous de décider à ce stade. ) et l'exécuter.

À 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 y déployer le nouveau noyau.

(Votre chargeur de démarrage devrait prendre un certain signal, comme une pause sur les lignes de négociation en série comme 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).

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 de quelque 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ère de commencer avec un pilote série car vous pouvez ensuite automatiser votre cycle de génération/déploiement/test à partir de tout autre système (fonctionnel) existant. Étant donné que votre nouveau système d'exploitation démarrera en tant que 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ù tu veux mener ton 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 nouvel OS pour (re) construire, lier et démarrer dans une version de travail de votre nouvel OS ... 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).

14
Jim Dennis

Si cela ne vous dérange pas d'utiliser la virtualisation matérielle, il y a un cours (livre + conférences + logiciel) qui vous mènera de "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, un langage, et enfin le codage d'un jeu simple sur votre machine personnelle.

Je pense que c'est une excellente idée et quelque chose dans laquelle j'ai bien l'intention de me retrouver bientôt. Le livre est étonnamment bon marché et je crois que le cours est dispensé au MIT. Je ne peux imaginer un sentiment plus grand que d'avoir la connaissance complète et complète d'un système entier que vous avez vous-même construit à partir de zéro.

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

12
Sam

Je commencerais petit et achèterais un kit de développement intégré 8086, et développerais un OS multitâche là-dessus. 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 fera un 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 des opérations cpu/mémoire directes. 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 entrer en mode protégé, etc.

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

alors 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 simplement utiliser les adresses que je veux? Aucune initialisation nécessaire?

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


Qu'est-ce que je rencontrerai sans aucun doute qui me confondra?

ne pas avoir d'outils de débogage, ne pas avoir d'E/S


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.


Sur quoi s'appuie un O/S graphique? Comme, comment pourrais-je faire quelque chose comme, une ligne de commande, avec une police et une image en haut?

Recherchez X windows.


dernier conseil: étudier les fenêtres linux/x. Ce n'est pas parfait, mais cela permet de comprendre l'approche one. Etudiez également les systèmes embarqués.

10
Paul Nathan

Plus que toute 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 aussi loin) à la création d'appels système (si vous arrivez à faire du 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 discutez pas car ils sont plus concernés par les concepts de haut niveau que par les détails spécifiques au processeur.

8
csgordon

Je vois beaucoup de bonnes références aux sites de développement de systèmes d'exploitation, donc je vais décrire une approche différente:

Si vous voulez avoir l'expérience de la mise en œuvre d'un système d'exploitation à partir du métal nu, il existe de bien meilleurs choix matériels qu'un ancien PC. Avec l'architecture PC, vous passerez une quantité excessive de votre temps à coder autour d'artefacts inintéressants de son histoire de conception de 30 ans. 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 sur le disque et/ou le 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 du travail que vous faites pour mettre la puce en mode protégé sera transférable après ce point. Vous souhaitez l'exécuter sur un autre PC + - 4 ans et vous aurez besoin d'un autre ensemble de pilotes.

Cherchez à amorcer une ARM ou autre puce "embarquée" 32 bits. Des cartes de développement peu coûteuses sont disponibles, ou vous pouvez souder les vôtres! Certaines ont une connexion Ethernet et USB intégrée. Je pense que vous le ferez avoir plus de plaisir à travailler sur une architecture saine et non croustillante, et peut-être se retrouver avec des compétences réutilisables.

8
Marsh Ray

Le OS Development Series @ BrokenThorn pourrait vous intéresser.

8
tomzx

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 (ça devrait être amusant!):

  1. Écrivez une machine virtuelle. Définissez toutes les instructions de votre processeur afin de connaître votre système à l'intérieur comme à l'extérieur. Interface avec SDL pour le clavier, la souris, l'écran, l'accès audio. Restez simple pour pouvoir tout ranger dans votre tête à la fois. Il n'est pas nécessaire que ce soit une machine virtuelle à la pointe de la technologie, juste 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 n'a pas besoin d'ê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 éditeur de liens simple.
  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 démarrage aussi compliqué, faites d'abord fonctionner votre machine par votre système d'exploitation.

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

8
ouiliame

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

La plupart des approches structurées (manuels ou cours de niveau collégial) vous guideront tout au long du processus, mais elles fournissent une grande partie du code détaillé qui passe sous silence les détails obscurs de la plate-forme que vous avez 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: reculez vos attentes et commencez par une question de base.

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, 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 OS à son niveau le plus fondamental sont les choses que j'ai mentionnées ci-dessus. Ils relèvent tous d'un 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 taper un programme (en hexadécimal ou binaire) en utilisant une connexion série. Une fois le programme tapé, il l'exécute. Lorsque le programme est terminé, le contrôle est retourné à l'utilisateur où il peut soit réexécuter le programme, soit en saisir un nouveau.

Pour ce faire, sur une architecture "propre" telle qu'un processeur ARM processeur avec 64 Ko de mémoire environ. Vous pouvez coder cela dans Assembly après quelques jours d'apprentissage des tenants et aboutissants de l'ARM Et le tour est joué , vous avez un système d'exploitation.

Il fait tout ce qu'un OS est censé faire:

  • Il gère la mémoire en ne laissant pas l'utilisateur écraser le système d'exploitation lui-même.
  • Il planifie l'exécution d'un seul processus.
  • Il gère les E/S vers le périphérique série unique.

Cela vous donne un élément de base pour commencer. Vous avez maintenant beaucoup de choix. L'un d'eux 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. Il s'agit d'un 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!

6
Barry Brown

consultez MikeOS . Son OS assez simple écrit est lisible (comme dans les commentaires) de l'assemblage. Même si c'est assez simple, il a une interface graphique et prend en charge certains réseaux et multimédia.

edit : MenuetOS est graphique. Son aussi écrit est droit, mais c'est plus sophistiqué que MikeOS

6
Alex

Je maintiens une liste de ressources sur StackOverflow: Comment démarrer dans le développement de systèmes d'exploitation . Veuillez y ajouter de nouvelles ressources au début de votre aventure (je suis sur le point de commencer :))

5
Giovanni Galbo

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 Shell, et nous avons reçu du code pour un chargeur de démarrage.

Malheureusement, je n'ai pu trouver aucune ressource définitive pour ce cours (15-412) sur le Web, et elle a évolué au fil du 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.

4
Drew Hoskins

Vous voudrez peut-être envisager de consulter Operating Systems Concepts, par Abraham Silberschatz - Comprendre les concepts de programmation des systèmes est une exigence fondamentale, jetez un œ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 textalt text

3
amaterasu

Étudiez le système A2 (anciennement appelé système Oberon ) pour trouver des idées que vous pouvez voler. Il s'agit d'un système d'exploitation graphique construit par seulement deux personnes, bien qu'il soit vrai que Niklaus Wirth. Sorti pour la première fois vers 1990 et la vitesse est étonnamment bonne. Il y a un livre de Gutknecht.

3
Norman Ramsey

À 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.)

Qu'est-ce que je rencontrerai sans aucun doute qui me confondra?

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 des disquettes et autres, la plupart du temps vous utiliserez un émulateur tel que Bochs ou QEmu.

3
Bastien Léonard

Vous pourriez profiter de this tutoriel nommé "Roll your own toy UNIX-clone OS", son très perspicace et devrait vous aider sur votre chemin.

Bonne chance.

3
blacky

Jetez un oeil à Minix . Étudiez 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. C'est également un projet bien financé. Cela signifie que vous pourriez même être payé pour vos contributions!

2
Vijay Mathew

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 très 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 du premier secteur sur le disque dur.

Cet article 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 prévoyez 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.

1
Alpha_Pi