Dies ist ein kleines Hobby -Betriebssystem, das ich mit Sachen herumspielen kann, die ich noch nie zuvor gemacht habe ... Es ist nicht beabsichtigt, funktional, nützlich, sicher oder zuverlässig zu sein. Es soll ungefähr Spaß machen, um zu implementieren.
Wenn Sie die neuesten Dinge sehen möchten, die ich vorhatte, schauen Sie sich die dev in diesem Repo an. Im Allgemeinen sollte master kompilieren und laufen.
Beginnen Sie mit librs (das Äquivalent von LIBC für dieses Projekt).
user/src/main.rs als Beispiel für Benutzerspace -Programm.cargo xbuild --target target.jsonPaging
memory::paging::map_regionNull-Kopie-Nachricht für IPC. Um eine Nachricht zu senden,
Ich spiele mit der Idee, überhaupt keine Prozesse zu haben, sondern nur eine Dags von Kontinuationen, die sich dafür entscheiden, ihre Fähigkeiten weiterzugeben oder nicht.
Derzeit ist es etwas mehr als 1500 LOC (ohne Kommentare + Whitespace + Abhängigkeiten). Nicht schlecht!
Der Kernel selbst basiert auf Fortsetzung, anstatt so etwas wie Kthreads zu verwenden. Im ersten Pass mache ich nur die Dinge zum Laufen. Später könnte ich zurückgehen und es effizient machen.
Keine Timer-basierte Vorbereitung in Kernelspace oder Userspace (obwohl Timer-Interrupts auftreten, damit Timer funktionieren können). Keine Schlösser, kein Multi-Threading im Userspace. Jeder Prozess ist einzeln und kontinuierlich basiert. Jede Continuation kann eine Reihe von zusätzlichen Kontinuationen zurückgeben, die in beliebiger Reihenfolge, einem Fehler oder nichts ausgeführt werden sollen. Kontinuationen können auch auf Ereignisse warten, wie z. B. die Beendigung eines anderen Prozesses.
Einzelner Adressraum. Alles lebt im gleichen Adressraum. Bits für Seitentabellen werden verwendet, um bestimmte Teile des Adressraums für einige Kontinuationen zu deaktivieren.
Kleiner Kernelhaufen für die dynamische Speicherzuweisung.
Buddy Allocator für die physische Rahmenzuweisung.
Buddy Allocator für virtuelle Adressraumregionen.
Einfaches Fähigkeitssystem zum Verwalten des Zugriffs auf Ressourcen im System, z. B. Speicherregionen.
Umschalten auf Usmode und Rücken.
Systemaufrufe über syscall und sysret -Anweisungen.
Laden eines positionsunabhängigen Elf-Binärs als Benutzer-Modus-Aufgabe, Ausführen und Ausgang über eine SYSCALLE.
Jetzt, wo ich einen meist funktionierenden Basic -Kernel habe, kann ich mit Sachen herumspielen!
Rost, Nacht
rustc 1.45.0-nightly (99cb9ccb9 2020-05-11) llvm-tools-preview -Rost-Verteilungskomponente über rustup component add llvm-tools-preview
cargo xbuild und cargo bootimage über cargo install cargo-xbuild bootimage
build-essentials und Standard-Utils: gcc , make , ld , objcopy , dd
qemu zu laufen
Bauen und laufen
$ cd os2/user
$ cargo xbuild --target x86_64-unknown-elf.json --release
$ cd ../kernel
$ bootimage run bootimage kann optional übergeben werden --release für optimierte Builds.