Linux et PetaLinux sur Zynq
Comprendre le noyau, l'espace utilisateur, l'arbre de périphériques et les chemins sûrs pour accéder au matériel de la PL.
Pourquoi ajouter un système d'exploitation
Une application standalone s'exécute directement sur le processeur, sans système d'exploitation complet. Linux ajoute des processus isolés, des threads, un ordonnanceur, une mémoire virtuelle, des systèmes de fichiers, une pile réseau et un modèle de pilotes.
Ce service a un coût. Les changements de contexte, les interruptions et la gestion mémoire ajoutent de la latence. Linux convient aux interfaces riches, au réseau, au stockage et aux applications complexes. Une boucle de contrôle très déterministe peut rester sur le RPU ou dans la PL.
Espace utilisateur et noyau
Un programme en espace utilisateur ne doit pas accéder librement à tous les registres physiques. Il demande un service au noyau avec un appel système. Le noyau est la partie centrale de Linux. Il vérifie les droits, gère les ressources et délègue l'accès matériel au pilote.
| Niveau | Responsabilité |
|---|---|
| Application | Algorithme, interface et traitement métier |
| Bibliothèque | API stable utilisée par l'application |
| Noyau | Processus, mémoire, interruptions et sécurité |
| Pilote | Traduction entre l'API noyau et le périphérique |
| Matériel | Registres, DMA, interruptions et flux |
Cette séparation évite qu'une erreur dans une application corrompe directement le système.

Le rôle de PetaLinux
PetaLinux regroupe les outils AMD destinés à construire un système Linux pour les FPGA SoC. Il s'appuie sur Yocto, les outils de compilation croisée et la description matérielle exportée.
Le flot général reste simple.
- Créer le projet PetaLinux.
- Importer la description du matériel.
- Configurer le noyau, le rootfs et les périphériques.
- Construire les images.
- Packager le démarrage.
- Déployer sur carte et lire la console série.
Le matériel et le logiciel doivent rester synchronisés. Une nouvelle adresse AXI ou une nouvelle interruption impose une mise à jour de l'arbre de périphériques et parfois du pilote.
L'arbre de périphériques
Le Device Tree, ou arbre de périphériques, est une description de la carte lue au démarrage par le noyau. Il renseigne le matériel qui ne peut pas être découvert automatiquement. Un nœud d'IP AXI peut contenir son adresse, sa taille, son interruption, ses horloges et une chaîne compatible.
led_controller@a0000000 {
compatible = "fpgapourtous,led-controller-1.0";
reg = <0x0 0xa0010000 0x0 0x1000>;
interrupts = <0 89 4>;
};La valeur exacte des cellules dépend de l'architecture et du contrôleur d'interruptions. Il faut partir du Device Tree généré et de la documentation de la cible.
Accéder à un GPIO
L'ancienne interface sysfs utilise /sys/class/gpio. Elle exporte un numéro, lit le fichier direction puis accède au fichier value.
FILE *fp = fopen("/sys/class/gpio/export", "w");
fprintf(fp, "%d", gpio_number);
fclose(fp);Ce code reste utile pour comprendre le modèle fichier. Dans un projet récent, l'interface GPIO par descripteur et libgpiod est préférable lorsque le noyau et la distribution la proposent. Elle évite les numéros globaux fragiles.
Accès mémoire et pilote dédié
/dev/mem permet de mapper une adresse physique avec mmap. Il est pratique pour un diagnostic contrôlé. Il contourne une partie du modèle de sécurité et ne gère pas correctement à lui seul les interruptions, le DMA, les horloges ou la concurrence.
UIO convient à certains périphériques simples. Une partie minimale reste dans le noyau et l'essentiel du traitement se trouve en espace utilisateur. Un pilote noyau complet est préférable pour un périphérique partagé, un DMA, une gestion d'alimentation ou une interface destinée à durer.
DMA sous Linux
Une adresse retournée par malloc est virtuelle. Elle ne doit pas être écrite directement dans un registre DMA. Le pilote utilise l'API DMA du noyau pour obtenir un buffer et une adresse utilisable par le périphérique. L'API gère aussi les contraintes de cohérence et de mapping.
Cette différence est fondamentale entre une application standalone et une application Linux.
Répartir les fonctions
Sur Zynq UltraScale+ MPSoC, Linux peut s'exécuter sur l'APU tandis qu'un traitement temps réel s'exécute sur le RPU. La communication utilise une mémoire partagée, des interruptions interprocesseurs et des frameworks comme remoteproc et RPMsg selon l'architecture logicielle.
Il faut définir la propriété des périphériques et des régions mémoire. Deux systèmes ne doivent pas configurer la même ressource sans protocole.
Références officielles
Le PetaLinux Tools Reference Guide UG1144 décrit les outils et leur intégration avec Yocto. Le Software Developers Guide UG1137 regroupe les ressources logicielles Zynq UltraScale+ MPSoC.
À retenir
Linux sépare les applications du matériel par le noyau et les pilotes. Le Device Tree décrit les IP de la plateforme. PetaLinux construit un système adapté au XSA. Les anciennes interfaces sysfs illustrent le principe, mais un projet récent doit privilégier les API noyau actuelles et les pilotes adaptés.
Tester mes connaissances - Quiz du chapitre