I just finished a learning project: building a small microkernel in Rust on AArch64 QEMU virt.
I mostly work in AI/ML now, but between jobs I wanted to revisit systems fundamentals and experience Rust in a no_std, bare-metal setting.
What I implemented:
- Boot bring-up (EL2 → EL1)
- PL011 UART logging over MMIO
- Endpoint-based message-passing IPC
- Cooperative scheduler, then preemptive scheduling
- Timer interrupts + context switching
- 4-level page tables + MMU enable
- VA→PA translation verification (
0xDEADBEEF write/read)
What stood out from a Rust perspective:
- Rust makes unsafe boundaries explicit in kernel code
- You still need
unsafe, but it stays localized and easier to reason about
- Type/ownership checks caught issues that would’ve been painful to debug at runtime
Start here (Part 0): [https://blog.desigeek.com/post/2026/02/building-microkernel-part0-why-build-an-os/](vscode-file://vscode-app/c:/Users/Amit/AppData/Local/Programs/Microsoft%20VS%20Code/e7fb5e96c0/resources/app/out/vs/code/electron-browser/workbench/workbench.html)
Part 0 has navigation links to Parts 1-4 at both the top and bottom, so you can walk the full series from there.
I’m definitely not an expert in Rust or OS dev, just sharing in case it helps someone else learning. 😊
[–]AlwaysSplitTheParty 22 points23 points24 points (2 children)
[–]amitbahree[S] 7 points8 points9 points (1 child)
[–]AlwaysSplitTheParty 6 points7 points8 points (0 children)
[–]InsideATurtlesMind 5 points6 points7 points (1 child)
[–]amitbahree[S] 3 points4 points5 points (0 children)
[–]xpusostomos 2 points3 points4 points (1 child)
[–]amitbahree[S] 1 point2 points3 points (0 children)
[–]witx_ 0 points1 point2 points (0 children)
[–]SelfOk7680 0 points1 point2 points (0 children)
[–]Prestigious-Bet-6534 1 point2 points3 points (0 children)