Guest networking from 5.7 seconds to 2.8 — and two ideas measured and left out
Posted interrupts, a one-shot timer, moderated receive interrupts, offloads and mapped rings, measured on bare metal; halt polling and a NIC task did not help.
x86-64 · arm64 · C++20 · Rust
nos is an operating system kernel for x86-64 and arm64, written in C++20, Rust and assembly. It boots in QEMU, on KVM clouds, on Apple Silicon and on bare-metal servers — and it is growing into a cloud node that runs Linux guests under its own Rust hypervisor.
$ ./scripts/qemu-arm64.sh
…
rust_test: passed
SoftIrq: initialized
part: 0 partitions on 1 disks
MountRootFs: mounted ramfs on / (rw)
nanofs: bad magic 0x0
MountRootFs: mounted procfs on /proc (ro)
tcp: initialized, up to 64 connections
udpshell: started on port 9000
boot: complete
_ _ ___ ____
| \ | |/ _ \/ ___|
| \| | | | \___ \
| |\ | |_| |___) |
|_| \_|\___/|____/
DHCP auto on eth0...
DHCP ip: 10.0.2.15
DNS resolver started, server: 10.0.2.3
$ █Linux is written in C: a superb language that leaves every bounds check, every lifetime and every lock to the programmer, across tens of millions of lines. Its vulnerabilities no longer come one at a time.
Linux kernel CVEs published in 2026 by 22 October, more than in all of 2025 (5,675)
of them in August and September alone; the first quarter had 644
Linux kernel vulnerabilities CISA added in 2026 to its catalog of those exploited in the wild
AI has made finding the mistakes cheap. In May, Linus Torvalds wrote that the “continued flood of AI reports has basically made the security list almost entirely unmanageable”. In August, a fix that credits an AI system closed Vghost (CVE-2026-74580): a stale cache in vhost that gave local users root and, behind a virtual IOMMU, let a guest write out of bounds into the host's QEMU — through the very layer a hypervisor exists to keep shut.
≈ 90,000 lines
About 90,000 lines of code for the whole kernel, its drivers, network stack and filesystems, and its hypervisor — not tens of millions. Small enough to review whole, and far easier to verify.
63% Rust · 1.7% of it unsafe
63% of the code is Rust, and only 1.7% of its lines are inside unsafe blocks — concentrated in the crates that touch the hardware and the C ABI, and counted on every change. Out-of-bounds writes, use-after-free and data races cannot be written in the rest: the hypervisor's logic has 4 unsafe sites in 18,929 lines.
4 host fuzzers in CI
Four fuzzers build the kernel's own sources for the host — the hypervisor's devices and run loop, the network stack, the filesystems, the C++ under ASan and UBSan — and run in CI on every change, with long campaigns between.
UBSan · RUSTUB · W^X
UBSan and checked-unsafe builds boot in CI on both architectures, every subsystem has a gate of its own, and a broken invariant is a panic that names its site — never a silent wedge.
Linux keeps running — as the guest. What changes is the host under it, the one layer that must never fall: small enough to check, and built so that whole classes of its bugs cannot be written.
Sources: NVD: the kernel.org CNA's CVEs, e.g. September 2026 · linux-cve-announce · CISA KEV catalog · Linus Torvalds, 17 May 2026 · the Vghost fix (Assisted-by: tencentos-corvus-ai) · Tencent Zhuque Lab on Vghost · nos: scripts/sloc.py, scripts/unsafe-count.py
No undefined behaviour, no memory corruption, no data races, no deadlocks, no silent failure: every design here is picked for that first.
Developed against emulators and clouds, and proven on real machines — two of which have no console but the network.
From a kernel that boots on servers to a bare-metal cloud node: no Linux on the host, Linux guests under a Rust hypervisor, live update underneath them.
nos boots and stays manageable on real server hardware.
New code in Rust, unsafe confined to a few small crates.
A portability layer and arm64 under QEMU and HVF, before the hypervisor.
A Rust hypervisor on AMD-V and VT-x boots Linux guests.
An HTTP API creates, destroys and consoles virtual machines.
The host kernel replaced under running guests in under 100 ms.
Posted interrupts, a one-shot timer, moderated receive interrupts, offloads and mapped rings, measured on bare metal; halt polling and a NIC task did not help.
Cleared registers, a refilled return stack, IBPB, IBRS, BHI_DIS_S, VERW: what the nos hypervisor does around every VM exit, what it costs, what is open.
Stage 3 from git log: in a month hv.ko went from switching AMD-V on to booting Alpine, Debian and multi-CPU Linux guests on AMD and Intel silicon.