JSIX est un système d'exploitation multicore X64 personnalisé que je construit à partir de zéro. Il est loin d'être terminé, ou même d'utiliser (voir la section de statut et de feuille de route ci-dessous), mais toutes les fonctionnalités principales du noyau actuellement planifiées sont désormais mises en œuvre à au moins un niveau passable.
Les objectifs de conception du projet sont:
Modernité - Je ne suis pas intéressé à concevoir pour les systèmes hérités ou à fonctionner sur tout le matériel. Mon objectif n'est que des architectures de 64 bits et du matériel de base moderne. Actuellement, cela signifie x64 systèmes avec Nehalem ou CPUS plus récents et firmware UEFI. (Voir cette liste pour les fonctionnalités CPU actuellement requises.) Finalement, j'aimerais travailler sur un port AARCH64, en partie pour me forcer à prendre en compte les pièces dépendantes de l'architecture de la base de code.
Modularité - Je voudrais retirer autant de systèmes que possible dans des processus séparés, à la manière des micro-verres. Un sous-objectif de ceci est d'explorer où se trouvent les goulots d'étranglement d'un tel micro-aurenel, et si le matériel hérité évitant me permettra de concevoir un système moins embourbé par les problèmes traditionnels du micro-aure nu.
Exploration - Je fais vraiment cela pour m'amuser à apprendre et à explorer le développement moderne du système d'exploitation. Les premières implémentations des fonctionnalités peuvent temporairement jeter la conception modulaire pour permettre l'exploration du matériel connexe.
Une note sur le nom: ce noyau a été initialement nommé pop-corn, mais j'ai depuis découvert que le projet Linux Popcorn développe également un noyau avec ce nom, a commencé à peu près en même temps que ce projet. J'ai donc renommé ce noyau JSIX (toujours stylé JSIX ou j6 , jamais capitalisé) en hommage à L4, XV6 et à ma merveilleuse femme.
Les principaux domaines suivants sont des cibles pour le développement JSIX:
Fait. Le chargeur de démarrage charge le noyau et les programmes d'espace utilisateur initial et configure les arguments du noyau nécessaires sur la carte mémoire et le framebuffer EFI GOP. Idées futures possibles:
Mémoire virtuelle: suffisant. Le noyau gère la mémoire virtuelle avec un certain nombre de types d'objets vm_area représentant des zones mappées, qui peuvent appartenir à un ou plusieurs objets vm_space qui représentent un espace de mémoire virtuel entier. (Chaque processus a un vm_space , tout comme le noyau lui-même.)
Rester à faire:
Attribution de la page physique: suffisant. L'implémentation actuelle de l'allocateur de pages physiques utilise un groupe de blocs représentant des zones de mémoire up-1 de mémoire utilisables telles que définies par le chargeur de démarrage. Chaque bloc a un bitmap à trois niveaux indiquant des pages gratuites / utilisées.
Travaux futurs:
Suffisant. L'objet Global Scheduler conserve des listes prêtes / bloquées séparées par noyau. Les noyaux tentent périodiquement d'équilibrer la charge par vol de travail.
Les tâches de l'espace utilisateur sont capables de créer des threads ainsi que d'autres processus.
Syscalls: suffisant. Les tâches de l'espace utilisateur sont capables de faire des systèmes au noyau via des instructions rapides Syscall / Sysret. Les systèmes réalisés via libj6 consultent à la fois les appels de fonction Sysv ABI standard de Callee et de l'appelant. Les implémentations sont enveloppées dans des fonctions de wrapper générées qui valident la demande, vérifiez les capacités et recherchent les objets ou les poignées du noyau appropriés avant d'appeler les fonctions d'implémentation.
IPC: fonctionnement, a besoin d'optimisation. Les primitives IPC actuelles sont:
JSIX utilise l'outil Ninja Build et génère les fichiers de build pour lui avec le script configure . La version repose également sur une chaîne d'outils personnalisée Sysroot, qui peut être téléchargée ou construite à l'aide des scripts dans JSIX-OS / Chain d'outils.
Autres dépendances de construction:
Le script configure a des dépendances Python - ceux-ci peuvent être installés via pip , bien que le faisant dans un environnement virtuel Python soit recommandé. L'installation via pip installera également ninja .
Un système Debian 11 (Bullseye) peut être configuré avec les dépendances de construction nécessaires en exécutant les commandes suivantes à partir de la racine du référentiel JSIX:
sudo apt install clang lld nasm mtools python3-pip python3-venv
python3 -m venv ./venv
source venv/bin/activate
pip install -r requirements.txt
peru sync Construisez ou téléchargez la chaîne d'outils Sysroot comme mentionné ci-dessus avec JSIX-OS / Chain d'outils et SymLink The Build Toolchain Directory en tant que sysroot à la racine de ce projet.
# Example if both the toolchain and this project are cloned under ~/src
ln -s ~ /src/toolchain/toolchains/llvm-13 ~ /src/jsix/sysroot Une fois la chaîne d'outils configurée, l'exécution du script ./configure (voir ./configure --help pour les options disponibles) configurer la configuration de build, et ninja -C build (ou partout où vous mettez le répertoire de construction) exécutera réellement la version. Si vous avez installé qemu-system-x86_64 , le script qemu.sh sera exécuté JSIX en mode Qemu -nographic .
Personnellement, je dirige cela à partir d'une véritable machine de Debian AMD64 Bullseye ou d'une installation Windows WSL Debian Bullseye. Votre kilométrage peut varier avec les autres configurations et distros.
JSIX dispose désormais du programme test_runner Userspace qui exécute divers tests automatisés. Il n'est pas inclus dans la version par défaut, mais si vous utilisez le manifeste test.yml , il sera construit et peut être exécuté avec le script test.sh ou le script qemu.sh
./configure --manifest=assets/manifests/test.yml
if ./test.sh ; then echo " All tests passed! " ; else echo " Failed. " ; fi