<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>zinnia - blog posts</title>
    <subtitle>A modular 64-bit Unix-like kernel</subtitle>
    <link rel="self" type="application/atom+xml" href="/blog/atom.xml"/>
    <link rel="alternate" type="text/html" href="/blog/"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-10-21T00:00:00+00:00</updated>
    <id>/blog/atom.xml</id>
    <entry xml:lang="en">
        <title>Rewriting</title>
        <published>2026-10-21T00:00:00+00:00</published>
        <updated>2026-10-21T00:00:00+00:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="/blog/20261021-rewriting/"/>
        <id>/blog/20261021-rewriting/</id>
        
        <content type="html" xml:base="/blog/20261021-rewriting/">&lt;p&gt;This is the first blog post about Zinnia! You may have noticed that the website
looks a bit different now - I&#39;ll write here every now and then about cool things
I&#39;ve been working on, or to vent my frustrations. :D&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Now for some actual news:&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I have made the decision to rewrite and port the entire codebase over to C23.
It will retain full userspace ABI (and hopefully API) compatibility with the
Rust version.&lt;/p&gt;
&lt;h2 id=&quot;why&quot;&gt;Why&lt;/h2&gt;
&lt;p&gt;Writing Rust has been a decent experience in many aspects. Tagged unions,
Generics and Iterators come to mind. But it doesn&#39;t come without issues.
There are some real problems both with the toolchain and how the language
and/or standard library expects you to write code.&lt;/p&gt;
&lt;p&gt;Here are my biggest gripes with the language:&lt;/p&gt;
&lt;h3 id=&quot;cargo-and-rustc-are-very-inflexible&quot;&gt;Cargo and rustc are very inflexible&lt;/h3&gt;
&lt;p&gt;Cargo is probably one of my least favorite build systems of all time.
Any moderately complex setup is impossible to implement without resorting to a
second build system like &lt;code&gt;make&lt;/code&gt; or another set of shell scripts. The way features
are defined, and how crates are linked together just doesn&#39;t work well with the
way I want modular drivers to work.&lt;/p&gt;
&lt;p&gt;The next point comes from me having to package Rust and Zinnia for
&lt;a rel=&quot;external&quot; href=&quot;https://github.com/zinnia-os/bootstrap&quot;&gt;bootstrap&lt;/a&gt;:
Cargo didn&#39;t even know how to properly build out-of-tree for a long time, a
thing that is very common for distributions. Not to mention how incredibly
annoying it is to port the toolchain and programs to a new target.
&lt;em&gt;This will likely be its own blog post in the future...&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;On the other hand, rustc also has a limited set of flags that can be used to
influence code layout. I originally wanted to implement a EFISTUB boot method,
but conditionally selecting the executable format or doing linker tricks à la
&lt;a rel=&quot;external&quot; href=&quot;https://github.com/PicoEFI/PicoEFI&quot;&gt;PicoEFI&lt;/a&gt; is not realistically doable as it
stands currently.&lt;/p&gt;
&lt;h3 id=&quot;building-is-unstable&quot;&gt;Building is unstable&lt;/h3&gt;
&lt;p&gt;As Zinnia is built as a shared library to make the modular driver system work,
we need to build &lt;code&gt;core&lt;/code&gt;, &lt;code&gt;alloc&lt;/code&gt; and &lt;code&gt;compiler-rt&lt;/code&gt; with a custom toolchain
target, which forces us to use a nightly toolchain, just so we can specify a
freestanding soft-float target with shared library support.
&lt;code&gt;-Zbuild-std&lt;/code&gt; has been unstable for years and I don&#39;t see any progress being
made there to change that.
Many interesting features in Rust are still guarded behind nightly and are
unlikely to get stabilized in the near future.&lt;/p&gt;
&lt;h3 id=&quot;alloc-has-no-real-fallible-allocations&quot;&gt;&lt;code&gt;alloc&lt;/code&gt; has no real fallible allocations&lt;/h3&gt;
&lt;p&gt;If you look at the API of most collections in &lt;code&gt;alloc&lt;/code&gt;, you&#39;ll quickly realize that
it was designed for use in userspace. The recent stabilization of &lt;code&gt;allocator_api&lt;/code&gt;
feels more like a bandaid fix, rather than proper OOM safety. Sure, I could drop
&lt;code&gt;alloc&lt;/code&gt; and roll my own, but then I would miss out on crates that make use of it
(&lt;code&gt;Arc&lt;/code&gt; is an important one) and it is considerably more code to maintain.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;By the way: the actual feature implementing fallible allocations for a few of&lt;/em&gt;
&lt;em&gt;the containers (like &lt;code&gt;Vec&lt;/code&gt; and &lt;code&gt;Arc&lt;/code&gt;) is... you guessed it, still unstable!&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;no-direct-heap-allocations&quot;&gt;No direct heap allocations&lt;/h3&gt;
&lt;p&gt;This is one of the first hurdles I encountered and still had to deal with
until now: Rust creates all objects with a non-&lt;code&gt;&#39;static&lt;/code&gt; lifetime on the stack.
A kernel thread usually has a way smaller stack to work with than normal
userspace programs. Creating big heap objects will first allocate space on the
stack, and only then move the data to the allocated buffer. There is no
(portable or non-UB) way of replicating a &lt;code&gt;placement new&lt;/code&gt; from C++, where the
object is initialized on heap memory directly. As a result, Zinnia uses a stack
with a size of at least 28 KiB, and up to 128 KiB in debug mode.&lt;/p&gt;
&lt;p&gt;LLVM optimizes these stack allocations at higher &lt;code&gt;opt-level&lt;/code&gt;s, which means that
even in debug mode, I have to build with at least &lt;code&gt;1&lt;/code&gt; or higher if I want to be
able to even boot.&lt;/p&gt;
&lt;h3 id=&quot;compile-times-and-sizes&quot;&gt;Compile times and sizes&lt;/h3&gt;
&lt;p&gt;Most of the core code is put in a single crate, as everything inside the kernel
more or less has to use bits from everywhere. This makes it difficult to split
the kernel into multiple crates, resulting in crazy compile times.&lt;/p&gt;
&lt;p&gt;On my AMD Threadripper 9960X machine, I ended up with a staggering results like:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Finished `release` profile [optimized] target(s) in 14.60s&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;and:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Removed 7390 files, 4.0GiB total&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is not what I&#39;m thinking of when I say &quot;lightweight&quot;, which is one of the
goals I want to achieve for Zinnia.&lt;/p&gt;
&lt;h3 id=&quot;no-oop&quot;&gt;No OOP&lt;/h3&gt;
&lt;p&gt;Rust prefers &lt;code&gt;dyn trait&lt;/code&gt; for dynamic dispatch, though OOP is a more common
pattern inside a kernel, as many driver interfaces are basically
vtables with some data attached.&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #393A34; background-color: #FFFFFF;&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: #2E8F82;&quot;&gt; my_driver_ops&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt;    void&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt; (*&lt;/span&gt;&lt;span style=&quot;color: #B07D48;&quot;&gt;do_stuff&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;)(&lt;/span&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: #2E8F82;&quot;&gt; my_driver&lt;/span&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: #2E8F82;&quot;&gt; my_driver&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt;    int&lt;/span&gt;&lt;span style=&quot;color: #B07D48;&quot;&gt; foo&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt;    int&lt;/span&gt;&lt;span style=&quot;color: #B07D48;&quot;&gt; bar&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt;    const struct&lt;/span&gt;&lt;span style=&quot;color: #2E8F82;&quot;&gt; my_driver_ops&lt;/span&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #B07D48;&quot;&gt; ops&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The above code doesn&#39;t translate well to Rust if you want to use a &lt;code&gt;trait&lt;/code&gt;
instead of function pointers. There are multiple ways to approach a design like
the above, here are two that I&#39;ve used in Zinnia:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #393A34; background-color: #FFFFFF;&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A0ADA0;&quot;&gt;// 1. Pass the data as a parameter to the trait function&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: #2E8F82;&quot;&gt; MyDriver&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B07D48;&quot;&gt;    foo&lt;/span&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #2E8F82;&quot;&gt; i32&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #B07D48;&quot;&gt;    bar&lt;/span&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #2E8F82;&quot;&gt; i32&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt;trait&lt;/span&gt;&lt;span style=&quot;color: #2E8F82;&quot;&gt; MyDriverOps&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #1E754F;&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: #59873A;&quot;&gt; do_stuff&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #A65E2B;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #B07D48;&quot;&gt; driver&lt;/span&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt;: &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #2E8F82;&quot;&gt;MyDriver&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #B07D48;&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #2E8F82;&quot;&gt; i32&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A0ADA0;&quot;&gt;// 2. Include the data in the trait&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt;trait&lt;/span&gt;&lt;span style=&quot;color: #2E8F82;&quot;&gt; MyDriverOps&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #1E754F;&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: #59873A;&quot;&gt; get_data&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #A65E2B;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt; -&amp;gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #2E8F82;&quot;&gt;MyDriver&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #1E754F;&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: #59873A;&quot;&gt; do_stuff&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #A65E2B;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #B07D48;&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #2E8F82;&quot;&gt; i32&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: #2E8F82;&quot;&gt; MyImpl&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: #B07D48;&quot;&gt; data&lt;/span&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #2E8F82;&quot;&gt; MyDriver&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #1E754F;&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: #2E8F82;&quot;&gt; MyDriverOps&lt;/span&gt;&lt;span style=&quot;color: #1E754F;&quot;&gt; for&lt;/span&gt;&lt;span style=&quot;color: #2E8F82;&quot;&gt; MyImpl&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #1E754F;&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: #59873A;&quot;&gt; get_data&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #A65E2B;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt; -&amp;gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #2E8F82;&quot;&gt;MyDriver&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #A65E2B;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt;.&lt;/span&gt;&lt;span&gt;data &lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #1E754F;&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: #59873A;&quot;&gt; do_stuff&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #A65E2B;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #B07D48;&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #2E8F82;&quot;&gt; i32&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;) {&lt;/span&gt;&lt;span style=&quot;color: #59873A;&quot;&gt; log!&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #B5695977;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #B56959;&quot;&gt;foo &lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;{}&lt;/span&gt;&lt;span style=&quot;color: #B5695977;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #B07D48;&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color: #A65E2B;&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #59873A;&quot;&gt;get_data&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #AB5959;&quot;&gt;.&lt;/span&gt;&lt;span&gt;bar&lt;/span&gt;&lt;span style=&quot;color: #999999;&quot;&gt;); }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is quite unergonomic, most prominently found in the VFS and DRM code.
It gets particularly annoying to write when the data needs interior mutability.&lt;/p&gt;
&lt;h3 id=&quot;using-few-unsafe-blocks-doesn-t-make-the-system-safer&quot;&gt;Using few &lt;code&gt;unsafe&lt;/code&gt; blocks doesn&#39;t make the system safer&lt;/h3&gt;
&lt;p&gt;Compile-time memory safety is one of Rust&#39;s biggest appeals. For high-level code,
this is definitely a nice-to-have and something I will miss in C. Nonetheless,
it&#39;s not a silver bullet. There are too many ways to shoot yourself in the foot
with unsafe code on bare-metal systems, and Rust makes it very easy to
accidentally run into undefined behavior. This occured mostly while working on
things like synchronization objects, scheduler code, virtual memory management,
and handling of DMA memory.&lt;/p&gt;
&lt;p&gt;The times where I could actually make use of them were in the network stack and
the VFS, where it&#39;s easy to overrun your buffers in other languages
(see recent Linux CVEs).&lt;/p&gt;
&lt;h2 id=&quot;what-s-next&quot;&gt;What&#39;s next?&lt;/h2&gt;
&lt;p&gt;I will continue to rewrite the old systems and making changes all over.
My goal is to get at least feature parity with the Rust version.
For now this will only cover the x86_64 port and a few drivers, as the riscv64
port was already slightly defunct.&lt;/p&gt;
&lt;p&gt;You will be able to find the code on the &lt;code&gt;rewrite&lt;/code&gt; branch very soon.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Thanks for reading!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Marvin&lt;/em&gt;&lt;/p&gt;
</content>
        
    </entry>
</feed>
