Custom minimal kernel dev environnement avec QEMU sous Arch Linux

J'avais écrits un peu sur ce blog pour devenir un kernel developer sous Linux. Comme j'en parlais c'est un metier très spéciale et rare considéré comme l'élite mondiale en developpement informatique. Et en plus il n'y a aucune formation en France, tout s'apprends sur le tas en autodidacte, même si les formations en systèmes embarqués abordent un peu le kernel.

Je compte parfaire mon apprentissage dans le domaine, même si j'avais laissé un peu de côté durant une période. Je dois me remettre à faire du langage C, que j'ai pas fait depuis quelques temps. Peut-être que je serai bien accueilli par la communauté Linux pour devenir kernel dev à voir. Je m'intéresse particulièrement à RISC-V. Je compte acheté un Sipeed Lichee RV D1 pour faire des tests.

Comment rejoindre la communauté et collaborer?

Soit les topics qui parle du sujet sur ce blog:

On va développer un environnement minimaliste pour tester le kernel et écrire nos propres modules. Un simple module "hello world" pour apprendre à développer sur le noyau. La configuration de QEMU est relativement simple, je n'aborde pas la virtualisation plus complète du système d'exploitation tel que l'utilisation de virtio ou encore rootfs dans les paramètres.

Pré-requis

Mettre à jours le système

sudo pacman -Syu

Installer les outils nécessaires

sudo pacman -S base-devel ncurses bison flex openssl elfutils libelf qemu

Etape 1

Télécharger la dernière version stable du kernel depuis: https://kernel.org/ et décompresser l'archive

tar -xvf linux-x.y.z.tar.xz
cd linux-x.y.z

Etape 2

Créer une configuration minimale du kernel

make defconfig

Personnaliser la configuration si nécessaire

make menuconfig

Etape 3

Compiler le noyau et install

make -j$(nproc)
sudo make install

Etape 4

On va créer notre module "Hello World", d'abord en créant un répertoire

mkdir -p ~/hello_module
cd ~/hello_module

Puis on créé notre module hello.c suivant

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Votre Nom");
MODULE_DESCRIPTION("A simple Hello World Linux module.");
MODULE_VERSION("1.0");

static int __init hello_init(void) {
    printk(KERN_INFO "Hello, World!\n");
    return 0;
}

static void __exit hello_exit(void) {
    printk(KERN_INFO "Goodbye, World!\n");
}

module_init(hello_init);
module_exit(hello_exit);

Créer un fichier makefile

obj-m += hello.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

Complier le module

make

Etape 5

Lancer QEMU avec le noyau compilé depuis le répertoire du noyau

qemu-system-x86_64 -kernel arch/x86/boot/bzImage -append "console=ttyS0" -serial stdio -nographic

Etape 6

Charger le module dans la console QEMU accessible via ctrl+A puis C.

insmod /path/to/hello_module/hello.ko

Verifier les messages du kernel pour voir la sortie "hello world"

dmesg | tail

Décharger le module

rmmod hello

En suivant ces étapes, vous aurez un environnement de développement minimal pour le noyau Linux sur Arch Linux, avec un module "Hello World" fonctionnel exécuté dans QEMU.