J'ai essayé de faire un système d'exploitation dans l'assemblage. J'ai échoué. Le code était croustillant. C'est ma deuxième tentative je suppose.
J'utilise le chargeur de démarrage Limine avec le protocole Stivale.
Étant donné que ce référentiel utilise la limine comme sous-module, vous devrez cloner ce repo récursivement en utilisant:
git clone --recursive https://github.com/soumitradev/BruhOS.git
La configuration d'un compilateur croisé est fortement recommandée si vous souhaitez compiler ce projet. Un fichier toolchain.sh de base est inclus dans la racine de ce dépôt qui installe un compilateur croisé pour la plate-forme x86_64 pour les fichiers ELF.
Après avoir installé le compilateur croisé, vous pouvez exécuter make run pour exécuter le système d'exploitation dans QEMU.
À partir de maintenant, les commandes de marque suivantes sont disponibles:
make all : faites le fichier .hdd pour le système d'exploitation. C'est ça.make disk : faites le fichier .hdd pour le système d'exploitation. C'est ça.make run : faites le fichier .hdd pour le système d'exploitation et exécutez-le dans QEMU.make log : créez le fichier .hdd pour le système d'exploitation, exécutez-le et laissez Qemu générer des journaux.make logs : créez le fichier .hdd pour le système d'exploitation, exécutez-le et laissez Qemu générer des journaux.make debug : créez le fichier .hdd pour le système d'exploitation, exécutez-le et attachez-le à GDB pour le débogage.make clean : Nettoyez le répertoire de travail et supprimez tous les artefacts de construction. L'exécution du script toolchain.sh installera le compilateur croisé à ~/.local/bin/cross_compiler/x86_64/ . Il comprend le GCC, le GDB et les binutils. Les binaires du compilateur croisé ont le préfixe x86-64-elf- . Ainsi, par exemple, pour exécuter gcc , vous devrez exécuter ~/.local/bin/cross_compiler/x86_64/bin/x86-64-elf-gcc . Remarquez comment le préfixe est apparenté au binaire que nous voulons exécuter.
Remarque: Pour rendre ce processus plus rapidement, vous devrez définir le nombre de threads en tant que variable, qui est généralement 1 de plus que le nombre de threads de votre machine. Ma machine a 8 threads, donc j'ai défini la variable THREADS dans le script toolchain.sh sur 9. Veuillez vérifier le nombre de threads que vous avez et modifier cette variable dans le script toolchain.sh en conséquence.
Au cours de la rédaction, les dernières versions GCC, GDB et BINUTILS sont respectivement de 10.2.0, 9.2 et 2,35. Si vous voulez une version différente, remplacez les variables BINUTILSVERSION , GCCVERSION et GDBVERSION dans le même script toolchain.sh .
Remarque: n'exécutez pas ce script en tant que superutilisateur. L'exécution du script nécessitera une connexion Internet stable et une tasse de café car cela prend un certain temps;)
Limine est le chargeur de démarrage le plus épique à exister.
Qword, Rock et Dropios ont été très utiles. Ce code est à peu près un clusterfuck de leur code. Leur code est bien écrit, facile à comprendre et est globalement un endroit idéal pour commencer à apprendre OSDEV.
L'OSDEV Discord Server est également un excellent endroit pour apprendre, poser des questions et est généralement une grande communauté.
Captures d'écran parce que cela ne vaut tout simplement pas le temps passé à faire tester la chaîne d'outils pour tester un noyau à moitié finis.


Tous les fichiers utilisent la norme C ++ 17, n'utilisez aucune bibliothèque standard sauf LiBGCC (évident pour le développement OS / Kernel). Tous les fichiers d'objets et les fichiers de construction du noyau doivent être nettoyés avant de s'engager à l'aide make clean ou de la suppression manuelle des fichiers. Le Gitignore comprend des filtres de base, mais toujours à double vérification que vous ne commettez aucun artefacts de construction.
Tous les fichiers, à l'exception du makefile, sont en retrait d'espace avec un retrait avec 2 espaces. Oui, j'aime 4 espaces, mais ayant une expérience antérieure, cela peut générer d'énormes structures comme des arbres, et il a l'air plus propre avec 2 indentations spatiales. Le makefile nécessite une indentation à l'onglet par définition. Le formatage le fera se casser.
Assurez-vous que vous utilisez les directives Google Formatting. Cela peut être défini dans le code vs.
Ne poussez pas les engagements sans tester et ne vous assurez pas de fonctionner.
Si les fonctionnalités de base fonctionnent car elles sont destinées à être utilisées, poussez vos commits. Je ne m'attends pas à ce que vous présaisiez chaque défaut de sécurité et le réparez avant de pousser.
Je pourrais ajouter un script de contrôle pré-poussoir plus tard qui s'assure que votre code suit ces normes.