yggdrasil-kernel
================

Rust Unix-like operating system.

![Yggdrasil OS](/etc/screenshot.png)

Main features
-------------

* Architecture support:
	* [aarch64](kernel/src/arch/aarch64)
	* [x86_64](kernel/src/arch/x86_64)
	* [i686](kernel/src/arch/i686) (Pentium Pro and later)
* 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](lib/abi-def/yggdrasil.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/lib/ygglibc)
	* Userspace multithreading
	* Synchronization primitives through futex-like interface
	* Unix-like signals and exceptions
	* [Dynamic loader](userspace/dyn-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

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](https://git.alnyan.me/yggdrasil/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](https://github.com/rust-osdev/acpi), 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:

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

	**NOTE** if toolchain fetch fails for some reason, try cloning directly
	from `https://git.alnyan.me/yggdrasil/yggdrasil-rust.git` with appropriate
	branch.

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)
--------------------------------------

1. Get it running on more real hardware
2. Get a full LLVM build to work
3. Get rustc to work
4. Get self-hosted
5. Run doom (?)

In addition to eternal 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)
