Maison > développement back-end > C++ > le corps du texte

Développement du système d'exploitation (la vérité)

Mary-Kate Olsen
Libérer: 2024-09-19 18:17:11
original
494 Les gens l'ont consulté

OS Development (The truth)

Table des matières

  • Présentation
  • 1. Le chargeur de démarrage : lancer les choses
  • 2. Entrer dans le noyau : là où la magie opère
  • 3. Choisir votre langue
  • 4. Sécurité : n'écrasez pas l'avion
  • 5. Optimiser pour la vitesse
  • 6. Configuration des pilotes de base
    • Pilote vidéo 6.1
    • Pilote de clavier 6.2
    • 6.3 Pilote d'E/S
  • 7. Écrire un shell : l'interface utilisateur
  • 8. Construire un système de fichiers personnalisé
  • 9. Ajout d'un pilote de souris : cliquez et déplacez
  • 10. Construire une interface graphique simple
  • 11. Gestion des fenêtres et des événements
  • 12. Créer une application Bloc-notes : du clic à la saisie
  • 13. Touches finales : donner l'impression d'être un système d'exploitation

Introduction

Construire un système d'exploitation à partir de zéro est l'une des expériences les plus difficiles et les plus enrichissantes que vous puissiez vivre en tant que développeur. Contrairement au développement d'applications de haut niveau, où une bibliothèque existe pour presque tout, le développement de systèmes d'exploitation vous oblige à travailler au plus près du métal, en touchant directement le matériel, en gérant manuellement la mémoire et en contrôlant tous les aspects du fonctionnement de votre machine.

D'après mon expérience, créer un système d'exploitation signifie approfondir le langage assembleur, lutter avec le matériel et lutter contre les crashs, les redémarrages (surtout les redémarrages) et les longues sessions de débogage. Si vous pensez que le débogage d’un chargeur de démarrage est difficile, essayez de le faire sans le luxe des outils modernes. Le développement du système d'exploitation vous amène à remettre en question vos choix de vie plus de fois que vous ne pouvez le compter.

Cela dit, décomposons tout cela, du chargeur de démarrage à un environnement de bureau entièrement fonctionnel où vous pouvez déplacer une souris et ouvrir un éditeur de texte pour taper.


1. Le chargeur de démarrage : lancer les choses

Qu'est-ce qu'un chargeur de démarrage ?

Le bootloader est la première étape de tout parcours de développement de système d'exploitation. Lorsque votre ordinateur s'allume, le BIOS prend le relais, vérifie votre matériel, puis charge votre chargeur de démarrage du disque vers la mémoire. Le travail de ce petit programme consiste à préparer le processeur et à charger le noyau de votre système d’exploitation en mémoire. Vous devez écrire le bootloader en assembleur car vous traitez directement du matériel à ce stade.

Lorsque le chargeur de démarrage démarre, le processeur est en mode réel 16 bits, ce qui signifie qu'il ne peut adresser que 1 Mo de mémoire. La première chose à faire est de charger le noyau depuis le disque et de le déplacer vers la mémoire. Après cela, le chargeur de démarrage fait passer le processeur en mode protégé 32 bits, c'est là que le plaisir commence. Le changement de mode nécessite la configuration de la Global Descriptor Table (GDT) pour gérer les segments de mémoire et l'activation du Protection Enable (PE) dans le registre de contrôle du processeur. Si vous vous trompez, le système se bloque ou se bloque dans une boucle de démarrage, ce qui m'est arrivé plus de fois que je ne voudrais l'admettre.

Mode réel vs mode protégé

En mode réel, tout est super limité – registres 16 bits, accès mémoire 1 Mo, aucune protection mémoire. C'est pourquoi passer en mode protégé est si important. Une fois en mode protégé, votre processeur a accès à des registres 32 bits, à un adressage mémoire plus grand et à des fonctionnalités avancées telles que le multitâche et la pagination (mémoire virtuelle). Le chargeur de démarrage a pour objectif de rendre cette transition fluide.


2. Entrer dans le noyau : là où la magie opère

