Nightingale is an operating system for x86_64 that I have been developing for 7 years to learn about low-level programming and operating system design.
Nightingale implements a mostly POSIX-like userland, though compliance is not a goal. I see POSIX as useful as a well-understood and documented interface, and one that permits compatability with large amounts of existing software.
For more specific feature and capability information, see ABOUT.md.
Nightingale uses the CMake build system, and you can find package requirements in the GitHub Actions workflow files.
- To build, execute
make
in the root of the project. - To run, use
./run.rb
- its help text will show the available options
doc
: Documentationinclude
: Header files for the whole systeminterface
: Interface definitions for syscalls and errno valueskernel
: The core of the operating systemlibc
: Common userland routines, including things likeprintf
linker
: Kernel module loader, userland dynamic linker, andlibelf
script
: Utility scripts for building and developing nightingaletoolchain
: CMake toolchain filesuser
: In-tree usermode programs distributed with the system
bt.bash
: convenience wrapper aroundaddr2line
for backtracingdump.bash
: convenience wrapper aroundobjdump
format.bash
: convenience wrapper aroundclang-format
make.bash
: core build engine for the projectrun.rb
: convenience wrapper aroundqemu-system-x86_64
These manifest files define the public syscall interface of the nightingale kernel, they are rendered into C enums and metadata that is used by both the kernel and the C library.
ERRNOS
: defines the values oferrno
, their names, and theirperror
stringsSYSCALLS
: defines syscall numbers, types, and arguments