#: Train-OS une session de formation pour construire un système d'exploitation. À partir de zéro, en utilisant uniquement des ressources d' AMD et Intel .
Toujours à la scène alpha
Ce référentiel n'est pas encore poli et doit encore être considéré au stade alpha. Le code devrait compiler et fonctionner, mais le SMS n'est que la première ébauche dont j'ai noté en plus pendant que je codais et faisais des recherches.
Qu'est-ce qui est différent des autres tutoriels?
Il y a beaucoup de tutoriels et une grande partie du matériel que je présente y est également couvert. Alors pourquoi s'embêter? J'aime particulièrement et je me suis inspiré par ceux-ci:
- Phil Todo: lien
- intermezzos: TODO: lien
Qu'est-ce qui est différent dans cette version? Quand j'apprends de nouvelles choses, j'ai souvent le sentiment que je ne sais pas / que je ne peux pas faire ce que je viens de faire par moi-même la prochaine fois. Je ne sais pas si c'est la façon dont j'apprends ou simplement une chose typique qui est facilement omise lors de la rédaction de tutoriels. Voici quelques points que je me demande régulièrement et que je veux aborder (je vais probablement manquer d'autres trucs essentiels pour compenser)
- Fournissez plus de détails sur les points simplement des conventions convenues, ce qui est une norme, ce qui est spécifique à l'architecture. Je me souviens encore quand j'ai commencé à apprendre la programmation à l'adolescence, je me suis dit "UUHH ... comment l'ordinateur sait-il que la fonction principale doit être appelée en premier", et aucun de mes amis ou professeurs ne fait que nouveau. C'était juste "magique". Ces choses me dérangent , je veux comprendre d'où viennent les choses ...
- Pointent vers la norme et travaillez à partir de là. Je ne présenterai pas une solution finie que vous copiez. Nous prenons la norme et recherchons les choses . Tout comme nous devions le faire si nous voulions exécuter le code sur Allons dire un cortex ARM au lieu de votre machine X86_64. Ou, encadré différemment, que se passe-t-il si nous serions les premiers à écrire un tutoriel, comment pourrions-nous faire fonctionner ce chargeur de démarrage, les interruptions configurées ou le CPU en mode 64 bits en premier lieu?
- Faites les choses deux fois. Je vais d'abord aller à nu, cela aide à comprendre ce qui se passe, puis, nous utilisons des outils pour éviter de faire ce travail au sol à chaque fois.
- Étapes intermédiaires et "points de contrôle"
- Donnez un contour d'abord -> pour voir la situation dans son ensemble
- Donnez des exemples dans le code réel -> par exemple que le premier bac de noyau est en fait exactement comment Linux est construit
- Présenter des alternatives / choix pour chaque
dependency que nous commençons à utiliser. Pour moi, c'est décevant si je veux suivre un tutoriel et que beaucoup de bibliothèques externes font la magie que je voulais vraiment apprendre.
Contour
Un aperçu approximatif de ce que je veux faire. Espérons, dans un ordre plus ou moins chronologique. Le fait est qu'il y a tellement de choses que nous pourrions faire qu'il est en fait assez difficile de choisir un chemin.
Tout d'abord, je voudrais mieux comprendre le processus de démarrage. Ce qui se passe avant que le chargeur de démarrage ne saute. En fait, le lancement de votre propre chargeur de démarrage (lien vers OSDEV) est une tâche énorme en soi.
Mon plan est d'explorer un peu la phase précoce du processus de démarrage. Le but de cela est de comprendre et d'apprécier ce qu'un chargeur de démarrage fait pour nous. À la fin, je voudrais avoir une compréhension approximative des différents modes de processeur, de ce qu'ils offrent et de la façon de passer au mode protégé 32 bits. L'objectif en béton est de pouvoir passer au mode protégé et imprimer Hello World! à l'écran. Tout est implémenté en assemblage et sans utiliser un chargeur de démarrage.
Après cela, je prévois de changer et d'utiliser Grub comme chargeur de démarrage. Et continuez à partir de là.
Tl; dr
- Écrivez une image minimale minimale.
- Bootloader qui imprime
Hello World en mode réel 16 bits. - Passez manuellement en mode protégé à 32 bins et imprimez
Hello World . - Passer manuellement en mode de 64 bacs
- Utilisez Grub comme chargeur de démarrage et imprimez
Hello World . - Passez en mode long (à nouveau).
- Sautez dans
C , imprimez Hello World . - Empiler
- Implémentez le pilote vidéo VGA.
- Interruptions (partie 1) - Dites au processeur où trouver des gestionnaires, dans ASM
- Interruptions (partie 2) - Déplacez le code de 10.
- Mettre en œuvre de meilleurs gestionnaires
- Débogage
- Gérer les interruptions / exceptions
- Implémentez la pagination de la mémoire.
- Noyau remap
indéterminé:
- refactoring?
- services publics (memset?)
Plus tard ...
- système de fichiers
- processus
- planification
- appels système
- Explorez la pile, provoquez des débordements et des exceptions de la pile
- Connectez-vous avec GDB via UART (pour le débogage et l'aperçu intégré)
- Réposez quelques (ou plusieurs) pièces à un processeur ARM. (J'ai une planche STM et Infineon qui traîne inutilisée)
Préressits?
Aucun. Sérieusement, n'ayez pas peur. L'intérêt de ce tutoriel est de développer toutes les connaissances requises à partir de zéro. Il n'y a qu'une seule condition que je suppose, et c'est que vous pouvez programmer décemment. Par décent, je veux dire que vous avez au moins entendu parler de la pile et du tas et que vous pouvez être productif dans une langue. Je suppose que cela devrait suffire. Après tout, nous n'essayons pas de développer le système d'exploitation traditionnel de prochaine génération ici, nous brillons à un niveau de passe-temps.
Et une chose que je peux vous assurer: même si vous ne toucherez plus jamais ce code et que vous n'écrirez plus jamais de système d'exploitation. L'expérience changera votre compréhension des systèmes sur lesquels vous travaillez profondément . Les connaissances acquises en se développant au niveau du noyau se propagent comme des graines tout au long de votre carrière et les idées s'avéreront utiles dans les moments les plus inattendus.
Scratchpad (idées non organisées à partir d'ici)
Idées
- Que fait le CPU si vous mettez des instructions après les 512 premiers octets? Sont-ils exécutés? (CPU est en mode réel 16 bits)
Contour
- Bootload -> Deux choix lancent le vôtre ou utilisent existant, par exemple, Grub.
- Mode 16 bits
- Entrer le mode protégé 32 bits
- Entrer le mode de 64 bits
- Entrez C
- Écrivez le module de gestion de la mémoire
Cycle 0 - Chaîne d'outils de l'environnement et de compilation croisée
- Vous pouvez ignorer certaines étapes. Nous n'aurons pas besoin de la chaine d'outils de compilation croisée avant de commencer à écrire du code C.
- Commencez à construire votre chaîne d'outils quelque part sous $ home
- Assurez-vous que la portée des variables d'environnement est correcte
- Des erreurs comme "n'ont pas la permission de créer un répertoire
/usr/lib/i686-elf " indique que $PREFIX n'est pas correctement défini. - Nous n'obtenons pas le «vrai» processeur nu, il y a toujours le BIOS devant nous. Il initialise le CPU et nous remet avec le CPU en mode réel.
Cycle 0 - chargeur de démarrage
Ressources
- Documentation NASM https://www.nasm.us/xdoc/2.14.02/html/nasmdoc3.html
- Manuels Intel