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.imgSur Raspberry Pi 5, le paquet spécifique
linux-image-rpi-2712-rtn’existe pas dans les dépôts officiels au moment de la rédaction. Le paquet génériquelinux-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.imgErreurs à éviter#
Une faute de frappe sur le nom de fichier est silencieusement ignorée. Le paquet produit
kernel8_rt.img(underscore), paskernel8-rt.img(tiret). Une directivekernel=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 pourconfig.txten 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/realtimepour 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_nocbsdu chapitre suivant. Le kernellinux-image-rpi-v8-rtn’est pas compilé avecCONFIG_NO_HZ_FULL. Les paramètresnohz_full=etrcu_nocbs=sont acceptés sans erreur au boot mais n’ont aucun effet réel, seulisolcpus=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_mutexpré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).