Une fois que le processeur passe en mode protégé, le chargeur de démarrage confie le contrôle au noyau. Le noyau est le cœur du système d'exploitation et est responsable de tout gérer : le matériel, la mémoire, les processus et les ressources système.

Lorsque le noyau démarre, il doit configurer plusieurs systèmes critiques :

  1. Paging : Il s'agit d'un schéma de gestion de la mémoire qui permet au système d'exploitation de donner à chaque processus son propre espace mémoire virtuelle. Sans cela, tous les processus partageraient la même mémoire, ce qui mènerait au désastre.
  2. Gestion des interruptions : le noyau doit gérer les interruptions, qui sont des signaux provenant du matériel (comme les claviers ou les lecteurs de disque) indiquant que quelque chose nécessite une attention immédiate. Pour ce faire, vous devez définir une Table de descripteur d'interruption (IDT), qui mappe les interruptions à des fonctions de gestionnaire spécifiques dans le noyau.
  3. Planification des tâches : dans tout système d'exploitation qui exécute plusieurs processus, le noyau a besoin d'un moyen de gérer le temps CPU. Un planificateur décide quel processus obtient du temps CPU et à quel moment, en s'assurant que le système est réactif et efficace.

Construire le noyau est une tâche longue et complexe, mais c’est aussi l’une des plus gratifiantes. C'est ici que vous pouvez voir le fonctionnement interne d'un système d'exploitation et contrôler chaque petit détail du comportement de votre machine.


3. Choisir votre langue

Lors de la création d'un système d'exploitation, vous devez choisir le bon langage de programmation pour chaque tâche. Le bootloader est généralement écrit en assembly, car vous devez contrôler directement le matériel. Cependant, une fois que vous êtes en mode protégé et que vous travaillez sur le noyau, la plupart des développeurs passent à C car il vous donne un contrôle de bas niveau sans avoir à tout écrire en assembleur.

Certains développeurs utilisent C pour le développement du noyau, car il offre des fonctionnalités orientées objet qui peuvent faciliter la gestion de systèmes complexes. Cependant, C entraîne une surcharge supplémentaire et la gestion de la mémoire en C peut être plus délicate dans un environnement de système d'exploitation. C vous offre la puissance brute et la simplicité nécessaires à la programmation système.


4. Sécurité : n’écrasez pas l’avion

Dans le développement d'un système d'exploitation, la sécurité est essentielle. Contrairement à la programmation de haut niveau, où un crash peut simplement signifier un message d'erreur ou l'arrêt d'une application, dans le développement d'un système d'exploitation, un crash signifie généralement un redémarrage complet du système. Vous travaillez directement avec la mémoire, ce qui signifie que si vous gâchez la gestion de la mémoire, vous pouvez corrompre les données du système, écraser des structures importantes ou provoquer une panique du noyau.

Le noyau doit implémenter une protection de la mémoire pour empêcher un processus d’écraser la mémoire d’un autre. Cela se fait à l'aide de la paging, qui mappe chaque processus sur son propre espace mémoire virtuelle. Si vous vous trompez, l’ensemble du système devient instable et vous traquerez les bugs de mémoire pendant des jours. Croyez-moi, j'y suis allé.


5. Optimiser pour la vitesse

La vitesse est un facteur clé pour que votre système d'exploitation soit réactif. Un noyau lent signifie un système lent, il est donc crucial d'optimiser les performances. Voici quelques domaines clés dans lesquels la vitesse compte :

  • Gestion des interruptions : au lieu de rechercher constamment des entrées (ce qui gaspille des cycles de processeur), vous devez configurer des interruptions matérielles. De cette façon, le processeur ne répond que lorsqu'il y a une entrée réelle, comme une pression sur une touche ou l'arrivée d'un paquet réseau.
  • Planification des tâches : un bon planificateur équilibrera efficacement le temps CPU entre les processus, en s'assurant qu'aucun processus ne monopolise tout le temps CPU tandis que d'autres meurent de faim. Il existe de nombreux algorithmes de planification différents parmi lesquels choisir, comme la planification à tour de rôle ou basée sur les priorités.
  • Lazy Loading : ne chargez pas tout en mémoire en même temps. Implémentez la pagination à la demande, où seules les parties d'un programme réellement utilisées sont chargées en mémoire. Cela permet d'économiser la mémoire et d'accélérer les performances du système.

