Symbolic Picture: .bss is part of .data section

GNU ld: Linking .bss into .data to Ensure that Mem Size Equals File Size For Each LOAD Segment (.bss in a PROGBITS Section)

Update: I found another variant. I appended it to the end of the article. Original post: Some rudimentary ELF loaders require that p_memsz equals p_filesz for each LOAD segment in order to simplify the loading of the file. For example, the microkernels NOVA and Hedron have this restriction to bootstrap their roottasks (inital process). In this blog post, I’m going to provide a solution how this can be achieved when an ELF is Read more…

CLI Utility to Calculate Indices for Page Tables

I just want to drop a short notice that I created a small CLI utility that I think is helpful. paging-calculator helps you to calculate the indices for a given virtual address that are used for the physical address lookup at different page table levels. Paging is a mechanism that operating systems use for memory management. Check it out on crates.io or GitHub. You can install it with cargo install paging-calculator. It works Read more…

Screenshot of the `paging-calculator` CLI utility
acpid - Terminal Screenshot

Configure acpid From BusyBox in a Custom initrd

I have a setup with a Linux Kernel and a custom initrd, hence, no full Linux distribution. The initrd is meant to be as minimal as it can be. As a consequence, even basic things such as power-off on power-button pressed must be configured manually. There is no init system available – instead, I have to provide the init system. The initrd contains utilities from busybox. In this blog post, I show you Read more…

The Probably Simplest x86 Driver Written in Assembly – Printing to QEMU’s debugcon-Device

This is an educational resource I wish I had when I started digging into low-level and operating systems during my early time of my studies at the university. However, dear past me, I got your back! Do you want to see a minimal way to communicate with (virtual) hardware and all of that written in pure assembly? Here you go. But at first, a few background information. How do we communicate with hardware? Read more…

Code Snippet: Part of the QEMU Debugcon Driver written in Assembly
Assembly Code Snippet: Use section flags if you need custom section names

GNU ld Discards Section Containing Code – Section Flags are Important for ELF Files

Update: Since I published this article, I gained more knowledge from own research and hints from others. I adjusted the blog post. Thanks for the help! When it comes to low-level systems engineering and producing binaries, such as firmware or kernels, dealing with linkers and especially linker scripts feels like the end boss in a video game. Only very little (good) documentation can be found on the Web. This blog post is the Read more…

Create a Bootable Image for a Custom Kernel with GRUB as Bootloader for Legacy x86 Boot (e.g. Multiboot2 Kernel)

In this blog post, I want to show you how you can boot your custom (i.e., self developed, non-linux) kernel with GRUB 2 in a legacy x86 boot flow. The tutorial is focused on Linux as build environment. A working example can be found on my GitHub. Introduction When you are an OS developer/low-level hacker and write your own kernels, you need a setup to boot your software stack (i.e., kernel and user Read more…