Il s'agit du premier système d'exploitation que j'ai créé. Il est écrit en deux langues: C et assemblage.
Ce projet est activé depuis le 15 décembre 2017

Plan de travail
Chargeur de démarrage
Coutume
Secteur de démarrage
Étape 2
VER
Noyau
Gestion de la mémoire
Allocateur de trame de page
Allocation de mémoire dynamique
Système de construction
Écrire du texte à VGA
Interruption du CPU (IDT, ISRS, IRQS, etc.)
Lire le caractère du clavier PS / 2
Lire la chaîne du clavier PS / 2
Mémoire virtuelle (pagination, cadres, etc.)
Attribution et désallocation du cadre de page
Attribution de la mémoire dynamique (liballoc)
Minuterie du processeur
Obtenir des informations CPU
Horloge en temps réel: nous pouvons donc savoir quand le film commence
Trace de pile du noyau
Multitâche
Processus en mode utilisateur
Conducteur de disque dur
Pilote de disquette
Système de fichiers
Interface utilisateur graphique
Ce système d'exploitation utilise un chargeur de démarrage à 2 étapes. Dans le cas où la deuxième étape est lorsque nous avons entré le mode protégé et appelle le noyau.
Les 512 premiers octets de mon image de disquette contient le secteur de démarrage qui fait beaucoup de choses que le mode protégé ne peut pas faire. (par exemple, charger des trucs du disque). Ensuite, il passe à la deuxième étape chargée à 0x7E00 (juste après le secteur de démarrage).
Cette étape charge le GDT et entre en mode protégé , puis il copie le noyau chargé par secteur de démarrage à 0x1000 à 0x100000 (1 Mo). En dernier saut!
La taille du noyau augmente toujours, mais je ne peux pas toujours augmenter les secteurs à charger. Comme solution. Je décide d'utiliser Grub. Le noyau est stocké sous forme d'image ELF ( kernel.img ) dans un CD qui utilise ISO 9660 comme système de fichiers. Grub prend également en charge Multiboot, de sorte que mon système d'exploitation peut fonctionner avec d'autres (Windows, Linux, etc.).
Nous avons entré le mode protégé, ce qui signifie que nous n'avons pas accès aux fonctions du BIOS. Ainsi, ce noyau doit réimplémenter ces fonctions pour contrôler le matériel.
Maintenant, j'ai réimplémenté les périphériques standard: écran et clavier. Dans le développement ultérieur. Je vais implémenter le pilote de disque.
Ce système d'exploitation utilise à la fois la segmentation et la pagination pour fournir une protection de la mémoire. Dans ma table de descripteurs globale , j'ai mis 5 descripteurs de segments:
Segment nul
Segment de code pour le noyau : le segment où appartient mon code du noyau
Segment de données pour le noyau : le segment où appartiennent mes variables globales du noyau
Segment de code pour l'utilisateur : n'utilise actuellement pas
Segment de données pour l'utilisateur : Identique à 4
Je permets également la pagination. Maintenant, j'ai intentionnellement exploité la quatrième page du premier tableau de page à not-present et read-only , vous pouvez donc générer un défaut de page en exécutant bsod dans la ligne de commande de mon système d'exploitation.

Ce noyau fournit un allocateur de trame de page , de sorte que la gestion de la mémoire sera plus pratique et je serai plus facile d'approcher le multitâche.
Comme le suggère le tutoriel de Jamesm, j'utiliserai un ensemble de bits pour déterminer si un cadre est gratuit ou non.
1: Allocated 0: Free
v v
frame_bitset: 11110111110101111101111111
^
get_free_frame()
J'ai actuellement mis en œuvre un placement malloc sans libres car toutes les variables utilisées par le noyau n'ont jamais besoin d'être libérées avant les pouvoirs.
Heap Allocation
-----------------------------------------------
Allocated |
Memory | Free.......until the end of memory
|
-----------------------------------------------
Parce que je suis paresseux, je porte un allocateur de mémoire tiers appelé liballoc qui n'a nécessité que quelques fonctions dans mon système d'exploitation.
Ce projet utilise la marque GNU pour construire. Ainsi, la façon de construire est de taper make , si des problèmes se produisent pendant la construction, tapez make dep avant make . Ouvrez un problème s'il est toujours coincé.
Si vous n'utilisez pas Linux ou WSL (sous-système Windows pour Linux), vous devrez télécharger un compilateur croisé à partir d'ici. Modifiez ensuite CC et LD dans config.mk .