VIMIX OS is a small Unix like OS which started as a fork of xv6 (which is a partial re-implementation of Unix version 6 for RISC V 32 and 64-bit).
See README-xv6 for original xv6 contributors.
Compile and try out:
- Build requirements and instructions.
- How to run on qemu.
- Overview of the directories.
- The kernel.
- The user space.
How it looks like (text mode via UART only) running on qemu:
init device riscv,plic0... OK (8,0)
init device ns16550a... OK (13,0)
VIMIX OS 64 bit (RISC V) kernel version 36bb03d is booting
Console: ns16550a
Timer source: sstc extension
init memory management...
init process and syscall support...
init filesystem...
init remaining devices...
init device /dev/null... OK (3,0)
init device /dev/zero... OK (4,0)
init device /dev/random... OK (10,0)
init device google,goldfish-rtc... OK (6,0)
init device syscon... OK (7,0)
init device virtio,mmio... OK (1,0)
init device virtio,mmio... OK (1,1)
fs root device: virtio,mmio (1,0)
SBI implementation: OpenSBI (version 65541)
SBI specification: v2.0
SBI extension SRST detected: register SBI reboot/shutdown functions
init userspace...
CPU 0 starting
CPU 2 starting
CPU 3 starting
CPU 1 starting (boot CPU)
forkret() mounting /... OK
forkret() loading /usr/bin/init... OK
init mounting /dev... OK
init mounting /sys... OK
init mounting /home... OK
init starting /usr/bin/sh
$ ls
drwxr-xr-x 1104 B .
drwxr-xr-x 1104 B ..
drwxr-xr-x 64 B usr
.rwxr-xr-x 5311 B README.md
drw-rw---- 0 B dev
drwxr-xr-x 1024 B etc
drwxr-xr-x 112 B home
drw-rw---- 0 B sys
drwxr-xr-x 7168 B tests
$ cat README.md | grep RISC | wc
4 78 607
$ fortune
I'd spell creat with an e. - Ken Thompson when asked what he would do differently if he were to redesign UNIX
$
- Added documentation in
docs
. - Cleanups: Reorganized code, separate headers, renamed many functions and variables, using stdint types, general refactoring, reduced number of GOTOs, ...
- Support 32-bit RISC V (in addition to 64-bit), both booting in M-mode and S-mode in a SBI environment. Inspired by a 32-bit xv6 port by Michael Schröder (https://github.com/x653/xv6-riscv-fpga/tree/main/xv6-riscv).
- The user space tries to mimics a real UNIX. Some apps can get compiled unchanged for Linux too.
- Changed memory map; app stacks grow dynamically.
- Added applications:
- Added syscalls:
- Support multiple devices, not just two hard coded ones.
- Added devices:
- xv6 file system was changed to differentiate between character and block devices. It was also moved behind a virtual file system abstraction.
- Parse the device tree at boot.
- Added /dev as a special file system exposing all devices.
- Added /sys as a special file system exposing various kernel objects.
- Boot in M-mode now mimics SBI to the S-mode kernel.
- Added a buddy allocator.
kmalloc()
now supports smaller allocations of one page via a slab allocator (see memory_management). - Added Inter Processor Interrupts.