aplus is a Unix-like operating system built almost entirely from scratch — a hybrid kernel with loadable kernel modules, its own drivers, and a small userspace on top. The kernel is written in C, with assembly for the architecture-specific parts; the cross toolchain builds C and C++ programs to run on it.
It started in September 2013 as a way to learn low-level and systems programming, and it is still a hobby project rather than a production system. Today it boots on x86_64 and provides a Linux-like syscall layer, a VFS with several filesystems, an lwIP TCP/IP stack, SMP multitasking and an early graphical stack — with a good deal still unimplemented.
- Hybrid kernel: modular design with loadable kernel objects, see drivers/*
- Cross-platform: arch/*, designed for cross-platform environment targets.
x86_64is the target that boots and runs today;i686andaarch64are placeholders - Multitasking: processes and threads (
fork,vfork,clone,execve) with SMP support - Virtual memory: on-demand paging with
mmap,mprotectandbrk - Filesystems: kernel/fs/, a VFS with ext2, ISO 9660, tmpfs, procfs and bindfs
- Network: kernel/network/, almost full TCP/IP Network Stack by lwIP, reachable through BSD sockets — ordinary file descriptors, so
dup2,forkinheritance andpollwork on them like any other - Unix-like: Signals, Pipes, Futex, Unix domain sockets, TTY and PTY
- I/O Multiplexing:
poll,ppoll,selectandpselect - ELF: static executables; dynamic linking is not supported yet
- Linux Syscalls: Linux-like syscall layer, see SYSCALLS.md
- Linux Framebuffer: Linux-like framebuffer support, with damage-based flushing and a hardware cursor plane on adapters that provide one
- Virtio: Virtio devices (gpu, input, console, random) over Virtio PCI
- GUI: a display server that owns the framebuffer and the input devices, draws window decorations itself, and hands out windows to clients over a Unix socket
See FEATURES.md for more information about features.
The kernel provides a basic unix environment with a minimal subset of posix stuff. It is a hybrid kernel: core subsystems are built in, while drivers are loadable kernel objects linked and started at runtime by the module loader.
- Tasking, per-CPU run queues with SMP support, signal delivery and futex-based sleeping
- Memory, kernel/mm/, physical memory manager and kernel heap on top of on-demand paging
- IPC, kernel/ipc/, spinlocks, semaphores, futexes and Unix domain sockets
- VFS, kernel/fs/, inode-based virtual filesystem with a dentry cache and an I/O scheduler
- Network, kernel/network/, the lwIP stack wired up to the socket syscalls
- Syscalls, kernel/syscalls/, one file per entry, numbered from syscalls.json
It currently boots and runs on x86_64; support for other architectures such as i686 and aarch64 is still to be written.
Userspace is still under development, and is assembled from two sources: the programs built from this repository, and prebuilt packages fetched at ./configure time from aplus-packages.
Built here: the init system and its init.sh boot script, a display server with its client library, a terminal emulator on top of libtsm and cairo, the kilo editor, nyancat, an IRC client, a pair of MesaGL demos (gears and a shaded triangle), and a set of test programs — guest-side integration tests, run from the shell, covering signals, pipes, pseudo-terminals, sockets, select, the virtual memory manager and the virtio device nodes.
Pulled in as packages by the default x86_64 preset: BusyBox, the dash and bash shells, system fonts, cursors and keymaps, the zlib, libpng, libwebp, freetype, pixman and cairo libraries, plus Doom and a NES emulator. Others are optional and off by default — among them gcc, binutils, MesaGL, a Javascript interpreter and a very simple Java Virtual Machine — and can be toggled from the Kconfig menu.
Furthermore, userspace has a multi-user environment with superuser (root) and a unix-like filesystem with /proc and /dev implementation.
Graphical programs are windowed rather than each taking over the screen: aplus-wm owns /dev/fb0 and the input devices, draws every titlebar and border itself, and hands clients a buffer to draw into through libui. The terminal emulator and the MesaGL demos are ordinary clients of it. Where the adapter composites a cursor plane of its own — virtio-gpu does — the pointer moves without touching the framebuffer at all. Below, the gl-gears demo draws into a window of its own, stacked above the terminal that launched it — both frames drawn by the server rather than by the programs inside them.
Networked programs work end to end: below, BusyBox httpd is serving /var/www from inside the guest to a browser on the host, over the forwarded port set up by run-qemu.
Drivers are loadable kernel objects: one directory with a main.c per module, each declaring its identity and dependencies through MODULE_NAME()/MODULE_DEPS() and exporting init/dnit entry points. The tree currently builds 31 of them, covering device-class interfaces, char and block devices, terminals, input, network, video and virtio.
- Device Interface, dev/*, provides a standard interface for drivers (block, char, network, video, pci)
- AHCI (Advanced Host Controller Interface), platform/pc/block/ahci, almost full SATA/SATAPI driver
- Bochs VGA, platform/pc/video/bochs-vga, Bochs Virtual VGA Adapter
- VMware VGA, platform/pc/video/vmware, VMware SVGA II Adapter
- Intel e1000 (Network device), platform/pc/network/e1000, Intel NIC driver
- PCNET (Network device), platform/pc/network/pcnet, AMD PCnet NIC driver
- PS/2, platform/pc/input/ps2, keyboard and mouse
- TTY, tty/*, terminal devices,
/dev/ptmxand pseudo-terminal pairs - VirtIO, virtio/*, VirtIO device interfaces over VirtIO PCI — gpu with damage flushing and a cursor plane, input for absolute pointing devices, plus console and random
- Clone this repository and change working directory.
$ git clone https://github.com/kwrx/aplus
$ cd aplusIt's recommended you use a recent Linux host environment with this method.
Some packages are required for the build system:
git,make,autoconf,automake(orbuild-essentialon Ubuntu/Debian)gcc,ldto compile sources and link objectspython3to run some build scriptsmke2fs,mkfs.vfat,mcopy,mmd,sgdisk,grub-mkstandalone,dd,truncate,fc-scanto generate hdd imagetar,gzip,zip,find,awk,odfor the remaining build stepsqemuorVirtualBoxto run Virtual Machine
- Configure and check environment
$ ./configureThis opens the Kconfig menu. To build a preset from build/setup without it:
$ ./configure --kconfig x86_64- Build it
$ ./makew all- Run it
$ ./makew runUse ./makew run-headless to run without a graphical display, which is handy to capture console output.
- FEATURES.md — per-architecture and per-subsystem feature matrix
- SYSCALLS.md — the syscall table
- REPORT.md — outstanding
TODO/FIXMEmarkers in the tree
aplus uses and depends on a large number of third-party open-source tools and libraries which are outside of this repository.
This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.


