Rust OSDev Operating System Development in Rust

This Month in Rust OSDev: June 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 on Zulip 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.

Infrastructure and Tooling

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

rust-osdev Projects

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

uefi-rs

Maintained by @GabrielMajeri, @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 PRs this month:

Thanks to @JarlEvanson, @mysteriouslyseeing, and @PelleKrab for their contributions!

multiboot2

Maintained by @phip1611

Convenient and safe parsing of Multiboot2 Boot Information (MBI) structures and the contained information tags. Usable in no_std environments, such as a kernel. An optional builder feature also allows the construction of the corresponding structures.

We merged the following PRs this month:

Thanks to @an-owl for their contribution!

bootloader

Maintained by @phil-opp and @Freax13

The bootloader crate implements a custom Rust-based bootloader for easy loading of 64-bit ELF executables. The following changes landed in early July, but we want to mention them already because they affect users building against recent Rust nightlies:

Thanks to @phip1611 for their contribution!

ovmf-prebuilt

Maintained by @nicholasbishop and @phil-opp

The ovmf-prebuilt project provides pre-built edk2 releases to make it easier to set up OVMF. We merged the following changes this month:

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.

We merged the following change 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 with the updates of your OS project for the next post.

mkroening/elf-symbols

(Section written by @mkroening)

When developing an OS, you often need some information about the loaded kernel image:

  • Where has the loader loaded the kernel to?
  • How large is the loaded kernel?
  • Where do the text segment and the data segment end?
  • How do I get the kernel TLS image?

These questions can be answered by building non-relocatable images, by writing custom linker scripts, or by having a custom loader that provides this information somehow.

But there is another way! In fact, the main ELF linkers that I am aware of (BFD, gold, LLD, mold, and Wild) all have built-in ELF symbols that answer these questions when not using custom linker scripts. Unfortunately, many are poorly documented, so I created the elf-symbols crate that exposes and documents them. All symbols are tested on the aforementioned linkers. The documentation shows when each linker gained support for the respective symbol.

The following symbols are straightforward:

  • __executable_start (executable_start()) is the start of the executable.
  • _etext (text_end()) is the end of the text segment.
  • _edata (data_end()) is the end of the data segment.
  • _end (executable_end()) is the end of the executable.

__ehdr_start (elf_header()) is especially interesting. It allows programs to examine themselves by reading their ELF headers (file headers and program headers). This can be used to get TLS image information, for example.

Note that these symbols are ELF specific, though, so they cannot be used when linking to something else, such as a PE32+ UEFI executable.

Examples

println!("Executable start: {:p}", elf_symbols::executable_start());
println!("ELF header:       {:p}", elf_symbols::elf_header());
println!("Text segment end: {:p}", elf_symbols::text_end());
println!("Data segment end: {:p}", elf_symbols::data_end());
println!("Executable end:   {:p}", elf_symbols::executable_end());

phil-opp/blog_os

(Section written by @phil-opp)

We merged the following changes to the Writing an OS in Rust blog. These landed in early July, but we mention them here since they keep the code building on the latest Rust nightly:

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