Skip to content

Repository files navigation

aplus #os

GitHub release (latest by date) License: GPL

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.

🔥 Features

  • Hybrid kernel: modular design with loadable kernel objects, see drivers/*
  • Cross-platform: arch/*, designed for cross-platform environment targets. x86_64 is the target that boots and runs today; i686 and aarch64 are placeholders
  • Multitasking: processes and threads (fork, vfork, clone, execve) with SMP support
  • Virtual memory: on-demand paging with mmap, mprotect and brk
  • 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, fork inheritance and poll work on them like any other
  • Unix-like: Signals, Pipes, Futex, Unix domain sockets, TTY and PTY
  • I/O Multiplexing: poll, ppoll, select and pselect
  • 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.


aplus v0.7 - desktop running on Qemu

:electron: Kernel

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

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.


aplus v0.7 - gl-gears drawing into a window above the terminal that launched it

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.


aplus v0.7 - BusyBox httpd serving a page to a browser on the host

🔌 Drivers

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.

Notable modules


⚡ Getting Started

  1. Clone this repository and change working directory.
$ git clone https://github.com/kwrx/aplus
$ cd aplus

Build from Linux:

It's recommended you use a recent Linux host environment with this method.

Some packages are required for the build system:

  • git, make, autoconf, automake (or build-essential on Ubuntu/Debian)
  • gcc, ld to compile sources and link objects
  • python3 to run some build scripts
  • mke2fs, mkfs.vfat, mcopy, mmd, sgdisk, grub-mkstandalone, dd, truncate, fc-scan to generate hdd image
  • tar, gzip, zip, find, awk, od for the remaining build steps
  • qemu or VirtualBox to run Virtual Machine

  1. Configure and check environment
$ ./configure

This opens the Kconfig menu. To build a preset from build/setup without it:

$ ./configure --kconfig x86_64
  1. Build it
$ ./makew all
  1. Run it
$ ./makew run

Use ./makew run-headless to run without a graphical display, which is handy to capture console output.


📚 Documentation

  • FEATURES.md — per-architecture and per-subsystem feature matrix
  • SYSCALLS.md — the syscall table
  • REPORT.md — outstanding TODO/FIXME markers in the tree

🌐 Third-Party Software:

aplus uses and depends on a large number of third-party open-source tools and libraries which are outside of this repository.

📃 License

This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.

About

A hobby operating system built mostly from scratch

Topics

Resources

Stars

9 stars

Watchers

3 watching

Forks

Releases

Used by

Contributors

Languages