Rust OSDev Operating System Development in Rust

This Month in Rust OSDev: October 2026

Welcome to a new issue of "This Month in Rust OSDev". In these posts, we give a regular overview of notable changes in the Rust operating system development ecosystem.

This series is openly developed on GitHub. Feel free to open pull requests there with content you would like to see in the next issue. If you find some issues on this page, please report them by creating an issue or using our comment form at the bottom of this page.

Please submit interesting posts and projects for the next issue by commenting on the draft pull request or via a PR on GitHub.

Disclaimer: Automated scripts and AI assistance were used for collecting and categorizing links. Everything was proofread and checked manually, with many manual tweaks.

Announcements, News, and Blog Posts

Here we collect news, blog posts, etc. related to OS development in Rust.

OS Projects

Embedded and Tooling

Infrastructure and Tooling

In this section, we collect recent updates to rustc, cargo, and other tooling that are relevant to Rust OS development.

Breaking Changes and Warnings

Library Stabilizations

The following APIs were stabilized this month and are expected to be available in Rust 1.101:

Unstable core APIs

Target Support

Cargo

rust-osdev Projects

In this section, we give an overview of notable changes to the projects hosted under the rust-osdev organization.

uart_16550

Maintained by @phip1611

Simple yet highly configurable low-level driver for 16550 UART devices, typically known and used as serial ports or COM ports.

v0.9.0 makes the driver considerably more robust on real hardware. The driver is now tested against a model of a 16550A that follows the flows of the Linux 8250 driver. The model was created with LLM assistance and careful human review, and it found 12 bugs, all fixed in this release. Most notably, devices without working FIFOs, such as the 16450, overran the transmitter and hung the loopback self-test that Uart16550Tty always runs. Also, internal register reads lost line errors and modem status changes, which lsr() and msr() now report.

The Backend trait is no longer sealed, so users can bring their own register access, e.g., port I/O via tdcall or the GHCB in confidential VMs. Together with the new const fn constructors, devices can now live in a static. The driver also gained enable_interrupts() and disable_interrupts(), e.g., for interrupt-driven transmission.

The release comes with several breaking changes, most notably a new MSRV of 1.91, a smaller Backend trait with only read() and write(), and calc_divisor() reporting divisors that don't fit into 16 bits instead of panicking. The changelog has all details.

As mentioned in previous issues, Anthropic sponsors @phip1611 with a Max plan as part of their open source program. The 16550A model and the testing above happened under that sponsorship, and we are happy that it helps us improve the robustness and reliability of the ecosystem.

We merged the following PRs this month:

x86_64

Maintained by @phil-opp, @josephlr, and @Freax13

The x86_64 crate provides various abstractions for x86_64 systems, including wrappers for CPU instructions, access to processor-specific registers, and abstraction types for architecture-specific structures such as page tables and descriptor tables.

We merged the following changes this month:

Thanks to @aarkegz, @mkroening, @adityuhkapoor, @Garfield1002, and @llp42 for their contributions!

acpi

Maintained by @IsaacWoods

The acpi repository contains crates for parsing the ACPI tables – data structures that the firmware of modern computers uses to relay information about the hardware to the OS.

We merged the following changes this month:

Thanks to @gierens, @dewyatt, @martin-hughes, and @mkroening for their contributions!

spinning_top

Maintained by @phil-opp and @mkroening

The spinning_top crate provides a simple spinlock implementation based on the abstractions of the lock_api crate.

This month, we fixed a race condition in RwSpinlock when upgrading a lock, released as v0.3.1. Afterwards, we published v0.4.0 with the following breaking changes: an upgrade to lock_api 0.5, a minimum supported Rust version of 1.95, and the removal of the owning_ref feature, since owning_ref is unmaintained and unsound (RUSTSEC-2022-0040).

uefi-rs

Maintained by @nicholasbishop and @phip1611

uefi makes it easy to develop Rust software that leverages safe, convenient, and performant abstractions for UEFI functionality.

