Noyau temps réel (PREEMPT_RT)#

Pourquoi#

Un noyau Linux standard n’est pas conçu pour garantir un délai de réaction maximal : une section critique du kernel peut retarder le traitement d’une interruption de plusieurs millisecondes sous charge. Pour la plupart des usages c’est invisible ; pour capter un signal PPS avec une précision nanoseconde, c’est rédhibitoire. Le patch PREEMPT_RT rend les sections critiques du noyau elles-mêmes préemptibles, ramenant la latence d’interruption au pire cas de plusieurs millisecondes à quelques dizaines de microsecondes.

Comment#

Installation#

apt update
apt install -y linux-image-rpi-v8-rt linux-headers-rpi-v8-rt

apt list --installed 2>/dev/null | grep rpi-v8-rt
ls -lh /boot/firmware/kernel8_rt.img

Sur Raspberry Pi 5, le paquet spécifique linux-image-rpi-2712-rt n’existe pas dans les dépôts officiels au moment de la rédaction. Le paquet générique linux-image-rpi-v8-rt (ARMv8 générique, pages 4 KiB) est la voie officielle reproductible, sans les optimisations Cortex-A76 spécifiques au Pi 5, mais parfaitement fonctionnel.

Sélection au boot#

Le firmware Pi 5 charge par défaut le kernel standard, pas le kernel RT fraîchement installé : il faut le rediriger explicitement dans /boot/firmware/config.txt :

[pi5]
kernel=kernel8_rt.img

Erreurs à éviter#

Une faute de frappe sur le nom de fichier est silencieusement ignorée. Le paquet produit kernel8_rt.img (underscore), pas kernel8-rt.img (tiret). Une directive kernel= invalide ne génère aucune erreur au boot, le firmware retombe simplement sur le kernel par défaut, avec l’illusion de tourner sous RT alors que ce n’est pas le cas. C’est le même piège que pour config.txt en général (voir chapitre Firmware) : toujours vérifier le résultat, jamais supposer que l’absence d’erreur signifie succès.

  • Se fier à /sys/kernel/realtime pour valider l’installation. Cet attribut sysfs est spécifique à un patch hors-mainline (utilisé par LinuxCNC), absent sur un kernel RPi v8-rt parfaitement fonctionnel. Ce n’est pas un test fiable, voir la section Vérifier ci-dessous pour la bonne méthode.
  • Attendre nohz_full/rcu_nocbs du chapitre suivant. Le kernel linux-image-rpi-v8-rt n’est pas compilé avec CONFIG_NO_HZ_FULL. Les paramètres nohz_full= et rcu_nocbs= sont acceptés sans erreur au boot mais n’ont aucun effet réel, seul isolcpus= fonctionne sur ce kernel (détails au chapitre Firmware).

Vérifier#

reboot
# … reconnexion …

uname -a
# Doit contenir : …-v8-rt … #1 SMP PREEMPT_RT … aarch64
# AVANT correction : 6.12.75+rpt-rpi-2712 #1 SMP PREEMPT       (kernel standard)
# APRÈS correction : 6.12.75+rpt-rpi-v8-rt #1 SMP PREEMPT_RT   (kernel RT)

dmesg | grep -E '\bPREEMPT_RT\b'
# Doit afficher la ligne de bannière de boot avec PREEMPT_RT

dmesg | grep -i "Preemptible hierarchical RCU"
# Doit retourner : "rcu: Preemptible hierarchical RCU implementation."

Si uname -r retourne toujours le suffixe -rpi-2712 au lieu de -v8-rt, trois causes possibles, dans l’ordre de fréquence observée : faute de frappe dans le nom de fichier, section [pi5] mal placée dans config.txt (doit précéder [all]), ou fichier kernel8_rt.img simplement absent. vcgencmd get_config kernel confirme quel fichier le firmware a réellement chargé.


📚 Pour aller plus loin

Le patch PREEMPT_RT, maintenu par Thomas Gleixner et la communauté depuis 2004, a été fusionné dans le noyau Linux mainline en version 6.12 (novembre 2024), ce projet en bénéficie directement. Il agit à trois niveaux : conversion des spinlocks du noyau en rt_mutex préemptibles avec héritage de priorité, conversion des softirqs en threads schedulables, et gestionnaires d’interruption threadés (chaque IRQ devient un thread ordonnançable individuellement, avec sa propre priorité : c’est ce qui permet, au chapitre suivant, de donner à l’IRQ PPS une priorité SCHED_FIFO 99, la plus haute possible).