6. Configuration des pilotes de base

Maintenant que le noyau est exécuté, il est temps de créer des pilotes pour interagir avec le matériel. Les pilotes constituent le pont entre votre système d'exploitation et le matériel, permettant au système d'exploitation de communiquer avec des éléments tels que le clavier, l'écran et les lecteurs de disque.

6.1 Pilote vidéo

Au début, votre système d'exploitation démarrera probablement en mode texte, où vous imprimez des caractères directement dans la mémoire vidéo (généralement à l'adresse 0xB8000). C'est parfait pour le débogage et la sortie de base, mais à terme, vous souhaiterez passer à une interface utilisateur graphique (GUI). Cela nécessite un pilote vidéo capable de gérer le contrôle au niveau des pixels, la résolution de l'écran et la profondeur des couleurs.

La configuration d'un pilote vidéo est une étape importante vers la création d'un système d'exploitation graphique, mais c'est aussi l'une des tâches les plus complexes car elle implique de comprendre le fonctionnement de votre matériel d'affichage et de gérer de grandes quantités de données pour chaque image.

6.2 Pilote de clavier

Le pilote du clavier est l'un des éléments les plus importants d'un système d'exploitation interactif. Lorsque vous appuyez sur une touche, le clavier envoie un scancode au CPU. Le travail du pilote de clavier est de traduire ce scancode en un caractère ou une action que le système d'exploitation peut comprendre. Cela implique de configurer un gestionnaire d'interruption pour IRQ1, l'interruption matérielle générée par le clavier.

Une fois que le pilote du clavier fonctionne, vous pouvez commencer à créer des interfaces utilisateur plus complexes, en prenant en compte les entrées de l'utilisateur et en traitant les commandes.

6.3 Pilote d'E/S

Le pilote d'E/S est ce qui permet à votre système d'exploitation de lire et d'écrire sur le disque. Ceci est essentiel pour des choses comme le chargement de programmes, l'enregistrement de fichiers et le stockage de données. Au début, vous interagirez probablement avec le disque à l'aide d'interruptions du BIOS, mais à mesure que votre système d'exploitation mûrira, vous souhaiterez passer à plus

Méthodes d'E/S avancées qui ne dépendent pas du BIOS, comme communiquer directement avec le contrôleur de disque.


7. Écriture d'un shell : l'interface utilisateur

Une fois que vos pilotes de base fonctionnent, il est temps de créer un shell : l'interface de ligne de commande (CLI) qui permet aux utilisateurs d'interagir avec le système d'exploitation. Le shell est l'endroit où les utilisateurs peuvent saisir des commandes, exécuter des programmes et interagir avec le système de fichiers.

L'implémentation d'un shell est une étape passionnante car c'est l'un des premiers endroits où votre système d'exploitation commence vraiment à se sentir interactif. Vous devrez gérer les entrées de l’utilisateur (à partir du clavier), traiter les commandes et exécuter des programmes. C'est également là que vous commencez à voir l'importance de la capacité de votre noyau à effectuer plusieurs tâches et à gérer efficacement les processus.


8. Création d'un système de fichiers personnalisé

Le système de fichiers est ce qui permet à votre système d'exploitation de stocker et de récupérer des données sur le disque. Bien que vous puissiez utiliser un système de fichiers existant (comme FAT ou ext4), créer votre propre système de fichiers personnalisé vous donne plus de contrôle et peut être un défi amusant.

Un système de fichiers de base devrait :

  • Allouez de l'espace sur le disque pour les nouveaux fichiers.
  • Gardez une trace des noms de fichiers, de la taille des fichiers et des métadonnées.
  • Autoriser la lecture et l'écriture des fichiers efficacement.

À mesure que votre système d'exploitation se développe, vous devrez également gérer des fonctionnalités plus avancées telles que :

  • Répertoires : organisation des fichiers selon une hiérarchie.
  • Autorisations : contrôler qui peut lire, écrire ou exécuter des fichiers.
  • Fragmentation : gestion des fichiers répartis sur plusieurs zones du disque.

