3.8 KiB
yggdrasil-kernel
Rust Unix-like operating system.
Main features
- Architecture support:
- Core features:
- Kernel/userspace preemptive multithreading
- Kernel-space multitasking with
async
/await
runtime - Symmetric Multiprocessing
- Rust-style interfaces for most of the stuff like memory management, devices etc.
- Filesystem features:
- Unix-like virtual filesystem: files, directories, block/char devices, symlinks, mounts
- In-memory read-write filesystem for tar-based initrd
- sysfs
- devfs
- ext2
- Userspace features:
- Kernel-user ABI generated from a rust-like description language
- Sanitized system calls better suited for use in Rust
- Binary formats: ELF +
#!/...
shebangs - C compatibility through a custom Rust libc
- Userspace multithreading
- Synchronization primitives through futex-like interface
- Unix-like signals and exceptions
- Dynamic loader for linking with shared libraries
- Hardware features:
- PCI Express devices
- NVMe drive support (read/write, currently x86_64 only, due to lack of MSI-X support on aarch64/i686).
- AHCI SATA drive support (read/write)
- xHCI USB host controller
- VirtIO Network + GPU framebuffer support
- USB HID keyboards
- PCI Express devices
aarch64-specific:
- PSCI for SMP start-up and power control
- PL011 serial port
- ARM generic timer as system/monotonic timer
- GICv2 IRQ controller
x86-specific:
- Boot options:
- x86_64: UEFI yboot
- i686: multiboot/grub
- I/O and Local APIC IRQ controllers
- PS/2 keyboard
- HPET for x86_64
- i8253-based timer for i686 or as a fallback timer
- COM ports
- ACPI, work in progress, mostly broken
on real hardware, so currently disabled
- ACPI shutdown
- PCI IRQ pin routing
- Events like power button, etc.
Building the OS
NOTE This project uses xtask
-style build system. To see help, use cargo xtask --help
.
Prerequisites:
- Decent CPU and a sizable amount of RAM
- ~40G of free disk space for a full build
- Patience
NOTE Full OS build requires you to build the *-unknown-yggdrasil
Rust toolchain, which may take quite a while, so be prepared.
Steps:
-
Install the prerequisite software
### 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.
-
Clone this repo
$ git clone https://git.alnyan.me/alnyan/yggdrasil $ cd yggdrasil # Optionally, checkout a release/snapshot branch
-
Run
cargo xtask toolchain
to fetch, build and link the toolchainNOTE if toolchain fetch fails for some reason, try cloning directly from
https://git.alnyan.me/yggdrasil/yggdrasil-rust.git
with appropriate branch. -
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)
- Get it running on more real hardware
- Get a full LLVM build to work
- Get rustc to work
- Get self-hosted
- Run doom (?)
In addition to eternal code cleanup, I've been doing quite a lazy job at that lately...
Navigation
- Kernel:
kernel
- Userspace:
userspace
- ABI definitions:
lib/abi-def