<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Home on Linux kernel programming blog</title><link>http://rust.christina-quast.de/</link><description>Recent content in Home on Linux kernel programming blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 11 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="http://rust.christina-quast.de/index.xml" rel="self" type="application/rss+xml"/><item><title>The Cleanup Pattern - From goto out to Drop</title><link>http://rust.christina-quast.de/post/2026/05/11/the-cleanup-pattern-from-goto-out-to-drop/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>http://rust.christina-quast.de/post/2026/05/11/the-cleanup-pattern-from-goto-out-to-drop/</guid><description>&lt;p&gt;&lt;a href="https://github.com/Rust-for-Linux/"&gt;&lt;img class="penguin" style="float: left; padding-left: 0%; width: 30%" src="http://rust.christina-quast.de/static/img/rusty_penguin_17.jpeg" alt="Rusty penguin. Created by DALL·E 3."/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="the-c-cleanup-pattern"&gt;The C Cleanup Pattern&lt;/h1&gt;
&lt;p&gt;While in most programming styles using goto&amp;rsquo;s is frowned upon, in the Linux
Kernel this is the default method of undoing the registration and creation work
done by each driver. You oftentimes have the situation that you start
registering a driver. When an error occurs in this process, you have to roll
back everything you just did in reverse order. This is where &lt;code&gt;goto&lt;/code&gt; comes in handy.
By stacking the &lt;code&gt;goto&lt;/code&gt; labels, you only undo the work you &lt;strong&gt;have already done&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Opaque Pointers and Type Erasure</title><link>http://rust.christina-quast.de/post/2026/05/05/opaque-pointers-and-type-erasure/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><guid>http://rust.christina-quast.de/post/2026/05/05/opaque-pointers-and-type-erasure/</guid><description>&lt;p&gt;&lt;a href="https://github.com/Rust-for-Linux/"&gt;&lt;img class="penguin" style="float: right; padding-left: 5%" src="http://rust.christina-quast.de/static/img/rusty_penguin_16.jpeg" alt="Rusty penguin. Created by DALL-E 3."/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the last blog post, we discussed how callback arguments are handled in Rust when
interfacing with C.&lt;/p&gt;
&lt;p&gt;When we want to interface with every C context in the Linux kernel using &lt;code&gt;*mut ffi::c_void&lt;/code&gt;, we lose the ability to &lt;strong&gt;distinguish different types&lt;/strong&gt;. If we
interpret a device context as a driver context, in the best case we run into a
segfault. In the worst case, we hunt a bug that only sometimes overwrites our
whole file system.&lt;/p&gt;</description></item><item><title>The Callback Conundrum - Porting void pointers to user data</title><link>http://rust.christina-quast.de/post/2026/04/29/the-callback-conundrum-porting-void-pointers-to-user-data/</link><pubDate>Wed, 29 Apr 2026 00:00:00 +0000</pubDate><guid>http://rust.christina-quast.de/post/2026/04/29/the-callback-conundrum-porting-void-pointers-to-user-data/</guid><description>&lt;p&gt;&lt;a href="https://github.com/Rust-for-Linux/"&gt;&lt;img class="penguin" style="float: right; padding-left: 5%" src="http://rust.christina-quast.de/static/img/rusty_penguin_15.jpeg" alt="Rusty penguin. Created by DALL·E 3."/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Platform drivers were one of the first success stories of the Rust-for-Linux
project. They were a proof of concept that the integration of Rust into the
existing Linux kernel C code base would work. The decision to focus on platform
drivers early on was strategic. They are simpler compared to complex GPU or
network drivers, and therefore provide a perfect sandbox for testing Rust
abstractions.&lt;/p&gt;</description></item><item><title>Inline Assembly</title><link>http://rust.christina-quast.de/post/2026/04/22/inline-assembly/</link><pubDate>Wed, 22 Apr 2026 00:00:00 +0000</pubDate><guid>http://rust.christina-quast.de/post/2026/04/22/inline-assembly/</guid><description>&lt;p&gt;&lt;a href="https://github.com/Rust-for-Linux/"&gt;&lt;img class="penguin" style="float: left; padding-left: 0%" src="http://rust.christina-quast.de/static/img/rusty_penguin_14.jpeg" alt="Rusty penguin. Created by DALL·E 3."/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="why-inline-assembly"&gt;Why inline assembly?&lt;/h1&gt;
&lt;p&gt;If you ever need to do something that&amp;rsquo;s not possible in your high-level language,
or you need that extra bit of performance, inline assembly is your portal to the
processor. In C, the &lt;code&gt;asm&lt;/code&gt; keyword is a direct portal to the processor. The
compiler treats your assembly string like a mysterious &lt;code&gt;__black box__&lt;/code&gt;. You tell the
compiler, &amp;ldquo;I&amp;rsquo;m going to mess with some registers, don&amp;rsquo;t worry about it,&amp;rdquo; and C
simply hopes you know what you&amp;rsquo;re doing. It&amp;rsquo;s low-level, it&amp;rsquo;s fast, and it&amp;rsquo;s
remarkably easy to forgot to tell the compiler you clobbered the &lt;code&gt;eax&lt;/code&gt;
register and now you find yourself &lt;a href="https://xkcd.com/292/"&gt;tackled by a raptor&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>C to Rust - Memory</title><link>http://rust.christina-quast.de/post/2026/01/28/c-to-rust-memory/</link><pubDate>Wed, 28 Jan 2026 00:00:00 +0000</pubDate><guid>http://rust.christina-quast.de/post/2026/01/28/c-to-rust-memory/</guid><description>&lt;p&gt;&lt;a href="https://github.com/Rust-for-Linux/"&gt;&lt;img class="penguin" style="float: left; padding-left: 0%" src="http://rust.christina-quast.de/static/img/rusty_penguin_13.jpeg" alt="Rusty penguin. Created by DALL·E 3."/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;One of the big worries of any seasoned embedded developper is always memory and processing overhead. This blog post will show how you can have the cake and eat it as well: You can have the safety guarantees thanks to the Rust compiler without suffering any memory or CPU overhead. The Rust compiler takes care of making sure that you don&amp;rsquo;t read or write outside of a buffer or try to reference a NULL pointer.&lt;/p&gt;</description></item><item><title>Hashset</title><link>http://rust.christina-quast.de/post/2024/08/09/hashset/</link><pubDate>Fri, 09 Aug 2024 00:00:00 +0000</pubDate><guid>http://rust.christina-quast.de/post/2024/08/09/hashset/</guid><description>&lt;p&gt;&lt;a href="https://github.com/Rust-for-Linux/"&gt;&lt;img class="penguin" src="http://rust.christina-quast.de/static/img/rusty_penguin_11.jpeg" alt="Rusty penguin. Created by DALL·E 3." /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="why-reinventing-hashset"&gt;Why reinventing HashSet?&lt;/h1&gt;
&lt;p&gt;This article will focus on adding a Hashset to the
&lt;a href="https://github.com/chrysh/quarto_rs/tree/add_hashset"&gt;quarto_rs&lt;/a&gt;. As previously
discussed, because we cannot use the Rust stdlib when writing code for the Linux
kernel, we have to implement the HashSet trait and implementation ourselves.&lt;/p&gt;
&lt;p&gt;I am aware of the fact that it would have been much easier to replace the HashSet
with a Vector of size 64 and iterate over it. But I wanted to modify the
original code as little as possible.&lt;/p&gt;</description></item><item><title>Porting a userspace program to Kernel space</title><link>http://rust.christina-quast.de/post/2024/08/09/porting-a-userspace-program-to-kernel-space/</link><pubDate>Fri, 09 Aug 2024 00:00:00 +0000</pubDate><guid>http://rust.christina-quast.de/post/2024/08/09/porting-a-userspace-program-to-kernel-space/</guid><description>&lt;p&gt;&lt;a href="https://github.com/Rust-for-Linux/"&gt;&lt;img class="penguin" style="float: left; padding-left: 0%" src="http://rust.christina-quast.de/static/img/rusty_penguin_12.jpeg" alt="Rusty penguin. Created by DALL·E 3." /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="differences-between-kernel-and-userspace"&gt;Differences between Kernel and Userspace&lt;/h1&gt;
&lt;p&gt;Porting a Rust program to the Linux Kernel is very similar to porting a Rust
program to an embedded device. Compared to the program you write on your desktop
computer, you cannot use the standard library (&lt;code&gt;std&lt;/code&gt;). Furthermore, embedded
systems and the Linux Kernel have special requirements for memory management.
Allocations in Kernel space must not fail, because this would lead to a kernel
panic, that makes the whole system crash. And we don&amp;rsquo;t want our operating system
to crash.&lt;/p&gt;</description></item><item><title>Out of tree Kernel module</title><link>http://rust.christina-quast.de/post/2024/07/06/out-of-tree-kernel-module/</link><pubDate>Sat, 06 Jul 2024 00:00:00 +0000</pubDate><guid>http://rust.christina-quast.de/post/2024/07/06/out-of-tree-kernel-module/</guid><description>&lt;p&gt;&lt;a href="https://github.com/Rust-for-Linux/"&gt;&lt;img class="penguin" src="http://rust.christina-quast.de/static/img/rusty_penguin_10.jpeg" alt="Rusty penguin. Created by DALL·E 3." /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="compiling-an-out-of-tree-rust-module"&gt;Compiling an out of tree rust module&lt;/h1&gt;
&lt;p&gt;This chapter will be less Rust focused, and more an introduction on how to
compile Out-of-tree kernel modules in general. The examples were compiled with a
&lt;a href="https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git"&gt;net-next&lt;/a&gt;
kernel based on &lt;code&gt;v6.8-rc1&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="module-code"&gt;Module code&lt;/h2&gt;
&lt;p&gt;The easiest way to get started is to copy over a module to your directory, e.g.
copy over &lt;code&gt;samples/rust/rust_minimal.rs&lt;/code&gt; and try compiling it. You can read up
more information about modules in Rust in the blog entry &lt;a href="../../../02/06/porting-my-first-phy-driver/"&gt;Porting my first phy driver&lt;/a&gt; or look at the &lt;a href="https://github.com/Rust-for-Linux/linux/compare/rust-next...chrysh:Rust-for-Linux:rockchip_driver_rust"&gt;commits on github&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Ioctls</title><link>http://rust.christina-quast.de/post/2024/04/02/ioctls/</link><pubDate>Tue, 02 Apr 2024 00:00:00 +0000</pubDate><guid>http://rust.christina-quast.de/post/2024/04/02/ioctls/</guid><description>&lt;p&gt;&lt;a href="https://github.com/Rust-for-Linux/"&gt;&lt;img class="penguin" src="http://rust.christina-quast.de/static/img/rusty_penguin_9.jpeg" alt="Rusty penguin. Created by DALL·E 3." /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="inputoutput-controls"&gt;Input/Output Controls&lt;/h1&gt;
&lt;p&gt;In computing, ioctl calls (input/output calls) are special function calls used
for operations that can not be done with regular file operations like read,
write, etc. They provide a general-purpose interface for sending control codes
to devices, set parameters, etc.&lt;/p&gt;
&lt;p&gt;The calls are a type of system call. But while system calls like open, read,
write, etc can be applied to all files, ioctls perform device specific
configurations. For example, they can be used to set the baudrate of a serial
driver, set the interface and network mask for network drivers, or reserve space
for a file for file system drivers.&lt;/p&gt;</description></item><item><title>Locks and synchronization</title><link>http://rust.christina-quast.de/post/2024/03/10/locks-and-synchronization/</link><pubDate>Sun, 10 Mar 2024 00:00:00 +0000</pubDate><guid>http://rust.christina-quast.de/post/2024/03/10/locks-and-synchronization/</guid><description>&lt;p&gt;&lt;a href="https://github.com/Rust-for-Linux/"&gt;&lt;img class="penguin" src="http://rust.christina-quast.de/static/img/rusty_penguin_8.jpeg" alt="Rusty penguin. Created by DALL·E 3." /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="synchronization"&gt;Synchronization&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://lwn.net/Articles/863459/"&gt;This LWN article&lt;/a&gt; was an attempt to give a
side by side code comparison of how the same GPIO driver looks like
written in C and Rust. Even though the synchronization code that ended up in the
Linux Kernel is different from what we see there, it gives a good overview of
how a driver using locking primitives could look like. For this blog post, we
will focus on the locking and synchronization mechanisms used by C and Rust,
that can be found in the latest Linux kernels.&lt;/p&gt;</description></item><item><title>Results and Errors</title><link>http://rust.christina-quast.de/post/2024/03/09/results-and-errors/</link><pubDate>Sat, 09 Mar 2024 00:00:00 +0000</pubDate><guid>http://rust.christina-quast.de/post/2024/03/09/results-and-errors/</guid><description>&lt;p&gt;&lt;a href="https://github.com/Rust-for-Linux/"&gt;&lt;img class="penguin" src="http://rust.christina-quast.de/static/img/rusty_penguin_7.jpeg" alt="Rusty penguin. Created by DALL·E 3." /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="rusty-error-handling"&gt;Rusty error handling&lt;/h1&gt;
&lt;p&gt;In C, it is common that functions return a integer indicating the success or
failure of the function execution. Extra data can only be modified or returned
through non-&lt;code&gt;const&lt;/code&gt; pointer parameters. Rust on the other hand uses explicit
error types. The Result type encapsulates error and success. In the context of
Rust code in the Linux Kernel, functions that would return an error code in C
would return a &lt;code&gt;core::result::Result&lt;/code&gt; with &lt;code&gt;Error&lt;/code&gt; as its error type instead. In
the following subsections, we will mainly look at the file
&lt;code&gt;rust/kernel/error.rs&lt;/code&gt;, and see how it interacts with the kernel error handling.&lt;/p&gt;</description></item><item><title>Allocators</title><link>http://rust.christina-quast.de/post/2024/02/25/allocators/</link><pubDate>Sun, 25 Feb 2024 00:00:00 +0000</pubDate><guid>http://rust.christina-quast.de/post/2024/02/25/allocators/</guid><description>&lt;p&gt;&lt;a href="https://github.com/Rust-for-Linux/"&gt;&lt;img class="penguin" src="http://rust.christina-quast.de/static/img/rusty_penguin_6.jpeg" alt="Rusty penguin. Created by DALL·E 3." /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="user-land"&gt;User Land&lt;/h1&gt;
&lt;h2 id="when-is-it-used"&gt;When is it used?&lt;/h2&gt;
&lt;p&gt;In user land, the programmer typically does not explicitly call an allocator.
Instead, whenever you use types like &lt;code&gt;Box&lt;/code&gt;, &lt;code&gt;Vec&lt;/code&gt; or &lt;code&gt;String&lt;/code&gt;, in the &lt;strong&gt;background&lt;/strong&gt;
the &lt;strong&gt;global allocator&lt;/strong&gt; is used to allocate and free memory. This global allocator
is part of the Rust standard library &lt;code&gt;std&lt;/code&gt;. Therefore, in order to define your
own allocator, you have to import the GlobalAlloc trait and implement it:&lt;/p&gt;</description></item><item><title>C vs Rust - In the Linux Kernel</title><link>http://rust.christina-quast.de/post/2024/02/23/c-vs-rust-in-the-linux-kernel/</link><pubDate>Fri, 23 Feb 2024 00:00:00 +0000</pubDate><guid>http://rust.christina-quast.de/post/2024/02/23/c-vs-rust-in-the-linux-kernel/</guid><description>&lt;h1 id="-plus-"&gt;+++ Plus +++&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://github.com/Rust-for-Linux/"&gt;&lt;img class="penguin" src="http://rust.christina-quast.de/static/img/rusty_penguin_5.jpeg" alt="Rusty penguin. Created by DALL·E 3." /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="memory-bugs-and-concurrency"&gt;Memory bugs and Concurrency&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s get the obvious out of the way: With Rust, you will inherently write safer
code, because the compiler will complain until you do. &lt;strong&gt;Whole error classes&lt;/strong&gt;
will become less common when Rust programs are widely used:
&lt;strong&gt;Buffer-Overflows&lt;/strong&gt;, many types of &lt;strong&gt;Memory-Leaks, Race conditions&lt;/strong&gt; are made
impossible, because the compiler will force you to have only multiple readers
for shared data &lt;strong&gt;OR&lt;/strong&gt; one writer at a time for mutable data. Well, unless you
wrap all your code in &lt;code&gt;unsafe&lt;/code&gt; blocks, which bypasses some of the compiler
checks. Furthermore, using cyclic data structures can also lead to memory leaks
because they always have a reference count &amp;gt; 1 and can therefore not be cleaned
up.&lt;/p&gt;</description></item><item><title>Getting involved</title><link>http://rust.christina-quast.de/post/2024/02/17/getting-involved/</link><pubDate>Sat, 17 Feb 2024 00:00:00 +0000</pubDate><guid>http://rust.christina-quast.de/post/2024/02/17/getting-involved/</guid><description>&lt;p&gt;&lt;a href="https://github.com/Rust-for-Linux/"&gt;&lt;img class="penguin" src="http://rust.christina-quast.de/static/img/rusty_penguin_4.jpeg" alt="Rusty penguin. Created by DALL·E 3." /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="rust-for-linux"&gt;Rust for Linux&lt;/h1&gt;
&lt;p&gt;The best starting place is probably the web page of the project,
&lt;a href="https://rust-for-linux.com"&gt;rust-for-linux.com&lt;/a&gt;. This page is meant as a hub of
links, documentations and resources to this topic. One source that does not
seem to work well is the github &lt;a href="https://github.com/Rust-for-Linux/linux/contribute"&gt;Good first
issues&lt;/a&gt; page, which
currently is not up to date, and all good first issues are already done or in
progress by somebody. On the other hand, the Rust-for-Linux &lt;a href="https://github.com/Rust-for-Linux/"&gt;github
repo&lt;/a&gt; is still in use and commits are pushed
to it on a regular basis.&lt;/p&gt;</description></item><item><title>Porting my first phy driver</title><link>http://rust.christina-quast.de/post/2024/02/06/porting-my-first-phy-driver/</link><pubDate>Tue, 06 Feb 2024 00:00:00 +0000</pubDate><guid>http://rust.christina-quast.de/post/2024/02/06/porting-my-first-phy-driver/</guid><description>&lt;p&gt;&lt;a href="https://github.com/Rust-for-Linux/"&gt;&lt;img class="penguin" src="http://rust.christina-quast.de/static/img/rusty_penguin_2.jpeg" alt="Rusty penguin. Created by DALL·E 3." /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="why-the-phy"&gt;Why the phy?&lt;/h1&gt;
&lt;p&gt;I saw that &lt;strong&gt;Fujita Tomonori&lt;/strong&gt; had added the &lt;strong&gt;Rust version&lt;/strong&gt; of the ax88796b
phy driver for the Asix PHY, which looked very similar to the C version of this
driver (compare
&lt;a href="https://elixir.bootlin.com/linux/v6.8-rc3/source/drivers/net/phy/ax88796b_rust.rs"&gt;ax88796b_rust.rs&lt;/a&gt;
vs
&lt;a href="https://elixir.bootlin.com/linux/v6.8-rc3/source/drivers/net/phy/ax88796b.c"&gt;ax88796b.c&lt;/a&gt;).
This driver is meant as a reference driver for further phy drivers. The
&lt;a href="https://elixir.bootlin.com/linux/v6.8-rc3/source/rust/kernel/net/phy.rs"&gt;phy.rs&lt;/a&gt;
file uses binding to &lt;code&gt;struct phy_device&lt;/code&gt; and to pass through C function calls to
phy driver functions.&lt;/p&gt;</description></item><item><title>Creating C bindings</title><link>http://rust.christina-quast.de/post/2024/02/02/creating-c-bindings/</link><pubDate>Fri, 02 Feb 2024 00:00:00 +0000</pubDate><guid>http://rust.christina-quast.de/post/2024/02/02/creating-c-bindings/</guid><description>&lt;p&gt;&lt;a href="https://github.com/Rust-for-Linux/"&gt;&lt;img class="penguin" src="http://rust.christina-quast.de/static/img/rusty_penguin_3.jpeg" alt="Rusty penguin. Created by DALL·E 3." /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="what-are-bindings"&gt;What are bindings?&lt;/h1&gt;
&lt;p&gt;Bindings are ways to create an interface between two programming languages,
which allow code written in one language to call from code in another language.
In the case of Rust in the Linux kernel code, &lt;strong&gt;Rust FFI (Foreign Function
Interface)&lt;/strong&gt; bindings are used to call C functions, conforming to the C calling
convention. This means that arguments are placed on the stack or in registers,
as the C function is expecting to find them there, and cleans up after the
function call. Furthermore, the FFI takes care of converting data types between
the two languages and handles memory management. The calling conventions are
dependent on the architecture used (arm, arm64, riscv, x86,..), because each
architecture has a different &lt;strong&gt;calling convention&lt;/strong&gt; and expects the argument in
different places (the stack, registers, etc). And even between different
compilers or compiler versions, the calling conventions can differ! The bindings
abstract away those differences.&lt;/p&gt;</description></item><item><title>Getting Started</title><link>http://rust.christina-quast.de/post/2024/01/31/getting-started/</link><pubDate>Wed, 31 Jan 2024 00:00:00 +0000</pubDate><guid>http://rust.christina-quast.de/post/2024/01/31/getting-started/</guid><description>&lt;p&gt;&lt;a href="https://github.com/Rust-for-Linux/"&gt;&lt;img class="penguin" src="http://rust.christina-quast.de/static/img/rusty_penguin_1.jpeg" alt="Rusty penguin. Created by DALL·E 3." /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="check-out-code"&gt;Check out code&lt;/h1&gt;
&lt;p&gt;I recommend checking out the &lt;a href="https://github.com/Rust-for-Linux"&gt;Rust-for-Linux kernel&lt;/a&gt; to play around with, because it has many more sample modules than the mainline kernel. Even though the interfaces are probably not stable, you can get an idea where development is headed.&lt;/p&gt;
&lt;h1 id="get-your-tools-ready"&gt;Get your tools ready&lt;/h1&gt;
&lt;p&gt;After checking out, you should follow the instructions in
&lt;code&gt;Documentation/rust/quick-start.rst&lt;/code&gt; for setting up your tools. I had more luck
using rustup to get the versions of bindgen and rustc compatible with the kernel
than using my distributions aptitude command. There is a nifty little script
called &lt;code&gt;rust_is_available.sh&lt;/code&gt; which will tell you whether your setup works for
compiling a Rust kernel.&lt;/p&gt;</description></item><item><title>about::blog</title><link>http://rust.christina-quast.de/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://rust.christina-quast.de/about/</guid><description>&lt;p&gt;This blog got started out as a way to document my way into writing &lt;strong&gt;Linux Kernel
modules&lt;/strong&gt; in &lt;strong&gt;Rust&lt;/strong&gt;. It seemed hard to find information on this topic, so I
started out first with &lt;a href="https://adventofcode.com/2023/"&gt;Advent of Code&lt;/a&gt; in 2023
in order to learn Rust. From challenge to challenge, I feel like &lt;a href="https://github.com/chrysh/Advent-of-Code-2023"&gt;my
code&lt;/a&gt; became more &amp;ldquo;rusty&amp;rdquo;.
To get a solid grasp of the core concepts, I also worked through &lt;a href="https://github.com/rust-lang/rustlings"&gt;rustlings&lt;/a&gt;, which I highly recommend to anyone starting out.&lt;/p&gt;</description></item><item><title>about::consulting</title><link>http://rust.christina-quast.de/consulting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://rust.christina-quast.de/consulting/</guid><description>&lt;h1 id="aboutmission"&gt;about::mission&lt;/h1&gt;
&lt;p&gt;Modern systems require the performance of C with the safety of Rust. I help companies bridge this gap by providing hands-on training for Embedded Rust and Rust for Linux.&lt;/p&gt;
&lt;p&gt;My goal is to help your team reduce memory-safety bugs and modernize legacy codebases without losing the low-level control required for kernel and hardware development.&lt;/p&gt;
&lt;h1 id="aboutmodules"&gt;about::modules&lt;/h1&gt;
&lt;h2 id="rust-for-linux-kernel-developers"&gt;Rust for Linux Kernel Developers&lt;/h2&gt;
&lt;p&gt;For teams maintaining drivers or moving toward upstream kernel standards.&lt;/p&gt;</description></item></channel></rss>