From e3efa5ebf8a1c3603d3838188e1b295f17b284d4 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Sun, 4 Oct 2026 14:48:43 +0000 Subject: [PATCH 01/15] Add draft for October issue Co-Authored-By: Claude Opus 5.5 --- content/this-month/2026-10/index.md | 95 +++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 content/this-month/2026-10/index.md diff --git a/content/this-month/2026-10/index.md b/content/this-month/2026-10/index.md new file mode 100644 index 0000000..7a8e202 --- /dev/null +++ b/content/this-month/2026-10/index.md @@ -0,0 +1,95 @@ ++++ +title = "This Month in Rust OSDev: October 2026" +date = 2026-11-01 + +[extra] +month = "October 2026" +editors = ["phil-opp"] ++++ + +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](https://github.com/rust-osdev/homepage/). 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](https://github.com/rust-osdev/homepage/issues/new) 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](https://github.com/rust-osdev/homepage/pulls) or via a PR [on GitHub](https://github.com/rust-osdev/homepage/). + + +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. + + + +No content was submitted for this section this month. + +## Infrastructure and Tooling + +In this section, we collect recent updates to `rustc`, `cargo`, and other tooling that are relevant to Rust OS development. + + + +No content was submitted for this section this month. + +## `rust-osdev` Projects + +In this section, we give an overview of notable changes to the projects hosted under the [`rust-osdev`](https://github.com/rust-osdev/about) organization. + + + +No content was submitted for this section this month. + +## 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](https://github.com/rust-osdev/homepage/pulls) with the updates of your OS project for the next post. + + + +No project updates were submitted this month. + + + +## 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](https://rust-osdev.zulipchat.com). From fd2b05ac055380d8be7f9e9b2421c9312fe8c5de Mon Sep 17 00:00:00 2001 From: "Tate, Hongliang Tian" Date: Tue, 13 Oct 2026 07:56:32 +0000 Subject: [PATCH 02/15] Add announcement for Asterinas 0.19.0 Co-Authored-By: Claude Fable 5.1 --- content/this-month/2026-10/index.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/content/this-month/2026-10/index.md b/content/this-month/2026-10/index.md index 7a8e202..db13e13 100644 --- a/content/this-month/2026-10/index.md +++ b/content/this-month/2026-10/index.md @@ -40,6 +40,9 @@ Please follow this template: - (optional) Some additional context --> +- [Announcing Asterinas 0.19.0](https://asterinas.github.io/2026/10/13/announcing-asterinas-0.19.0.html) + - [Asterinas](https://github.com/asterinas/asterinas) is a Linux ABI-compatible OS kernel written from scratch in Rust. 0.19.0 adds a DRM subsystem (Xorg and 3D games), AArch64 as its fourth architecture, Intel VMX hypervisor support in OSTD, a Rust-native device model, and self-hosting builds. + No content was submitted for this section this month. ## Infrastructure and Tooling From ba69a740318895bf9600ffee504d9424b4640ca1 Mon Sep 17 00:00:00 2001 From: Philipp Schuster Date: Fri, 16 Oct 2026 18:23:46 +0200 Subject: [PATCH 03/15] 2026-10: uart_16550 updates --- content/this-month/2026-10/index.md | 36 ++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/content/this-month/2026-10/index.md b/content/this-month/2026-10/index.md index 7a8e202..c495d97 100644 --- a/content/this-month/2026-10/index.md +++ b/content/this-month/2026-10/index.md @@ -71,7 +71,41 @@ In this section, we give an overview of notable changes to the projects hosted u <> --> -No content was submitted for this section this month. +### [`uart_16550`](https://github.com/rust-osdev/uart_16550) +Maintained by [@phip1611](https://github.com/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`](https://github.com/rust-osdev/uart_16550/commit/492c16b2ed81020cb51e302ba7056481db69ac2c) +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](https://github.com/rust-osdev/uart_16550/blob/main/CHANGELOG.md) +has all details. + +As mentioned in previous issues, [Anthropic](https://www.anthropic.com/) +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: + ## Other Projects From fb1814eb6d9327d85c33346166d007d122f50d0c Mon Sep 17 00:00:00 2001 From: jenningschaefer Date: Mon, 19 Oct 2026 17:24:19 +0200 Subject: [PATCH 04/15] Add Open Nexus OS October 2026 update Co-Authored-By: Claude Fable 5.1 --- content/this-month/2026-10/index.md | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/content/this-month/2026-10/index.md b/content/this-month/2026-10/index.md index fac6e77..6f589c5 100644 --- a/content/this-month/2026-10/index.md +++ b/content/this-month/2026-10/index.md @@ -42,8 +42,8 @@ Please follow this template: - [Announcing Asterinas 0.19.0](https://asterinas.github.io/2026/10/13/announcing-asterinas-0.19.0.html) - [Asterinas](https://github.com/asterinas/asterinas) is a Linux ABI-compatible OS kernel written from scratch in Rust. 0.19.0 adds a DRM subsystem (Xorg and 3D games), AArch64 as its fourth architecture, Intel VMX hypervisor support in OSTD, a Rust-native device model, and self-hosting builds. - -No content was submitted for this section this month. +- [The Documentation I Wish I Had: How I build drivers for Open Nexus OS](https://open-nexus-os.io/blog/the-documentation-i-wish-i-had) + - Bringing up the Rust microkernel OS [Open Nexus OS](https://github.com/open-nexus-OS/open-nexus-OS) on a Banana Pi BPI-F3: measuring the vendor's Linux system first and turning those measurements into pass/fail gates that drive the display, USB, and GPU driver work. ## Infrastructure and Tooling @@ -123,7 +123,18 @@ In this section, we describe updates to Rust OS projects that are not directly r ...<>... --> -No project updates were submitted this month. +### [`open-nexus-OS/open-nexus-OS`](https://github.com/open-nexus-OS/open-nexus-OS) +(Section written by [@jenningschaefer](https://github.com/jenningschaefer)) + +[Open Nexus OS](https://open-nexus-os.io/) is a capability-based microkernel operating system written in Rust and targeting RISC-V. + +**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](https://open-nexus-os.io/blog/the-documentation-i-wish-i-had). + +[Website](https://open-nexus-os.io/) · [Repository](https://github.com/open-nexus-OS/open-nexus-OS) · [Changelog](https://github.com/open-nexus-OS/open-nexus-OS/blob/main/CHANGELOG.md) From 542460b20d662312a234585012c491bc8554319f Mon Sep 17 00:00:00 2001 From: Emilio Navarrete Lineros Date: Mon, 26 Oct 2026 00:12:01 -0300 Subject: [PATCH 05/15] Add EmiBSD to Other Projects for October 2026 --- content/this-month/2026-10/index.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/content/this-month/2026-10/index.md b/content/this-month/2026-10/index.md index 6f589c5..fb728c0 100644 --- a/content/this-month/2026-10/index.md +++ b/content/this-month/2026-10/index.md @@ -136,6 +136,17 @@ On the desktop side, window tiling became the default model, a clipboard service [Website](https://open-nexus-os.io/) · [Repository](https://github.com/open-nexus-OS/open-nexus-OS) · [Changelog](https://github.com/open-nexus-OS/open-nexus-OS/blob/main/CHANGELOG.md) +### [`EmiBSD/Kernel`](https://github.com/EmiBSD/Kernel) +(Section written by [@enavarre-cl](https://github.com/enavarre-cl)) + +[EmiBSD](https://www.emibsd.org/) carries the OpenBSD kernel into Rust in two stages. [LandingZone](https://github.com/EmiBSD/LandingZone) ports it one C file to one Rust file, keeping the C's shape so each file can be checked against its origin; Kernel then redesigns what LandingZone ported, subsystem by subsystem. The `kernel` and `abi` crates are `#![forbid(unsafe_code)]`; only `hal` may hold `unsafe`, each site with a written proof. OpenBSD's behaviour is the specification: the system-call ABI stays byte-identical, so OpenBSD's own userland runs unmodified, and every change is checked against a real OpenBSD in QEMU. The code is written by AI coding agents under written rules; one maintainer reviews and approves every commit. Pre-alpha, arm64 in QEMU only, not affiliated with the OpenBSD project. + +October was the month Kernel split from LandingZone and closed its first five milestones, N0 to N4: bootstrap, the leaf libraries, the `kernel`/`abi`/`hal` crates, memory (uvm into `kernel::vm`, the pmaps into `hal`), and processes and scheduling. At N4, processes, descriptors, kqueue, signals, the scheduler, terminals and the clock live in the safe `kernel` crate; the context switch, trap and system-call entry, user copies and the Spectre-BHB and KPTI code live in `hal`, which now has 184 `unsafe` sites against 9490 left in the inherited tree. 105 of OpenBSD's 331 system calls are handled natively, from 17 at the start of N4. The test suite passes on two and four CPUs, the installer runs end to end, and the comparison with a real OpenBSD found no new difference. The cost is measured too: under QEMU on arm64 the page fault is 41 % slower than at N3 and fork plus exec 24 %; those numbers wait for the performance milestone. + +Next is N5, the VFS and the file systems. + +[Website](https://www.emibsd.org/) · [Status, with every figure at a named commit](https://www.emibsd.org/status/) · [N4 post](https://www.emibsd.org/news/2026/10/24/n4-met/) + ## Join Us? From 47be9e5e456d38a7a56a8a4c1fa0e773089c88e4 Mon Sep 17 00:00:00 2001 From: Emilio Navarrete Lineros Date: Wed, 28 Oct 2026 19:43:40 -0300 Subject: [PATCH 06/15] Re-run CI: the broken-link failure was an external site that is back Co-Authored-By: Claude Fable 5.1 From a182d3baf722c42248f8d3e24b596058cc85d8a8 Mon Sep 17 00:00:00 2001 From: Emilio Navarrete Lineros Date: Thu, 29 Oct 2026 13:51:54 -0300 Subject: [PATCH 07/15] Rewrite the EmiBSD entry for readers new to the project Drop the internal milestone names and the performance comparison against earlier milestones, as requested in review; say what moved and where it stands instead. Co-Authored-By: Claude Fable 5.1 --- content/this-month/2026-10/index.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/content/this-month/2026-10/index.md b/content/this-month/2026-10/index.md index fb728c0..73bce28 100644 --- a/content/this-month/2026-10/index.md +++ b/content/this-month/2026-10/index.md @@ -139,15 +139,13 @@ On the desktop side, window tiling became the default model, a clipboard service ### [`EmiBSD/Kernel`](https://github.com/EmiBSD/Kernel) (Section written by [@enavarre-cl](https://github.com/enavarre-cl)) -[EmiBSD](https://www.emibsd.org/) carries the OpenBSD kernel into Rust in two stages. [LandingZone](https://github.com/EmiBSD/LandingZone) ports it one C file to one Rust file, keeping the C's shape so each file can be checked against its origin; Kernel then redesigns what LandingZone ported, subsystem by subsystem. The `kernel` and `abi` crates are `#![forbid(unsafe_code)]`; only `hal` may hold `unsafe`, each site with a written proof. OpenBSD's behaviour is the specification: the system-call ABI stays byte-identical, so OpenBSD's own userland runs unmodified, and every change is checked against a real OpenBSD in QEMU. The code is written by AI coding agents under written rules; one maintainer reviews and approves every commit. Pre-alpha, arm64 in QEMU only, not affiliated with the OpenBSD project. +[EmiBSD](https://www.emibsd.org/) 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](https://github.com/EmiBSD/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. -October was the month Kernel split from LandingZone and closed its first five milestones, N0 to N4: bootstrap, the leaf libraries, the `kernel`/`abi`/`hal` crates, memory (uvm into `kernel::vm`, the pmaps into `hal`), and processes and scheduling. At N4, processes, descriptors, kqueue, signals, the scheduler, terminals and the clock live in the safe `kernel` crate; the context switch, trap and system-call entry, user copies and the Spectre-BHB and KPTI code live in `hal`, which now has 184 `unsafe` sites against 9490 left in the inherited tree. 105 of OpenBSD's 331 system calls are handled natively, from 17 at the start of N4. The test suite passes on two and four CPUs, the installer runs end to end, and the comparison with a real OpenBSD found no new difference. The cost is measured too: under QEMU on arm64 the page fault is 41 % slower than at N3 and fork plus exec 24 %; those numbers wait for the performance milestone. - -Next is N5, the VFS and the file systems. - -[Website](https://www.emibsd.org/) · [Status, with every figure at a named commit](https://www.emibsd.org/status/) · [N4 post](https://www.emibsd.org/news/2026/10/24/n4-met/) +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](https://www.emibsd.org/) · [Status](https://www.emibsd.org/status/) · [Process](https://www.emibsd.org/process/) ## Join Us? From ecb45ba647f0519ed6e8c34e3210532a14c0149e Mon Sep 17 00:00:00 2001 From: Philipp Schuster Date: Mon, 2 Nov 2026 18:20:05 +0100 Subject: [PATCH 08/15] 2026-10: noto-sans-mono-bitmap v0.4.0 --- content/this-month/2026-10/index.md | 28 ++++++++++++++++++ .../2026-10/noto-sans-mono-bitmap-v0.4.webp | Bin 0 -> 40636 bytes 2 files changed, 28 insertions(+) create mode 100644 content/this-month/2026-10/noto-sans-mono-bitmap-v0.4.webp diff --git a/content/this-month/2026-10/index.md b/content/this-month/2026-10/index.md index 6f589c5..3525bbc 100644 --- a/content/this-month/2026-10/index.md +++ b/content/this-month/2026-10/index.md @@ -137,6 +137,34 @@ On the desktop side, window tiling became the default model, a clipboard service [Website](https://open-nexus-os.io/) · [Repository](https://github.com/open-nexus-OS/open-nexus-OS) · [Changelog](https://github.com/open-nexus-OS/open-nexus-OS/blob/main/CHANGELOG.md) +### [`phip1611/noto-sans-mono-bitmap-rs`](https://github.com/phip1611/noto-sans-mono-bitmap-rs) +(Section written by [@phip1611](https://github.com/phip1611)) + +_Pre-rasterized `no_std` bitmap font for framebuffers in bootloaders and +kernels, without allocations or floating point operations._ + +[`v0.4.0`](https://github.com/phip1611/noto-sans-mono-bitmap-rs/releases/tag/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: + +| Size | v0.3.2 | v0.4.0 | +|-------------------------------|-----------|---------| +| Published crate | 533 kB | 230 kB | +| In the binary, default | <120 KiB | ~10 KiB | +| In the binary, all features | 5+ 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](https://github.com/phip1611/noto-sans-mono-bitmap-rs/blob/main/CHANGELOG.md). + +![Characters of noto-sans-mono-bitmap v0.4.0 in all sizes and font weights.](noto-sans-mono-bitmap-v0.4.webp "Characters of noto-sans-mono-bitmap v0.4.0 in all sizes and font weights.") + ## Join Us? diff --git a/content/this-month/2026-10/noto-sans-mono-bitmap-v0.4.webp b/content/this-month/2026-10/noto-sans-mono-bitmap-v0.4.webp new file mode 100644 index 0000000000000000000000000000000000000000..20721b043f3e671093f909a0cba29eef6cf06f5d GIT binary patch literal 40636 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�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�PZp8CjuDn zt@V9#VZjhObG#z}Bpe42;Z0_}ix+OMX^@>atM%npbbXaA3z$O?09!wcvI;=NqM8sb z=-|`*IDm|As=u#EkOP5ghvgO;rTaKc?gtQ``#@YYjVcSk*B3xSlyT0I5(~TudT-Du4pDJ=wR38Tq=01PAFIW^i!cL@~6$5Fwwa z0zudY3iIMw9Sz+w4G@!%bFLyww0$3M6sa=}Fw2rRL47<$6JzI14#)L{E&|oU~rQZ1G)#2uK}2?eY*mRk1#ZAycopzStM)7 za;d5OZCGIZRC9>30hJRi%B8L>)WOnc4bZ+lF7{_c{goIZXXEb;RL@#LpZSHJ;bFuMa ziVYYSM_y$DY|Fjh)>foAdzIo(=$bPty1}@8PXe^SlE}nK<;N2$-D9Dvy|6zF4|w5< zUu{UxmL+LgvORk&yZaZO7$VNemvSSslXLqeMQ8#{xW1w?bl8&TIAVHI?$hYv zjS4o$M4bEbuW3=(wCIlDIz_y%v`%&cJ~BgrDkgE$8qvA=`YyVAoUWkgev6r0$3xie zlI55Qj1?oO4J^SYW7A>n0#c^mqED%?pkf2(@cEzFwOMPH_szNSXDl`mBbR)q3D(qf z`fc4Uq79>7MKCd+ViUBF7aG`=tOF1mq}>9*`Nc#_|F#gY)w1*Q-fJ_gX#R*nApMOk z1(?lzi82iMP-!vnyQrPZasYLlcBcUxa`};ggA2?!IH8n&njspBJ$!IHQSn}shZ?!t zq@QK;Rg<1KkkWxaGLT1RJ4mwa(+&KxZr!G$jdklro7iMFt1{1N_w|UklR0DpF-mNW s1)jN2o5g8Il0QPwBk*FOx6k}hHvGpN@;^F`i68rKIR6djzyC}q0x>x{mjD0& literal 0 HcmV?d00001 From 4b36ffbb19deffc78e84bf6f8c90a5f485b09e01 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Tue, 3 Nov 2026 16:56:30 +0000 Subject: [PATCH 09/15] Fill in rust-osdev projects --- content/this-month/2026-10/index.md | 109 +++++++++++++++++++++++++++- 1 file changed, 108 insertions(+), 1 deletion(-) diff --git a/content/this-month/2026-10/index.md b/content/this-month/2026-10/index.md index 37d8c50..4a3691e 100644 --- a/content/this-month/2026-10/index.md +++ b/content/this-month/2026-10/index.md @@ -108,7 +108,114 @@ sponsors @phip1611 with a Max plan as part of their open source program. The happy that it helps us improve the robustness and reliability of the ecosystem. We merged the following PRs this month: - + +- [Allow custom backends (e.g., TDX/SNP port I/O) and const construction](https://github.com/rust-osdev/uart_16550/pull/76) +- [Make port I/O and MMIO constructors const](https://github.com/rust-osdev/uart_16550/pull/77) +- [Make the Backend trait offset-based](https://github.com/rust-osdev/uart_16550/pull/79) +- [Split the backend out of config()](https://github.com/rust-osdev/uart_16550/pull/80) +- [Add Uart16550Tty::new_mmio_from_address() and Uart16550::backend_mut(), document register offset checks](https://github.com/rust-osdev/uart_16550/pull/82) +- [Test the driver against a 16550A model, following Linux](https://github.com/rust-osdev/uart_16550/pull/83) +- [Small fixes found by testing against a 16550A model](https://github.com/rust-osdev/uart_16550/pull/84) +- [Report divisors that don't fit into 16 bits instead of panicking](https://github.com/rust-osdev/uart_16550/pull/85) +- [Add enable_interrupts() and disable_interrupts()](https://github.com/rust-osdev/uart_16550/pull/86) +- [Keep LSR and MSR status across internal reads, like Linux](https://github.com/rust-osdev/uart_16550/pull/87) +- [Detect whether the FIFOs are really enabled](https://github.com/rust-osdev/uart_16550/pull/88) +- [Make the loopback test robust](https://github.com/rust-osdev/uart_16550/pull/89) +- [Inline ISR::interrupt_type() and InterruptType::from_bits()](https://github.com/rust-osdev/uart_16550/pull/93) +- [doc: drop remarks about const fn and statics](https://github.com/rust-osdev/uart_16550/pull/81) +- [Fix misleading statements in the docs](https://github.com/rust-osdev/uart_16550/pull/94) +- [Streamline the changelog for v0.9.0](https://github.com/rust-osdev/uart_16550/pull/92) + + + + + + + + + +### [`x86_64`](https://github.com/rust-osdev/x86_64) +Maintained by [@phil-opp](https://github.com/phil-opp), [@josephlr](https://github.com/orgs/rust-osdev/people/josephlr), and [@Freax13](https://github.com/orgs/rust-osdev/people/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: + +- [feat(addr): add 57-bit and runtime-validated `VirtAddr` types](https://github.com/rust-osdev/x86_64/pull/605) +- [Add checked arithmetic functions to addresses, pages, and frames](https://github.com/rust-osdev/x86_64/pull/616) +- [feat(instructions): Add `lldt` and `sldt`](https://github.com/rust-osdev/x86_64/pull/621) +- [Make mxcsr::write and mxcsr::update unsafe](https://github.com/rust-osdev/x86_64/pull/627) +- [Don't panic when displaying a page tables with pages directly before and after the address gap](https://github.com/rust-osdev/x86_64/pull/617) +- [Document the virtualization exception](https://github.com/rust-osdev/x86_64/pull/624) + +Thanks to [@aarkegz](https://github.com/aarkegz), [@mkroening](https://github.com/mkroening), [@adityuhkapoor](https://github.com/adityuhkapoor), [@Garfield1002](https://github.com/Garfield1002), and [@llp42](https://github.com/llp42) for their contributions! + +### [`acpi`](https://github.com/rust-osdev/acpi) +Maintained by [@IsaacWoods](https://github.com/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: + +- [Add types for parsing DMAR](https://github.com/rust-osdev/acpi/pull/370) +- [Add simple docs for DMAR table.](https://github.com/rust-osdev/acpi/pull/374) +- [Support the Match expression](https://github.com/rust-osdev/acpi/pull/368) +- [Add BufferField support for Increment/Decrement.](https://github.com/rust-osdev/acpi/pull/351) +- [Default _OSI can be passed a string reference](https://github.com/rust-osdev/acpi/pull/369) +- [Rework GAS accesses to fixed register blocks](https://github.com/rust-osdev/acpi/pull/373) +- [fix: Do unaligned reads for table entries](https://github.com/rust-osdev/acpi/pull/364) +- [Make PhysicalMapping safely Send / Sync](https://github.com/rust-osdev/acpi/pull/361) +- [Constrain NativeMethod to Send + Sync](https://github.com/rust-osdev/acpi/pull/367) + +Thanks to [@gierens](https://github.com/gierens), [@dewyatt](https://github.com/dewyatt), [@martin-hughes](https://github.com/martin-hughes), and [@mkroening](https://github.com/mkroening) for their contributions! + +### [`spinning_top`](https://github.com/rust-osdev/spinning_top) +Maintained by [@phil-opp](https://github.com/phil-opp) and [@mkroening](https://github.com/mkroening) + +The `spinning_top` crate provides a simple spinlock implementation based on the abstractions of the [`lock_api`](https://docs.rs/lock_api/0.4.1/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](https://rustsec.org/advisories/RUSTSEC-2022-0040)). + +- [fix(rwlock): Fix race when upgrading RW lock](https://github.com/rust-osdev/spinning_top/pull/32) +- [Release v0.3.1](https://github.com/rust-osdev/spinning_top/pull/30) +- [feat: Upgrade to lock_api 0.5](https://github.com/rust-osdev/spinning_top/pull/31) +- [Declare MSRV 1.95 and test it in CI](https://github.com/rust-osdev/spinning_top/pull/38) +- [Remove the `owning_ref` feature](https://github.com/rust-osdev/spinning_top/pull/41) +- [Upgrade to Rust 2024](https://github.com/rust-osdev/spinning_top/pull/34) +- [Test concurrent lock operations under Miri](https://github.com/rust-osdev/spinning_top/pull/43) +- [Release v0.4.0](https://github.com/rust-osdev/spinning_top/pull/44) + + + + + + + + + + + +### [`uefi-rs`](https://github.com/rust-osdev/uefi-rs) +Maintained by [@nicholasbishop](https://github.com/nicholasbishop) and [@phip1611](https://github.com/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: + +- [uefi/time: add monotonic counter services](https://github.com/rust-osdev/uefi-rs/pull/2104) +- [Add EdidActive protocol](https://github.com/rust-osdev/uefi-rs/pull/2109) + + + + + + + + + + +Thanks to [@RaitoBezarius](https://github.com/RaitoBezarius) and [@the-shank](https://github.com/the-shank) for their contributions! ## Other Projects From 6133455a8837a591c3ce85dcb3f0758456d8588b Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Thu, 5 Nov 2026 08:26:07 +0000 Subject: [PATCH 10/15] Set publish date --- content/this-month/2026-10/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/this-month/2026-10/index.md b/content/this-month/2026-10/index.md index 4a3691e..b7846a6 100644 --- a/content/this-month/2026-10/index.md +++ b/content/this-month/2026-10/index.md @@ -1,6 +1,6 @@ +++ title = "This Month in Rust OSDev: October 2026" -date = 2026-11-01 +date = 2026-11-05 [extra] month = "October 2026" From 0b56c675bc3e4a5de875d42a6e3563f99a0e2907 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Thu, 5 Nov 2026 08:26:19 +0000 Subject: [PATCH 11/15] Fill in news section --- content/this-month/2026-10/index.md | 49 ++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/content/this-month/2026-10/index.md b/content/this-month/2026-10/index.md index b7846a6..5c84fc9 100644 --- a/content/this-month/2026-10/index.md +++ b/content/this-month/2026-10/index.md @@ -40,10 +40,57 @@ Please follow this template: - (optional) Some additional context --> +### OS Projects + - [Announcing Asterinas 0.19.0](https://asterinas.github.io/2026/10/13/announcing-asterinas-0.19.0.html) - - [Asterinas](https://github.com/asterinas/asterinas) is a Linux ABI-compatible OS kernel written from scratch in Rust. 0.19.0 adds a DRM subsystem (Xorg and 3D games), AArch64 as its fourth architecture, Intel VMX hypervisor support in OSTD, a Rust-native device model, and self-hosting builds. + - [Asterinas](https://github.com/asterinas/asterinas) is a Linux ABI-compatible OS kernel written from scratch in Rust. + - 0.19.0 adds a DRM subsystem (Xorg and 3D games), AArch64 as its fourth architecture, Intel VMX hypervisor support in OSTD, a Rust-native device model, and self-hosting builds. +- [Driving an NVIDIA GPU from a hobby Rust kernel: GSP-RM to Vulkan](https://github.com/oriaj-nocrala/rust_so_kernel/blob/master/docs/blog/gsp-to-vulkan.md) + - The `no_std` UEFI hobby kernel [constanos](https://github.com/oriaj-nocrala/rust_so_kernel) now boots NVIDIA's GSP-RM firmware on an RTX 3050 and runs a port of Mesa's NVK, so unmodified Vulkan code renders without Linux underneath. + - Most of the code was written by Claude Code, with the author directing the work and running the hardware tests. +- [Tock](https://www.tockos.org/), a secure embedded operating system for microcontrollers written in Rust: + - [Tock 2.3.0](https://github.com/tock/tock/releases/tag/release-2.3.0): The first Tock release since early 2025 adds initial 64-bit RISC-V and x86 support, dynamic process loading, 8 new boards, and many soundness and MPU security fixes. + - [Talking Tock 66: RISC-V 64-bit Support on Tock](https://www.tockos.org/blog/2026/talking-tock-66/) + - [Talking Tock 65: Unsafe Documentation in the Core Tock Kernel](https://www.tockos.org/blog/2026/talking-tock-65/): Tock's core kernel crate now denies `clippy::missing_safety_doc` and `clippy::undocumented_unsafe_blocks`. +- [Redox OS](https://www.redox-os.org/), a Unix-like microkernel operating system written in Rust: + - [This Month in Redox - September 2026](https://www.redox-os.org/news/this-month-260930/) + - [Ring Buffers Project Summary](https://www.redox-os.org/news/nlnet-rb-summary/): Wrap-up of Redox's NLnet-funded work on io_uring-like ring buffer support. +- [Microsoft Issues First Release Of Their LiteBox Sandboxing Library OS](https://www.phoronix.com/news/Microsoft-LiteBox-0.1) - [The Documentation I Wish I Had: How I build drivers for Open Nexus OS](https://open-nexus-os.io/blog/the-documentation-i-wish-i-had) - Bringing up the Rust microkernel OS [Open Nexus OS](https://github.com/open-nexus-OS/open-nexus-OS) on a Banana Pi BPI-F3: measuring the vendor's Linux system first and turning those measurements into pass/fail gates that drive the display, USB, and GPU driver work. + - A large part of Open Nexus OS was built with AI coding agents, guided by the measured gates described in the post. +- [Ginux](https://github.com/gmkurtzer/ginux) + - A userspace kernel that runs as an ordinary process on top of Linux and gives each workload a deliberately reduced, versioned subset of the Linux ABI by emulating, mediating, or denying its syscalls. + - Ginux started as a standalone Rust kernel booting through UEFI and running a Rocky Linux userspace (preserved on the [`bootable-kernel`](https://github.com/gmkurtzer/ginux/tree/bootable-kernel) branch). + - Both versions were written by an AI coding agent directed by the author. + +### Linux-related + +- [17k Lines Of New Rust Kernel Code Heading Into Linux 7.4](https://www.phoronix.com/news/Linux-7.4-Rust) +- [Google's C Binder Driver Removed With Rust Binder Ready For "Few Billion Devices"](https://www.phoronix.com/news/Linux-7.4-Char-Misc) + - Follow-up to last month's item: the removal has now been merged for Linux 7.4. +- [Upstreaming Tyr: Rust, DRM, and the Linux Kernel](https://www.collabora.com/news-and-blog/blog/2026/10/21/upstreaming-tyr-rust-drm-and-the-linux-kernel/) + - Progress on upstreaming Tyr, the Rust DRM driver for Arm Mali GPUs. +- [NVIDIA's Nova Driver Continues Leading The Way For Linux Rust GPU Drivers](https://www.phoronix.com/news/NVIDIA-Nova-Linux-7.4-Changes) +- [Nova Driver Continues Progressing With Long-Term Goal For Official NVIDIA Linux Use](https://www.phoronix.com/news/Nova-Driver-LPC-2026) + - Coverage of the LPC 2026 talk on the Rust Nova driver stack. +- LWN coverage of [Kangrejos 2026](https://kangrejos.com), the Rust for Linux workshop: + - [Owning C types from Rust code](https://lwn.net/Articles/1099015/) + - [Safe self-referential data structures in kernel Rust](https://lwn.net/Articles/1099224/) + - [Cross-crate forward declarations in Rust](https://lwn.net/Articles/1099596/) + - [Discussing a rewrite of XArray](https://lwn.net/Articles/1100520/) + - [Rust features in the future](https://lwn.net/Articles/1099606/) + - [Guidelines for panics in kernel code](https://lwn.net/Articles/1100873/) + +### Embedded and Tooling + +- [Using TrustZone-M in Rust on the Raspberry Pi Pico 2](https://tweedegolf.nl/en/blog/241/using-trustzone-m-in-rust-on-the-raspberry-pi-pico-2/) +- [Finding panics with Call Graph Analyzer](https://tweedegolf.nl/en/blog/242/finding-panics-with-call-graph-analyzer/) + - A tool that extracts the call graph from monomorphized MIR to find which functions in a firmware binary can panic. +- [Wild 0.11.0](https://github.com/wild-linker/wild/releases/tag/0.11.0) + - The Rust-based Wild linker gained considerably better linker script support and a Wasm port. +- [The Embedded Rustacean Issue #82](https://www.theembeddedrustacean.com/p/the-embedded-rustacean-issue-82) + and [Issue #83](https://www.theembeddedrustacean.com/p/the-embedded-rustacean-issue-83) ## Infrastructure and Tooling From 38e350b09adb6d103127e25c6979699a2f015659 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Thu, 5 Nov 2026 08:26:26 +0000 Subject: [PATCH 12/15] Fill in infra section --- content/this-month/2026-10/index.md | 50 ++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/content/this-month/2026-10/index.md b/content/this-month/2026-10/index.md index 5c84fc9..52690fc 100644 --- a/content/this-month/2026-10/index.md +++ b/content/this-month/2026-10/index.md @@ -103,7 +103,55 @@ In this section, we collect recent updates to `rustc`, `cargo`, and other toolin - (optional) Some additional context --> -No content was submitted for this section this month. +### Breaking Changes and Warnings + +- [FCW (future-compatibility warning) for `#[panic_handler]` on `unsafe fn`.](https://github.com/rust-lang/rust/pull/162974) + - The compiler can call the panic handler from anywhere, so declaring it as `unsafe fn` is going to become an error. +- [Deny partial `-Z stack-protector` by default in all editions](https://github.com/rust-lang/rust/pull/157941) + - Enabling stack protection for only some crates of a binary now triggers a future-compatibility warning unless `-Z allow-partial-mitigations=stack-protector` is passed ([RFC 3855](https://github.com/rust-lang/rfcs/pull/3855)). +- [Remove some #[linkage] options](https://github.com/rust-lang/rust/pull/163405) + - The unstable `#[linkage]` attribute no longer accepts `common`, `external`, or `internal`. +- [Nuke `Unique` (and `ptr_internals`)](https://github.com/rust-lang/rust/pull/164146) + - Removes the internal `core::ptr::Unique` type and the `ptr_internals` feature, which some older nightly kernel code still uses. + +### Library Stabilizations + +The following APIs were stabilized this month and are expected to be available in Rust 1.101: + +- [`<*const T>::try_cast_aligned`](https://doc.rust-lang.org/nightly/core/primitive.pointer.html#method.try_cast_aligned), [`<*mut T>::try_cast_aligned`](https://doc.rust-lang.org/nightly/core/primitive.pointer.html#method.try_cast_aligned-1), and [`NonNull::try_cast_aligned`](https://doc.rust-lang.org/nightly/core/ptr/struct.NonNull.html#method.try_cast_aligned) + - Checked pointer casts that return `None` if the pointer is not aligned for the target type. + - Stabilization PR: [Stabilize `ptr::try_cast_aligned`](https://github.com/rust-lang/rust/pull/154170) +- [`<*const T>::cast_slice`](https://doc.rust-lang.org/nightly/core/primitive.pointer.html#method.cast_slice), [`<*mut T>::cast_slice`](https://doc.rust-lang.org/nightly/core/primitive.pointer.html#method.cast_slice-1), and [`NonNull::cast_slice`](https://doc.rust-lang.org/nightly/core/ptr/struct.NonNull.html#method.cast_slice) + - Postfix versions of `ptr::slice_from_raw_parts{_mut}` that turn a pointer and a length into a slice pointer. + - Stabilization PR: [stabilize ptr_cast_slice](https://github.com/rust-lang/rust/pull/162927) +- [`vec::IntoIter::allocator`](https://doc.rust-lang.org/nightly/alloc/vec/struct.IntoIter.html#method.allocator), together with the allocator parameter of `vec::IntoIter` + - A follow-up to last month's `Allocator` stabilization. + - Stabilization PR: [vec: stabilise allocators for into_iter](https://github.com/rust-lang/rust/pull/163499) + +### Unstable `core` APIs + +- [core: Rename `abort_immediate` to `crash`](https://github.com/rust-lang/rust/pull/164730) + - Renames the single-instruction abort in `core::process`, which also works without an OS or libc. Stabilizing it as `crash` is proposed in [#164731](https://github.com/rust-lang/rust/pull/164731). +- [add core::process::resumable_breakpoint](https://github.com/rust-lang/rust/pull/163611) + - An unstable breakpoint function in `core` that is documented as safe to continue past. See the [Zulip discussion](https://rust-lang.zulipchat.com/#narrow/channel/219381-t-libs/topic/Pushing.20.60breakpoint.60.20over.20the.20finish.20line.3F/near/628514482) for background. + +### Target Support + +- [aarch64: Use neon registers for ABI on targets that require `neon"](https://github.com/rust-lang/rust/pull/163824) + - The aarch64 version of last month's x86 SSE change: on hard-float aarch64 targets, vectors are now passed in NEON registers and disabling the `neon` target feature is a hard error. Kernels that disable NEON need a soft-float target such as `aarch64-unknown-none-softfloat`. +- [tier 3 target policy: target CPU and features must be supported by upstream backend](https://github.com/rust-lang/rust/pull/162840) + - New tier 3 targets must use CPU and feature names that upstream LLVM recognizes. +- [Add aarch64-unknown-qtee as a tier 3 target](https://github.com/rust-lang/rust/pull/163688) + - A new target for Qualcomm's Trusted Execution Environment (QTEE). +- [Add the `movdir64b` and `movdiri` x86 target features](https://github.com/rust-lang/rust/pull/163742) + - Adds unstable target features for x86 direct-store instructions, which are used to submit work to devices through MMIO. +- [Fix RISC-V inline ASM `clobber_abi` when extra target features are enabled](https://github.com/rust-lang/rust/pull/163833) + - Fixes which registers `clobber_abi("C")` clobbers for the `ilp32e`/`lp64e` ABIs and for floating-point registers. + +### Cargo + +- [feat(build-std): Add build.build-std.when and crates config keys](https://github.com/rust-lang/cargo/pull/17602) + - Adds the config keys proposed in the [`build-std=always` RFC](https://rust-lang.github.io/rfcs/3874-build-std-always.html) (not functional yet). Related: [builtin package ID spec parsing](https://github.com/rust-lang/cargo/pull/17539) (`builtin://.#core`) for [RFC 3875](https://rust-lang.github.io/rfcs/3875-build-std-explicit-dependencies.html). ## `rust-osdev` Projects From 4a273edcf64b160c8c5f7f0493c44dacd1e4aa9d Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Thu, 5 Nov 2026 08:26:41 +0000 Subject: [PATCH 13/15] Add a disclaimer about nexus os using AI --- content/this-month/2026-10/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/this-month/2026-10/index.md b/content/this-month/2026-10/index.md index 52690fc..79d2d6b 100644 --- a/content/this-month/2026-10/index.md +++ b/content/this-month/2026-10/index.md @@ -328,7 +328,7 @@ In this section, we describe updates to Rust OS projects that are not directly r ### [`open-nexus-OS/open-nexus-OS`](https://github.com/open-nexus-OS/open-nexus-OS) (Section written by [@jenningschaefer](https://github.com/jenningschaefer)) -[Open Nexus OS](https://open-nexus-os.io/) is a capability-based microkernel operating system written in Rust and targeting RISC-V. +[Open Nexus OS](https://open-nexus-os.io/) 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. From 5967f93b78f60f12334f0d0fabeffe7f9c31448c Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Thu, 5 Nov 2026 08:33:04 +0000 Subject: [PATCH 14/15] Choose a different color for subheadings --- static/css/main.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/static/css/main.css b/static/css/main.css index 08cf4c4..f02f52f 100644 --- a/static/css/main.css +++ b/static/css/main.css @@ -6,6 +6,10 @@ h3 a code { color: inherit; } +h3 { + color: #4a6a8a; +} + .post-authors a { color: inherit; font-style: italic; From e140d243fe33d550248abda0eb3535ca46d9032e Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Thu, 5 Nov 2026 08:37:52 +0000 Subject: [PATCH 15/15] Skip anchors on rust-lang zulip as well --- config.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/config.toml b/config.toml index 9c9513d..b8b0169 100644 --- a/config.toml +++ b/config.toml @@ -46,6 +46,7 @@ skip_prefixes = [ # rather than real anchors in the returned HTML. skip_anchor_prefixes = [ "https://rust-osdev.zulipchat.com", # SPA, fragments are routes + "https://rust-lang.zulipchat.com", # SPA, fragments are routes ] [extra]