<?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>ingoro.dev</title><link>https://ingoro.dev/</link><description>Recent content on ingoro.dev</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sun, 21 Jun 2026 12:45:49 +0200</lastBuildDate><atom:link href="https://ingoro.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Improving the Linker</title><link>https://ingoro.dev/devlogs/005-improving-the-linker/</link><pubDate>Sun, 21 Jun 2026 12:45:49 +0200</pubDate><guid>https://ingoro.dev/devlogs/005-improving-the-linker/</guid><description>&lt;h2 id="the-problem"&gt;The problem&lt;/h2&gt;
&lt;p&gt;As I said, changing from &lt;code&gt;.data&lt;/code&gt; to &lt;code&gt;.rodata&lt;/code&gt; got rid of the warning about one segment having all permissions, but that&amp;rsquo;s like a patch, not a fix. To fix it, I need to define more sections in my linker so that they end up in different segments. It&amp;rsquo;s as easy as defining them the same way I defined the &lt;code&gt;.text&lt;/code&gt; section.&lt;/p&gt;
&lt;h2 id="the-solution"&gt;The solution&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-ld" data-lang="ld"&gt;OUTPUT_ARCH(riscv)
ENTRY(_start)
SECTIONS
{
. = 0x80200000;
.text : {
*(.text)
}
.rodata : {
*(.rodata)
}
.data : {
*(.data)
}
.bss : {
*(.bss)
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It is also important to say that while I didn&amp;rsquo;t explain properly, when I meant my code was being put in the correct address by luck, I didn&amp;rsquo;t mean it in that way. What I meant was that the start of my program was being put in the correct address because I had defined before in the linker where it would go, but the fact that it worked without using &lt;code&gt;.global&lt;/code&gt; felt like luck because had I misplaced the code on memory it wouldn&amp;rsquo;t have ran.&lt;/p&gt;</description></item><item><title>Improving My Print Function</title><link>https://ingoro.dev/devlogs/004-improving-my-print-function/</link><pubDate>Sun, 21 Jun 2026 00:54:35 +0200</pubDate><guid>https://ingoro.dev/devlogs/004-improving-my-print-function/</guid><description>&lt;h2 id="touching-something-that-works"&gt;Touching something that works&lt;/h2&gt;
&lt;p&gt;While it is true that if something works you should not touch it, I read that the best function is the one that behaves like a blackbox. The caller doesn&amp;rsquo;t know or need to know what&amp;rsquo;s going on inside the function and the function doesn&amp;rsquo;t know or need to know what will happen once it goes back. Right now, I have this code:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-assembly" data-lang="assembly"&gt;.section .text
_start:
la t0, string // load the address of string in t0
call print // call the print function, which stores the address to come back in ra (return address)
wfi // hang the CPU
print:
beqz t0, done // if t0 is 0, go to &amp;#34;done&amp;#34;
lbu a0, 0(t0) // load the byte at t0 in a0
li a7, 0x01 // load write() into a7
ecall // write
addi t0, t0, 1 // add 1 byte to the address in t0: t0 = t0 + 1
j print // go back to the start
done:
ret // return
.section .data
string:
.asciz &amp;#34;This is a string&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;As you can see, I load the address of the string in &lt;code&gt;t0&lt;/code&gt; before I call &lt;code&gt;print&lt;/code&gt;. This isn&amp;rsquo;t bad, but it&amp;rsquo;s not standard. Instead, I should use &lt;code&gt;a0&lt;/code&gt; and handle moving everything inside the function. Since I will need to then move the address into &lt;code&gt;t0&lt;/code&gt;, I am gonna use a &lt;code&gt;print&lt;/code&gt; label for the preparation step and a &lt;code&gt;print_loop&lt;/code&gt; as the label for the &amp;ldquo;worker&amp;rdquo;, so like this:&lt;/p&gt;</description></item><item><title>Writing a printing function in assembly</title><link>https://ingoro.dev/devlogs/003-making-a-print-function/</link><pubDate>Sat, 20 Jun 2026 16:27:00 +0200</pubDate><guid>https://ingoro.dev/devlogs/003-making-a-print-function/</guid><description>&lt;h2 id="printing-in-assembly-sucks"&gt;Printing in assembly sucks&lt;/h2&gt;
&lt;p&gt;One of the many things that help when developing any kind of software is being able to print. Printing can make it easier to follow the values of variables, error messages or even just be like &amp;ldquo;we&amp;rsquo;re in step 2 now!&amp;rdquo; so that you don&amp;rsquo;t lose track of where you are during testing. However, as it was shown in my previous devlog, printing in assembly is an absolute nightmare. For each and every time I want to show a message on the screen, I have to print each character individually, which means loading the &amp;ldquo;character&amp;rdquo; register and the &amp;ldquo;function&amp;rdquo; register individually each time and then make the call so that OpenSBI knows what I want to do. Because of that, I am gonna make a function so that I can pass strings and the function takes care of printing for me.&lt;/p&gt;</description></item><item><title>Hello World!</title><link>https://ingoro.dev/devlogs/002-hello-world/</link><pubDate>Sat, 20 Jun 2026 02:52:00 +0200</pubDate><guid>https://ingoro.dev/devlogs/002-hello-world/</guid><description>&lt;h2 id="greeting-the-world-as-were-always-taught"&gt;Greeting the world as we&amp;rsquo;re always taught&lt;/h2&gt;
&lt;p&gt;No matter what, every single time you learn a new programming language or somehow mess with software that you haven&amp;rsquo;t yet tried out, you will or should start by the &lt;code&gt;Hello World!&lt;/code&gt; program, which is nothing more than getting a text saying exactly that. Since I chose to target firmware instead of hardware so that when I switch to an actual chip I don&amp;rsquo;t have to rewrite my code, I need to learn what OpenSBI is.&lt;/p&gt;</description></item><item><title>The Beginning</title><link>https://ingoro.dev/devlogs/001-the-beginning/</link><pubDate>Fri, 19 Jun 2026 13:12:34 +0200</pubDate><guid>https://ingoro.dev/devlogs/001-the-beginning/</guid><description>&lt;h2 id="the-reasoning-behind-the-bad-idea"&gt;The reasoning behind the bad idea&lt;/h2&gt;
&lt;p&gt;Although the value of OS projects has been discussed for decades and it is completely true that it is impossible for a single human being to be able to beat what has been built in the span of almost half a century by sheer willpower alone, many fail to identify that it is as much of a waste of time as it is playing videogames, partying or painting (to list a few examples). While a person should aspire to become the best version of themselves and of course aim to be productive in their day-to-day life, they should also not deprive themselves of the comfort that is having activities that aren&amp;rsquo;t aimed at making the best out of the limited time they have on Earth. If people only worked towards goals that granted them success in areas like money, it would be unhealthy and much harder to maintain than doing the same things but with hobbies aside. If you want to spend your free time doing something, as long as you don&amp;rsquo;t harm others or yourself, you should do it.&lt;/p&gt;</description></item></channel></rss>