Embedded systems, edge AI, and embedded Linux from the field.
Long-form notes on things that are badly documented: boot processes, kernel plumbing, field failures, and getting models to run on hardware that has no business running them. Everything here is tested on real boards, and says which ones.
series
Edge AI Lab Notes: The Data Between Training and Devicein progress
Experiments on the data side of edge AI: keeping Python and C in agreement, what storage and query choices really cost, and checks that fail the build.
KVM Virtualization on ARM64in progress
Building the KVM/QEMU/libvirt stack from the silicon up on ARM64, with real terminal output from a Raspberry Pi 5 — because almost every KVM guide assumes x86.
latest posts
Refusing to Build on Guessed Values
Some settings cannot be decided until there is real data. Make the firmware refuse to build until they are, while everything else stays testable.
Why a VM Needs Two Firmware Files: AAVMF and OVMF Explained
A VM has no motherboard, so its UEFI firmware comes as files: one program shared by every VM, and one settings file per VM. Mix them up and a VM stops booting.
Choosing Test Cases, and Proving They Catch Real Bugs
How to design test inputs that each target a specific mistake, then break the C code ten ways on purpose to prove the test catches every one.
How a Computer Boots Before Any OS Exists: BIOS, UEFI, and GPT
At power-on a CPU knows nothing about disks or files. Firmware fills that gap, and its two generations explain most of what is confusing about booting.
Golden Vectors: Testing That Python and C Calculate the Same Features
A hash cannot tell whether two functions agree. Golden vectors can: saved inputs and outputs that both the Python and the C code must reproduce.
tutorials
systemd Services on Embedded Linux
From "works when I run it" to "runs forever on its own": service files, restart policies, dependencies, logging, and timers for applications that run unattended.