VMWos -- a homebrew operating system for the Raspberry Pi

Background

VMWos is a very small custom operating system that runs on Raspberry Pi Hardware (but not the Pi2 or Pi3). 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).

The current release is 0.15, 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 executables compiled with -fPIC linked against included "vlibc" C library.

Filesystems: romfs running on top of ramdisk


Screenshots and Action shots

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 used to idle. 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.
 
HardwareSoftwarecyclestimeMB/s
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