// the find
littlekernel/lk
LK embedded kernel
LK is a small preemptive SMP kernel written in C, originally by Travis Geiselbrecht (Fuchsia/Zircon lineage). It runs on bare metal across an unusually wide range of architectures — ARM Cortex-M through ARM64, RISC-V, x86, M68K, MIPS — and is what boots Android on a large chunk of shipping phones. This is for embedded systems engineers who need a minimal, well-structured kernel they can actually read and port.
The architecture abstraction is genuinely clean: each arch implements a small, consistent set of interfaces (thread.c, arch.c, spinlock, mmu) so porting to a new target is mechanical rather than speculative. The modular rules.mk build system lets you compose exactly what you need without fighting a CMake graph. Active maintenance — pushed three days ago, CI runs QEMU boot tests on multiple targets, not just compile checks. The Cortex-M support in particular is production-quality: proper NVIC handling, stack canaries, SMP on chips that support it.
No dynamic memory allocator worth using in production — heap.c is a simple first-fit allocator with no hardening, so if you're building something that allocates heavily at runtime you'll be replacing it anyway. File system support is thin and scattered; the VFS layer exists but most drivers are stubs or half-finished. Documentation is sparse outside the README — the docs/ directory exists but most pages are outlines. The mix of C and C++ across drivers (AHCI is C++, most arch code is C) means you need a toolchain that handles both, which trips people up on bare-metal targets.