yggdrasil-kernel ================ Rust Unix-like operating system. ![Yggdrasil OS](/etc/screenshot.png) Main features ------------- * Architecture support: [aarch64](/kernel/src/arch/aarch64) and [x86_64](/kernel/src/arch/x86_64) * Kernel/userspace preemptive multithreading * Kernel-space multitasking with `async`/`await` runtime * Symmetric Multiprocessing * Unix-like virtual filesystem: files, directories, block/char devices, symlinks, mounts * [Kernel-user ABI](/lib/abi-def/yggdrasil.abi) generated from a rust-like description language * In-memory read-write filesystem for tar-based initrd * sysfs/devfs * Binary formats: ELF + `#!/...` shebangs * Rust-style interfaces for most of the stuff like memory management, devices etc. * PCI Express devices * NVMe drive support (read/write, currently x86_64 only, due to lack of MSI-X support on aarch64). * AHCI SATA drive support (read/write) * xHCI USB host controller * USB HID keyboards aarch64-specific: * PSCI for SMP start-up and power control * PL011 serial port * ARM generic timer as system/monotonic timer * GICv2 IRQ controller x86_64-specific: * UEFI boot through [yboot](https://git.alnyan.me/yggdrasil/yboot) (no plans for legacy boot) * I/O and Local APIC IRQ controllers * PS/2 keyboard * i8253-based timer (got some problems with HPET on real hw, had to revert, lol) * COM ports * ACPI, [work in progress](https://github.com/rust-osdev/acpi), mostly broken on real hardware * ACPI shutdown * PCI IRQ pin routing * Events like power button, etc. * Fancy framebuffer console Userspace features: * Sanitized system calls better suited for Rust * Userspace threads * Synchronization primitives through futex-like interface * Unix-like signals and exceptions Building the OS --------------- Prerequisites: * Decent CPU and a sizable amount of RAM * ~20G of free disk space * Patience **NOTE** Full OS build requires you to build the `*-unknown-yggdrasil` Rust toolchain, which may take quite a while, so be prepared. Steps: 0. Install the prerequisite software ```bash ### For Arch Linux based systems # pacman -Sy cmake ninja llvm dosfstools mtools ### For MacOS $ brew install cmake ninja llvm dosfstools mtools $ export PATH="$PATH:/opt/homebrew/Cellar/llvm/.../bin" ``` **NOTE** Nightly Rust version and rustup are required, for details see the [rustup page](https://rustup.rs/). 1. Clone this repo ```bash $ git clone https://git.alnyan.me/alnyan/yggdrasil $ cd yggdrasil # Optionally, checkout a release/snapshot branch ``` 2. Run `cargo xtask toolchain` to fetch, build and link the toolchain 3. Run `cargo xtask` to build the OS. Once the OS has been built, you can run it in QEMU by executing `cargo xtask qemu`. For more `xtask` commands, see `cargo xtask --help`. General plans (in no particular order) -------------------------------------- * Better unification of architecture code * `async` for VFS (?) * Code cleanup, I've been doing quite a lazy job at that lately... Navigation ---------- * Kernel: [`/kernel`](/kernel) * Userspace: [`/userspace`](/userspace) * ABI definitions: [`/lib/abi-def`](/lib/abi-def)