We merged the following changes this month:

Thanks to @RaitoBezarius and @the-shank for their contributions!

Other Projects

In this section, we describe updates to Rust OS projects that are not directly related to the rust-osdev organization. Feel free to create a pull request with the updates of your OS project for the next post.

open-nexus-OS/open-nexus-OS

(Section written by @jenningschaefer)

Open Nexus OS is a capability-based microkernel operating system written in Rust and targeting RISC-V. (A large part of it is built with AI coding agents.)

Update: Open Nexus OS now runs on real hardware. This month the OS booted on a Banana Pi BPI-F3 (SpacemiT K1) for the first time: it boots from eMMC through the vendor boot chain and shows the desktop at 1920x1080 on HDMI via the SoC's display controller. A new userspace USB host stack (a reactive xHCI driver plus HID parsers) lets a USB keyboard and mouse drive the desktop on the board, with the pointer riding the display controller's hardware layer.

Work then moved to the K1's GPU. The gpud service gained a Rust driver for it with multiple GPU contexts, a render queue, and a scanout contract, together with an in-house shader toolchain that compiles WGSL into the project's own IR and emits code for both the board's GPU and the virgl path on QEMU. The compositor now redraws only the damaged regions of a frame on the GPU, and since mid-October the board's display is no longer composited on the CPU at all.

On the desktop side, window tiling became the default model, a clipboard service with text editing and an IME landed, and the shell gained a screenshot tool. The bring-up method behind all of this is described in the blog post The Documentation I Wish I Had.

Website · Repository · Changelog

EmiBSD/Kernel

(Section written by @enavarre-cl)

EmiBSD is an experiment carrying the OpenBSD kernel into safe Rust. It keeps a byte-identical ABI to run OpenBSD's unmodified userland, porting the C file by file (LandingZone) before redesigning it to confine unsafe code to a single hardware layer, hal. The code is written by AI coding agents under written rules, with one maintainer reviewing and approving every commit. It is pre-alpha, runs on arm64 in QEMU only, and is not affiliated with the OpenBSD project.

This month, the redesign moved its first core subsystems out of the inherited port: the string, compression and crypto primitives, virtual memory, and processes and scheduling. File descriptors, kqueue, signals, the scheduler and terminals now live in the #![forbid(unsafe_code)] kernel crate. hal holds 184 proven unsafe sites against 9,490 remaining in the port, and 105 of OpenBSD's 331 system calls are handled natively.

The test suite passes on two and four CPUs, the OpenBSD installer runs end to end, and the comparison against a real OpenBSD shows no new behavioural difference. Performance tuning is scheduled after the redesign. Next up: the VFS and file systems.

Website · Status · Process

phip1611/noto-sans-mono-bitmap-rs

(Section written by @phip1611)

Pre-rasterized no_std bitmap font for framebuffers in bootloaders and kernels, without allocations or floating point operations.

v0.4.0 renders the characters about 7% larger, on a pixel-aligned baseline, and auto-hinted. Wide characters, such as �, are no longer cut off. The raster widths are unchanged.

The glyphs are now flat binary blobs (via include_bytes!) instead of ~3800 generated Rust source files with one fat pointer per glyph row:

Sizev0.3.2v0.4.0
Published crate533 kB230 kB
In the binary, default<120 KiB~10 KiB
In the binary, all features5+ MiB~1 MiB

The row pointers alone made up about 3.5 MB with all features, including their relocations in position-independent binaries. Breaking changes: RasterizedChar::raster() is replaced by pixels(), rows(), and pixel(x, y), FontWeight::val() is removed, and the MSRV is 1.85. See the changelog.

Characters of noto-sans-mono-bitmap v0.4.0 in all sizes and font weights.

Join Us?

Are you interested in Rust-based operating system development? Our rust-osdev organization is always open to new members and new projects. Just let us know if you want to join! A good way to get in touch is our Zulip chat.

Comments