A kernel written in C++.
This is a kernel I wrote mostly for fun (and no profit). I tried to make use of modern C++ features to make the code clearer and easier to write.
This kernel is a work in progress that I stopped developing in the end. I tried to make use of most open-source code as possible. This includes a fork of libc++ for kernel-space and Android's bionic libc implementation for user-space. There are no drivers and the VFS part is very poor in features. My plan was to make use of open-source code for this too and maybe integrate filesystems from Linux or some micro-kernel.
- Supports only x86_64 CPUs
- Works on real hardware (I could only test on one computer)
- Memory protection
- Multi-process support
- ABI-compatible syscalls with Linux
- Can run a very light busybox
- Unit-tested
This kernel is only tested with Clang 3.8. You will need to find where your
distro has installed your compiler's headers. This includes the files
stddef.h
and stdint.h
. For me, they are in
/usr/lib/clang/3.8/include
.
I use ninja to compile, but you can use make if you prefer.
To compile:
$ mkdir build $ cd build $ CC=clang CXX=clang++ cmake .. -DCXX_COMPILER_INCLUDE=<path to your compiler's headers> -GNinja $ ninja
This will create an image that you can run in bochs, qemu or your hardware.
A module is bundled inside the image with the root filesystem, in which there is currently a compiled busybox.
The tests run on the bochs emulator. The one bundled in Debian doesn't have all the features needed, so you will need to compile your's.
I compiled mine from Debian sources of bochs-2.6:
$ apt source bochs $ cd bochs-2.6 $ ./configure --prefix=$HOME/.local --with-nogui --with-x11 --with-rfb --with-term --with-sdl --with-wx --disable-docbook --enable-cdrom --enable-pci --enable-usb --enable-usb-ohci --enable-a20-pin --enable-cpu-level=6 --enable-x86-64 --enable-avx --enable-vmx=2 --enable-fpu --enable-debugger --enable-debugger-gui --enable-disasm --enable-idle-hack --enable-all-optimizations --enable-repeat-speedups --enable-plugins --enable-compressed-hd --enable-clgd54xx --enable-sb16 --enable-es1370 --enable-ne2000 --enable-pnic $ make $ make install
After you have compiled the kernel, you can run the unit tests with:
$ ctest -VV
You can run the compiled kernel with its module in qemu with the following command, inside the build directory:
$ ninja run_flixmain
You can run it in bochs with the following command, inside the source directory:
$ bochs -f debug/bochsrc -q
You can make a bootable USB drive with the following command, inside the build directory:
$ dd if=build/source/flix_flixmain.img of=/dev/<your drive> bs=1M
You need to compile a `libc<https://github.com/blastrock/platform_bionic>`_ and then you can compile `my fork of busybox<https://github.com/blastrock/busybox>`_.