Il s'agit d'un petit système d'exploitation pour jouer avec des choses que je n'ai jamais faites auparavant ... elle n'est pas destinée à être fonctionnelle, utile, sécurisée ou fiable. Il est censé être approximativement amusant à mettre en œuvre.
Si vous voulez voir les dernières choses que je fais, consultez la succursale dev sur ce dépôt. Généralement, master doit compiler et fonctionner.
Commencez sur librs (l'équivalent de LIBC pour ce projet).
user/src/main.rs comme exemple de programme d'espace utilisateur.cargo xbuild --target target.jsonPagination
memory::paging::map_regionMessage zéro-copie qui passe pour IPC. Pour envoyer un message,
Je joue avec l'idée de ne pas avoir de processus du tout, juste des dags de continuations qui peuvent ou non choisir de transmettre leurs capacités.
Actuellement, c'est un peu plus de 1500 LOC (sans compter les commentaires + espace + dépendances). Pas mal!
Le noyau lui-même est basé sur la continuation, plutôt que d'utiliser quelque chose comme Kthreads. Dans la première passe, je fais juste fonctionner les choses. Plus tard, je pourrais revenir en arrière et le rendre efficace.
Aucune préemption basée sur le temporisateur dans KernelSpace ou l'espace utilisateur (bien que les interruptions de minuterie se produisent afin que les minuteries puissent fonctionner). Pas de verrous, pas de multi-threading dans l'espace utilisateur. Chaque processus est unique et basé sur la continuation. Chaque Continuation peut renvoyer un ensemble de continuations supplémentaires à exécuter dans n'importe quel ordre, une erreur ou rien. Les continuations peuvent également attendre des événements, tels que les E / S ou la résiliation d'un autre processus.
Espace d'adresse unique. Tout vit dans le même espace d'adressage. Les bits d'entrée de table de page sont utilisés pour désactiver certaines parties de l'espace d'adressage pour certaines continuations.
Tas de petit noyau pour l'allocation de mémoire dynamique.
Buddy Allocator pour l'allocation de trame physique.
Buddy Allocator pour les régions d'espace d'adresse virtuelle.
Système de capacité simple pour gérer l'accès aux ressources du système, telles que les régions de mémoire.
Passer à Usermode et dos.
Appels système via des instructions syscall et sysret .
Chargement d'un elfe indépendant de la position comme une tâche en mode utilisateur, l'exécuter et sortir via un système.
Maintenant que j'ai un noyau de base principalement fonctionnel, je peux commencer à jouer avec des trucs!
Rust, Nightly
rustc 1.45.0-nightly (99cb9ccb9 2020-05-11) llvm-tools-preview RUST DISTRIBUTION COMPANANT via rustup component add llvm-tools-preview
cargo xbuild et cargo bootimage via cargo install cargo-xbuild bootimage
build-essentials and Standard Utils: gcc , make , ld , objcopy , dd
qemu à courir
Pour construire et courir
$ cd os2/user
$ cargo xbuild --target x86_64-unknown-elf.json --release
$ cd ../kernel
$ bootimage run bootimage peut éventuellement être passé --release pour les versions optimisées.