<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Every's Blog</title><link>https://every2.codeberg.page/blog/</link><description>Recent content on Every's Blog</description><generator>Hugo -- gohugo.io</generator><language>en-US</language><copyright>Christian (CC BY 4.0)</copyright><lastBuildDate>Wed, 22 Apr 2026 17:40:00 -0300</lastBuildDate><atom:link href="https://every2.codeberg.page/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>My First Code Patch in the Linux Kernel</title><link>https://every2.codeberg.page/blog/posts/my-first-code-patch-in-the-linux-kernel/</link><pubDate>Wed, 22 Apr 2026 17:40:00 -0300</pubDate><guid>https://every2.codeberg.page/blog/posts/my-first-code-patch-in-the-linux-kernel/</guid><description>&lt;h1 id="overview"&gt;Overview&lt;/h1&gt;
&lt;p&gt;This patch is about the process to convert a stream of bytes into
specific data types.&lt;/p&gt;
&lt;h2 id="modeling-the-problem"&gt;Modeling the problem&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s think of a stream of bytes as a block, so if I have &lt;em&gt;one byte&lt;/em&gt; (aka
8 bits) I&amp;rsquo;ll use &lt;em&gt;one block&lt;/em&gt; and in this block I&amp;rsquo;ve the data I wanna
transform, in this case imagine it as the number 2 (0b10).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://codeberg.org/Every2/blog/raw/branch/main/images/stream-byte-representation.png" alt="Visual representation of a stream of bytes as a block"&gt;&lt;/p&gt;</description><content:encoded><![CDATA[<h1 id="overview">Overview</h1>
<p>This patch is about the process to convert a stream of bytes into
specific data types.</p>
<h2 id="modeling-the-problem">Modeling the problem</h2>
<p>Let&rsquo;s think of a stream of bytes as a block, so if I have <em>one byte</em> (aka
8 bits) I&rsquo;ll use <em>one block</em> and in this block I&rsquo;ve the data I wanna
transform, in this case imagine it as the number 2 (0b10).</p>
<p><img src="https://codeberg.org/Every2/blog/raw/branch/main/images/stream-byte-representation.png" alt="Visual representation of a stream of bytes as a block"></p>
<h3 id="shaping-the-block">Shaping the block</h3>
<p>So far we&rsquo;ve worked with the abstract form of the data which&rsquo;s a block
with the content inside, but what I want is to shape and manipulate
this data. In high level languages like Rust, we&rsquo;ve types that accept
<em>bit patterns</em>, so if I have one block I can call it as u8 data type.</p>
<h1 id="getting-the-hands-dirty">Getting the hands dirty</h1>
<p>Now we understood the problem, so we&rsquo;re capable of starting
translating it into Rust. Remember that I called it a block? Now we
represent the blocks as a <a href="https://doc.rust-lang.org/std/primitive.slice.html">Slice</a> of Bytes (u8).</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="k">use</span><span class="w"> </span><span class="n">core</span>::<span class="n">mem</span>::<span class="n">size_of</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="k">unsafe</span><span class="w"> </span><span class="k">impl</span><span class="w"> </span><span class="n">FromBytes</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="kt">u8</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="w">    </span><span class="k">fn</span> <span class="nf">from_bytes</span><span class="p">(</span><span class="n">bytes</span>: <span class="kp">&amp;</span><span class="p">[</span><span class="kt">u8</span><span class="p">])</span><span class="w"> </span>-&gt; <span class="nb">Option</span><span class="o">&lt;&amp;</span><span class="bp">Self</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="w">        </span><span class="kd">let</span><span class="w"> </span><span class="n">slice_ptr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">bytes</span><span class="p">.</span><span class="n">as_ptr</span><span class="p">().</span><span class="n">cast</span>::<span class="o">&lt;</span><span class="bp">Self</span><span class="o">&gt;</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="w">        </span><span class="k">if</span><span class="w"> </span><span class="n">bytes</span><span class="p">.</span><span class="n">len</span><span class="p">()</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">core</span>::<span class="n">mem</span>::<span class="n">size_of</span>::<span class="o">&lt;</span><span class="bp">Self</span><span class="o">&gt;</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="w">            </span><span class="k">unsafe</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="o">&amp;*</span><span class="n">slice_ptr</span><span class="p">)</span><span class="w"> </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="w">            </span><span class="nb">None</span><span class="w">
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w"> </span><span class="sd">/// Mutable implementation below
</span></span></span></code></pre></div><p>Wow, great job! It&rsquo;s finished, right? Not yet!!</p>
<h2 id="alignment">Alignment</h2>
<p>Rust doesn&rsquo;t have the <em>unsafe</em> keyword for nothing. When you convert
the slice to a type. it&rsquo;s possible that the data isn&rsquo;t aligned with
its original form for any reason, such something going wrong during
the cast. So we need to check!</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="k">use</span><span class="w"> </span><span class="n">core</span>::<span class="n">mem</span>::<span class="n">size_of</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="k">unsafe</span><span class="w"> </span><span class="k">impl</span><span class="w"> </span><span class="n">FromBytes</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="kt">u8</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="w">    </span><span class="k">fn</span> <span class="nf">from_bytes</span><span class="p">(</span><span class="n">bytes</span>: <span class="kp">&amp;</span><span class="p">[</span><span class="kt">u8</span><span class="p">])</span><span class="w"> </span>-&gt; <span class="nb">Option</span><span class="o">&lt;&amp;</span><span class="bp">Self</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="w">        </span><span class="kd">let</span><span class="w"> </span><span class="n">slice_ptr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">bytes</span><span class="p">.</span><span class="n">as_ptr</span><span class="p">().</span><span class="n">cast</span>::<span class="o">&lt;</span><span class="bp">Self</span><span class="o">&gt;</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="w">        </span><span class="k">if</span><span class="w"> </span><span class="n">bytes</span><span class="p">.</span><span class="n">len</span><span class="p">()</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">core</span>::<span class="n">mem</span>::<span class="n">size_of</span>::<span class="o">&lt;</span><span class="bp">Self</span><span class="o">&gt;</span><span class="p">()</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">slice_ptr</span><span class="p">.</span><span class="n">is_aligned</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="w">            </span><span class="k">unsafe</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="o">&amp;*</span><span class="n">slice_ptr</span><span class="p">)</span><span class="w"> </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="w">            </span><span class="nb">None</span><span class="w">
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w"> </span><span class="sd">/// Mutable implementation below
</span></span></span></code></pre></div><p>If for some reason, you wanna do it manually just change the if to:</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="ln">1</span><span class="cl"><span class="w">  </span><span class="k">if</span><span class="w"> </span><span class="n">bytes</span><span class="p">.</span><span class="n">len</span><span class="p">()</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">size_of</span>::<span class="bp">Self</span><span class="o">&lt;</span><span class="p">()</span><span class="o">&gt;</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="p">(</span><span class="n">ptr</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="kt">usize</span><span class="p">)</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="n">align_of</span>::<span class="o">&lt;</span><span class="bp">Self</span><span class="o">&gt;</span><span class="p">()</span><span class="w"> </span><span class="p">{}</span></span></span></code></pre></div><h1 id="the-end-and-acknowledgements">The end and acknowledgements</h1>
<p>For the last part of the patch, I wrote the documentation that was
probably the hardest part to me and it&rsquo;s very important, so if you plan to
contribute to Rust for Linux know that it&rsquo;s a big point for your patchs. I
have to thanks a lot people from Nvidia and <strong>Alexandre Corbout</strong> in
special that give me a lot of support in the patch approval process.</p>
<p>Thanks for <a href="https://lkcamp.dev/">lkcamp</a> too, I began my journey there.</p>
<p>A huge thanks for my girlfriend that show lkcamp to me and give me
inconditional support.</p>
<p>If you wanna see the code working <a href="https://play.rust-lang.org/?version=stable&amp;mode=debug&amp;edition=2024&amp;gist=a153d3d64fe535cc466f2ebd46f6be0b">click here</a></p>
<p>Link for the patch <a href="https://lore.kernel.org/rust-for-linux/20250824213134.27079-1-christiansantoslima21@gmail.com/">Discussion</a></p>
]]></content:encoded></item></channel></rss>