Ignis is an open source hobby OS meant to gain experience with low level concepts and implementations. This is a learning project, and I hope to expand it to learn more about all of the concepts. I am using a variety of tools to facilitate my learning, including CPU documentation, hardware docs, and some genAI tools to help me learn.
This is NOT a Linux distribution or UNIX system. It is currently just a kernel(userspace in the future), built from nothing.
- It is designed for 64-bit systems for the x86 instruction set
- It uses a custom Multiboot2 compatible boot header with GRUB2
- For testing and developing, it is emulated using QEMU
- For a full feature list, look here
A Unix-like host OS is expected for building and running IGNIS OS. Linux with a mainstream distribution is recommended but macOS will likely work as well, though it has not been tested. Windows is only supported via WSL2.
- A modern C compiler(GNU
gccrecommended) - A linker (GNU
ldrecommended) - An assembler (
nasmrecommended) - grub-mkrescue
make
- You must install the QEMU emulator to for this project.
- It is expected by
make runto emulate the ignis.iso image created bymake
Steps:
- Install build dependencies.
- Clone the repo with
git clone https://github.com/jkelley129/IGNIS-OS.git && cd IGNIS-OS - Compile and package the project with
makeormake all- The
Makefilecreates a ignis.iso file in iso/boot/ that is emulated by QEMU
- The
- If running with a disk image, run
make disks,make disk-ata, ormake disk-nvme. Note that only ATA is working at the moment - Run the QEMU emulator with
make runif not working with disks, else usemake run-full,make run-ata, ormake run-nvmefor your disk
Features in rough chronological order of implementation
- Console layer for outputting text to the screen via VGA
- Interrupt Descriptor Table for handling interrupts(keypresses, hardware interrupts)
- Interactive kernel-level shell for debugging and functionality
- Programmable Interval Timer with interrupt handling
- Custom memory allocator, with a simple free list implementation
- In-memory filesystem with simple utilities(create, list, copy, delete, etc.)
- Agnostic block device I/O layer
- Block device drivers
- ATA
- Error handling with enums(
kerr_t) and helper functions/macros - Generic driver registration system with features like priority and dependencies
- Serial driver for external logging
- Page-aligned memory allocator
- Kernel Panic
- Sophisticated memory allocators
- Buddy allocator
- Slab allocator
- Unified allocator interface(mm/allocators/kmalloc.c)
- Process scheduler and task system with support for multiple processes
- User space with limited permissions
- Support for executing user programs
- User applications(text editor, clock, stopwatch, utilities)
- More device drivers for more devices
- Implementation of an on-disk filesystem
- Audio integration
- Graphical User Interface
View .github/ISSUE_TEMPLATES/ for detailed issue templates. Issues are always welcome, as long as they fit the template, are reproducable, and fit the scale and theme of the project
Because of the nature of this repository, I would ask anyone to refrain from large PRs implementing a lot of new logic. I want to make IGNIS as best as possible, but I want to learn and implement the core features by myself. If you have code you want to contribute, feel free to make an issue or PR. Just know that I might not merge it if I don't fully understand it. Thank you for your interest!