La conception d'un système de fichiers est délicate car elle implique un équilibre entre performances, fiabilité et facilité d'utilisation. Un système de fichiers mal conçu peut entraîner une corruption des données, un ralentissement des performances ou un gaspillage d'espace sur le disque.


9. Ajout d'un pilote de souris : cliquez et déplacez

Maintenant que votre système d'exploitation dispose d'une CLI et peut gérer la saisie au clavier, il est temps d'ajouter la prise en charge de la souris. Le pilote de la souris est chargé de suivre le mouvement de la souris et de le traduire en actions à l'écran, comme déplacer un curseur ou cliquer sur des boutons.

Construire un pilote de souris implique de gérer IRQ12, l'interruption matérielle générée par la souris, et de traiter les données de mouvement. Une fois le pilote de la souris en place, vous pouvez commencer à penser à créer une interface utilisateur graphique (GUI).


10. Construire une interface graphique simple

Une interface utilisateur graphique (GUI) fait passer votre système d'exploitation d'une interface de ligne de commande à quelque chose qui ressemble davantage à un environnement de bureau moderne. À ce stade, vous souhaiterez créer des fenêtres, des boutons, des menus et d’autres éléments interactifs sur lesquels l’utilisateur pourra cliquer avec la souris.

Créer une interface graphique implique de gérer le rendu graphique (dessiner des fenêtres et des icônes), de gérer les événements d'entrée (clics, pressions sur des touches, etc.) et de mettre en œuvre un système pour gérer plusieurs fenêtres et candidatures.

Au début, votre interface graphique peut être très basique : juste une seule fenêtre avec laquelle l'utilisateur peut interagir. Mais à mesure que votre système d'exploitation évolue, vous souhaiterez ajouter des fonctionnalités plus avancées telles que le redimensionnement des fenêtres, la fonctionnalité glisser-déposer et les animations.


11. Gestion des fenêtres et des événements

Une fois que vous avez mis en place les bases d'une interface graphique, l'étape suivante consiste à créer un système de gestion des fenêtres et événements. Cela implique de gérer plusieurs fenêtres à la fois, chacune exécutant potentiellement une application différente, et de s'assurer que chaque fenêtre reçoit les événements d'entrée corrects (comme les clics de souris ou les pressions sur le clavier).

Vous devrez également implémenter le ordre z de la fenêtre (quelle fenêtre est en haut), la la réduction/l'agrandissement et le le glissement. C'est là que les choses commencent à ressembler davantage à un environnement de bureau traditionnel.


12. Création d'une application Bloc-notes : du clic à la saisie

Pour rendre votre interface graphique plus fonctionnelle, vous souhaiterez créer des applications de base, comme une application Notepad. L'application Notepad est un simple éditeur de texte qui permet aux utilisateurs de saisir, modifier et enregistrer des fichiers. Créer une application comme celle-ci implique :

  • Gestion de la saisie de texte depuis le clavier.
  • Rendu du texte à l'écran.
  • Autoriser les opérations de base sur les fichiers comme ouvrir, enregistrer et fermer.

C'est un excellent exercice pour tout mettre en place : votre interface graphique, votre système de fichiers et votre gestion des entrées entrent tous en jeu ici. Une fois que votre application Bloc-notes fonctionne, vous disposerez des bases d'un système d'exploitation pleinement fonctionnel.


13. Touches finales : donner l'impression d'être un système d'exploitation

À ce stade, votre système d'exploitation est fonctionnel, mais il y a toujours de petits détails qui le rendent plus raffiné. Des choses comme :

  • Comptes d'utilisateurs et autorisations : permettre à plusieurs utilisateurs d'avoir leurs propres paramètres et fichiers.
  • Réseau : ajout de la prise en charge de TCP/IP pour que votre système d'exploitation puisse se connecter à Internet.
  • Appels système : Création d'une interface que les applications peuvent utiliser pour interagir avec le noyau.

Chaque petit détail que vous ajoutez rapproche votre système d'exploitation de la sensation d'un système complet. C'est un processus long et difficile, mais à la fin, vous aurez créé quelque chose de vraiment unique : un système d'exploitation construit à partir de zéro.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal