Logiciels Libres et Systèmes Embarqués


Intégration d'un système Linux sur FPGA Xilinx muni d'un PowerPC 405

Rapport de stage Master Professionnel 2005 Concepteur en Architectures de Machines et Systèmes Informatiques

Cédric Vincent

Tout le texte (paragraphes, exemples de code, tableaux, ...) disponible dans ce rapport est sous licence Creative Commons by-nc-sa 2.5. Cela ne s'applique pas aux photos, captures d'écran, aux schémas et aux citations.

Résumé

Ce document décrit le travail que j'ai effectué durant mon stage dans l'entreprise « Systèmes Midi-Pyrénées ». SMP est une PME spécialisée dans la conception de stations au sol pour la communication par satellite. Ce stage a été effectué dans le cadre du Master Professionnel « Concepteur en Architectures de Machines et Systèmes Informatiques » (CAMSI) 2005.

L'objectif de ce stage était d'intégrer un système Linux dans un « Field-Programmable Gate-Array ». Un FPGA est une puce électronique composée de cellules logiques que l'on peut interconnecter à volonté pour créer un circuit intégré personnalisé. J'ai développé sur un FPGA Xilinx Virtex-II Pro, ce dernier contenant un PowerPC 405. J'ai donc utilisé ce processeur intégré en tant que processeur principal du système Linux. Linux est un noyau, c'est-à-dire un logiciel qui crée une abstraction entre le matériel et les programmes. Par exemple, lorsqu'un programme écrit dans un fichier, c'est le noyau qui pilote le disque dur pour y écrire les octets.

Les systèmes logiciels conçus pour ce genre de FPGA ne sont pas comme ceux fonctionnant sur les « System-on Chip ». Premièrement, les périphériques peuvent être mappés à différentes adresses (selon la configuration du FPGA), donc les logiciels bas-niveau (comme le noyau Linux) doivent être écrits de manière à contourner ce problème. De plus, les systèmes embarqués n'ont que peu de mémoire, par conséquent les développeurs doivent prendre soin de ne pas gaspiller les ressources. Ces notions peuvent sembler obscures à un développeur "traditionnel", c'est pourquoi j'ai rédigé comment développer pas à pas un système Linux pour Virtex-II Pro. Au final, j'ai conçu un système qui est plus performant (en coût, et en ressources) que les solutions déjà existantes. Par exemple, le noyau Linux que je fournis est plus générique que celui des autres fournisseurs. De même, la distribution Linux conçue dans le cadre de ce stage démarre plus rapidement et utilise moins de mémoire que toutes celles conçues pour le Virtex-II Pro.

Ce stage constitue un premier pas dans le monde industriel. Il représente également un très grand atout pour mon projet professionnel. Les responsables de l'entreprise SMP souhaitent à présent me confier une nouvelle mission à partir de Septembre : harmoniser l'IHM (logiciel) et TNS (matériel), afin d'intégrer ces deux compétences dans la même puce FPGA.


Table des matières

Remerciements
I. Présentation
1. Introduction
1.1. Entreprise d'accueil
1.1.1. Logiciels libres
1.1.2. Enjeux
1.2. Structure de ce document
1.3. Convention de typographie
1.4. Méthodologie
2. Ressources
2.1. Introduction
2.2. FPGA et PowerPC 405
2.3. Conception d'une architecture
2.4. Assistant de création
2.4.1. Modifications EDK de l'architecture
2.4.2. Configuration du logiciel
2.4.3. Modifications VHDL de l'architecture
II. Travaux et Résultats
3. Installation des outils de développement GNU
3.1. Introduction
3.2. Mise en place
3.3. Les fichiers d'en-tête
3.3.1. Fichier d'en-tête du noyau Linux
3.3.2. Fichier d'en-tête de la GlibC
3.4. Binutils
3.5. GCC d'amorce
3.6. GlibC uniquement
3.7. GCC complet
3.8. Programmes de la GlibC
3.9. Test
3.10. Résultats et Conclusion
4. Portage du chargeur U-Boot
4.1. Introduction
4.2. Principe de U-Boot
4.3. Fonctionnement Simple
4.3.1. Configuration de U-Boot
4.3.2. Modification des sources
4.4. Support de l'Ethernet
4.4.1. Configuration de U-Boot
4.4.2. Modification des sources
4.5. Support de la CompactFlash
4.5.1. Configuration de U-Boot
4.5.2. Modification des sources
4.6. Support de la Flash
4.6.1. Configuration de U-Boot
4.6.2. Modification des sources
4.7. Charger U-Boot
4.8. Débogage
4.8.1. Machine Check Exception
4.8.2. Compilation avec des outils récents
4.8.3. Désactivation du DCR
4.9. Résultats et conclusion
5. Portage du noyau Linux
5.1. Introduction
5.2. Evaluation des travaux disponibles
5.3. Mise en place
5.3.1. Obtenir les sources du noyau
5.3.2. Support de la plateforme Virtex
5.4. Amorce du noyau Linux
5.5. Configuration du processeur
5.5.1. Initialisation temporaire de la MMU
5.5.2. Adaptation au processeur
5.5.3. Initialisation de la plateforme
5.5.4. Initialisation définitive de la MMU
5.6. Initialisation du noyau Linux
5.6.1. Initialisation de la carte
5.6.2. Parcours de la ligne de commande
5.6.3. Initialisation du contrôleur d'interruptions
5.7. Pilote du contrôleur d'interruptions
5.8. Pilote du contrôleur série
5.9. Pilote de l'interface réseau XEmac
5.10. Pilote de l'interface CompactFlash
5.11. Pilote de l'interface Flash
5.12. Contraintes sur l'architecture
5.13. Débogage
5.13.1. Niveau d'optimisation
5.13.2. Machine Check Exception
5.14. Conclusion et résultats
6. Création d'une distribution Linux
6.1. Introduction
6.2. Synthèse de l'évaluation
6.2.1. Bibliothèques C
6.2.2. Collections d'outils
6.3. µClibC
6.3.1. Présentation
6.3.2. Installation
6.3.3. Outils de développement
6.4. Système minimal
6.4.1. Le système de fichiers racine
6.4.2. Le programme "init"
6.4.3. Mise en place
6.5. BusyBox
6.5.1. Mise en place
6.6. Ajout de bibliothèques
6.6.1. Exemple avec NCurses-5.4
6.6.2. Exemple avec Zlib-1.2.2
6.7. Distribution par NFS
6.8. Conclusion et résultats
III. Conclusions et perspectives
7. Synthèse globale des résultats obtenus
8. Conclusion personnelle
IV. Annexes
A. Evaluation des logiciels pour l'embarqué
A.1. Problématique de l'embarqué
A.1.1. Mémoire limitée
A.1.2. Réactivité
A.2. Système de base
A.2.1. Système CoreUtils
A.2.2. BusyBox
A.2.3. Système Embutils
A.2.4. Système K
A.2.5. Système Heirloom
A.3. Bibliothèque C
A.3.1. GlibC
A.3.2. µClibC
A.3.3. Newlib
A.3.4. DietLibC
A.3.5. KlibC
A.4. Conclusion
B. Optimisation de la mémoire
B.1. Introduction
B.2. Mise en oeuvre
B.3. Méthode "artisanale"
B.3.1. Synthèse
B.4. Méthode "industrielle"
B.4.1. Synthèse
B.5. Conclusion
Bibliographie
Index