Krexo is a high-performance x86_64 bootloader for BIOS and UEFI. It uses a request-based protocol to pass system information to the kernel, allowing for a decoupled architecture where the kernel defines its requirements via ELF sections.
- Limine Compatibility: Started support for Limine protocol requests (Framebuffer, Memory Map, HHDM, etc.).
- UI: Enhanced boot menu with background image support (BMP/PNG) and flicker-free rendering.
- Memory Management: Improved memory map generation and HHDM support for both protocols.
- Dual-Mode Boot: Supports legacy BIOS (VBE) and modern UEFI (GOP) with high-resolution graphics.
- Interactive Menu: Fully configurable boot menu with automatic countdown and custom themes.
- Protocol Support:
- Native Krexo: A request-based interface declarations via ELF sections.
- Limine Compat: Support for Limine protocol requests (Framebuffer, Memory Map, HHDM, etc.).
- FAT32 Support: Built-in stack for loading the kernel and
krexo.conffrom the boot partition. - Memory Safety: No-flicker UI using partial redraws (dirty stripes).
We are working on expanding Krexo's capabilities:
- SMP Support: Symmetrical Multiprocessing to wake up and manage multiple CPU cores.
- Multiboot2 Support: Implementation of the Multiboot2 protocol for broader kernel interoperability.
- Linux-Boot: Direct support for loading Linux kernels (bzImage) and initrd.
- Limine-Protocol: Direct support for Limine protocol requests (Framebuffer, Memory Map, HHDM, etc.).
- Advanced Filesystems: Adding read support for EXT4 and ISO9660.
- Security: UEFI Secure Boot support and signature verification.
src/bios/: 16-bit Stage 1 and 32-bit Stage 2 loaders.src/uefi/: 64-bit EFI application.src/common/: Shared logic for filesystems, protocols, and rendering.include/: Common headers for bootloader and kernel.barebones/: Reference kernel implementations.
- Toolchain:
nasm,x86_64-elf-gcc,clang,lld-link - Emulation:
qemu-system-x86_64,OVMF
BIOS:
make clean && make run_biosUEFI:
make clean && make run_uefiThe kernel specifies requirements using structures in the .krexo_requests ELF section (Native) or via Limine tags.
#include <common/requests.h>
__attribute__((section(".krexo_requests")))
volatile krexo_fb_request_t fb_request = {
.header = {
.magic = { KREXO_REQUEST_MAGIC_0, KREXO_REQUEST_MAGIC_1 },
.id = KREXO_FB_REQUEST_ID,
.response = 0
}
};On handover, the response pointer will contain the address of the fulfilled hardware information.