VMWos -- a homebrew operating system for the Raspberry Pi


VMWos is a very small custom operating system that runs on Raspberry Pi Hardware.
You will need a USB/serial cable to do anything useful with it.

It was written in conjunction with the ECE598: Advanced Operating Systems class that I teach at the University of Maine (Spring 2015/2016/2018).

The current release is pre-0.20, you can view the CHANGELOG.

For now, you can download the code at github:
git clone http://www.github.com/deater/vmwos

Supported Features

Missing Features

Supported Hardware

Software Support

Executables: Runs ARM bFLT executables compiled with -fPIC linked against included "vlibc" C library.

Filesystems: romfs running on top of ramdisk

Screenshots and News

12 April 2018

Work in progress on multicore support. It actually can start all four CPUs, but I don't have locks in the console so the output gets all run together.

6 April 2018

Have framebuffer support mostly working again (though still slow). Amazingly works on pi3, despite the fact I can't get the temperature/mailbox to work still.

27 March 2018

Pi-3B+ support added.

25 March 2018

Have MMU memory protection (kernel vs user) finally working, at least on Pi3. Having issues with enabling cache on the Pi3 though.

23 March 2018

Have bflt binary support finally working.

7 March 2018

Code should now work on both Pi2 and Pi3 models now. You might need recent firmware on all models, as it assumes a 48MHz UART clock now.

A huge host of changes had to be made to get it to run on the newer machines and firmware. The biggest was writing a device-tree parser.

There was also a really tricky to debug issue where the aplus DRAM was initializing to zero but the pi3 was initializing to 555555 and some code was accidentally being setup properly due to this.

20 May 2016

Finally have blocking I/O working! Look at this sysinfo update, notice that the system is spending most of its time in the idle thread. This is because console_read() and sleep() both block, putting processes to sleep and the idle thread finally gets to run.

Here's a before shot showing that it didn't idle previously. Also note that we leak memory and processes (i.e. processes aren't freed after an exit() ). Need to fix that.

17 May 2016

Finally implemented enough syscalls (and subdirectory support) that ll now runs under my OS. Had to manually generate PIC assembly code, which wasn't fun.

13 May 2016

Demo of the 0.13 release in action:

Relive the 1990s: the framebuffer console has been extensively tested and supports enough ANSI control characters to display most BBS ANSI art.

April 2015

Version 0.10 showing classic AB multitasking support:

An EeePC acting as a terminal for a Raspberry Pi Model A+ running VMWos:

The local royalty was unimpressed by the A/B multitasking demo:

Performance Numbers

Some results when trying to get maximum memset() performance.

Raspberry Pi A+/B BCM2835 700MHz LPDDR2 RAM

Each test is 16 repititions of a 1MB memset()

1-byte is just a simple loop, one byte at a time.
4-byte is a simple loop, writing an int at a time.
64-byte uses the arm "stm" instruction to write 64B at a time.
No Cache C 1-byte 936754552 1.338s 12.0 MB/s
L1-I$ C 1-byte 355098645 0.507s 31.5 MB/s
L1-I$+brpred C 1-byte 271038891 0.387s 41.3 MB/s
L1-I$+brpred+D$C 1-byte 116346597 0.166s 96.3 MB/s
No Cache C 4-byte 205749402 0.294s 54.4 MB/s
L1-I$ C 4-byte 67745267 0.097s 165 MB/s
L1-I$+brpred C 4-byte 63533353 0.091s 176 MB/s
L1-I$+brpred+D$C 4-byte 28633484 0.041s 391 MB/s
No Cache ASM 64B 23437080 0.0335s 478 MB/s
L1-I$ ASM 64B 17749501 0.0253s 631 MB/s
L1-I$+brpred ASM 64B 18006681 0.0257s 622 MB/s
L1-I$+brpred+D$ ASM 64B 8829849 0.0126s 1268 MB/s
Theoretical Maximum speed of LPDDR2@400MHZ = 8GB/s
Linux glibc memset() maxes out around 1400 MB/s

Back to the VMW Software Productions website