Projet système FPGA : 2010 - Hugues Evrard et Gaëtan Harter

De Ensiwiki
Aller à : navigation, rechercher


Le projet en quelques mots

Notre équipe se comporte de Hugues Evrard et Gaëtan Harter, deux élèves (promo 2011) de la filière SLE (Systèmes et Logiciels Embarqués) à l'Ensimag. Dans le cadre du projet de spécialité en fin de deuxième année, nous avons réalisé un système d'exploitation sur une architecture FPGA (Field-Programmable Gate Array). Ce projet s'est tenu de mi-mai à mi-juin de l'année 2010, nous avons principalement travaillé dans les salles systèmes de l'école. Nous avons mis en applications les notions vue en cours et utilisé des outils de développement (debugger, gestionnaire de version, etc) pour mener ce projet.

La carte FPGA : spécificités de l'architecture

Nous avons travaillé sur une carte FPGA [Xilinx] Spartan 3. Cette architecture présente quelques spécificités :

  • Un processeur de type Microblaze : le jeu d'instruction assembleur, les conventions d'appel, de gestion d'interruption, etc, sont différents d'un processeur type x86 (classique sur PC);
  • Un port série pour assurer les entrées/sorties, avec un module UART pour la gestion de ce port série;
  • Un contrôleur d'interruption ainsi qu'un timer propre à la carte.

La reprogrammation de la carte et le chargement du système d'exploitation sont des opérations relativement longues (plusieurs minutes...). Les machines des salles systèmes sont équipées des outils Xilinx qui permettent d'émuler la carte. Cette fonctionnalité est pratique, cependant le debugger reste très lent.

Ce qui a été fait au cours de ce projet

Le mini shell et la commande help

Le système d'exploitation

Le système d'exploitation créé offre les services minimums nécessaires à une exécution en temps partagé : plusieurs processus utilisent la machine en même temps, c'est le système qui se charge de leur donner la main à tour de rôle. La spécification complète du système d'exploitation est consultable à la page Projet système : spécification. Les services suivants ont ainsi été développés :

  • service d'entrée/sortie : la communication se fait via le port série de la carte, les processus peuvent écrire et lire sur ce port. Les étapes de lecture et d'écritures se font en attente active, ce qui bloque le système lors d'une transaction (un processus qui lance une transaction via le port série garde la main jusqu'à la fin de cette transaction).
  • services de gestion des processus : le système s'occupe d'allouer un environnement (piles, structure de processus) à la naissance d'un processus, et de nettoyer cet environnement à la mort du processus.
  • service de séparation du noyau : les processus n'accèdent pas directement aux ressources du noyau, ils passent par un appel système qui échange la pile utilisée (pile utilisateur / pile noyau).
  • service d'ordonnancement : les différents processus se partage le processeur, et le système d'exploitation orchestre ce partage en donnant la main aux différents processus à tour de rôle, en fonction de leur priorité.
  • service de communication : les processus peuvent communiquer entre eux via des files de messages gérées par le système d'exploitation. Ce dernier s'assure notamment du respect de la sémantique lors de ces communication.
  • service de gestion des interruptions : les interruptions dues au timer mettent à jour l'horloge du système et permettent au système d'avoir une référence pour le temps processeur alloué aux différents processus.
La batterie de tests fournie lancée depuis le shell

Le bootloader

Le bootloader est un petit programme qui va installer le code du système d'exploitation sur la carte. Il envoie un message sur le port série, puis attend les octets correspondant au code du kernel. A la réception, il les place en mémoire comme prévu. Enfin, il va brancher sur l'entrée du code kernel.

Une fois ce programme opérationnel, le chargement du noyau sur la carte devient beaucoup plus rapide. Cependant, le debugger n'avait plus le code source du noyau pour suivre l'exécution.

Le terminal utilisateur

Dans les binaires disponible en bas de page, le système lance par défaut un terminal utilisateur minimal. Ce shell vous propose quelques commandes (la liste des commandes est accessible par la commande "help"). On peut notamment lancer la batterie de test fournie par les encadrants.

Outils de développement

Au cours du projet, nous avons principalement utilisés les outils suivants :

  • Pour éditer le code : Emacs et Vim (en bépo pour ceux que ca intéresse ^^).
  • Le gestionnaire de version svn (imposé par les encadrants).
  • La carte FPGA Xilinx Spartan 3 et la suite logicielle correspondante [Xilinx].

Bilan

Certains détails spécifiques au projet FPGA nous ont ralenti dans le développement :

  • les problèmes d'alignement du code dans le mémoire lors de la recopie,
  • la zone bss de la partie user n'était pas initialisée à zéro par défaut,
  • l'absence de protection mémoire, qui autorise à écrire n'importe où sans warning spécifique.

De plus nous étions obligés de travailler dans les salles systèmes de l'école pour avoir accès aux outils Xilinx et à la carte. Il serait intéressant d'étudier les possibilités d'émulation d'un processeur MicroBlaze sur une machine personnelle (via QEMU ?).

Ce projet nous a permis d'aborder concrètement la conception d'un système d'exploitation. L'architecture spécifique FPGA impose des outils de développement plus lent qu'une architecture PC classique, cependant elle pousse aussi à comprendre finement les liens entre le système d'exploitation et le matériel sur lequel il s'applique.

Références

Nous avons tout au long du projet collaboré avec l'autre équipe travaillant sur un projet système FPGA : Projet système FPGA : 2010 - Ugo Martin, Louis Rannou et Pierre Schamberger

L'ensemble des pages sur les projets systèmes est disponible sur la page des résultats : Projet système : résultats

Projet système, Sebastien Viardot : La documentation fournie sur l'Ensiwiki et la page de Sébastien Viardot.

The GNU Assembler : Pour les directives assembleur qui sont communes à celle de l'assembleur Microblaze.

Forum blackfin.uclinux.org : l'utilisation de ". = ALIGN(4);" pour aligner une sous-section dans un fichier .lds.

Code Generation for Switch Statement : utilisé comme inspiration pour réaliser les appels système.

Programme

Media:Bin_projet_systeme_fpga_evrardh_harterg.tar.gz‎ : binaires du bootloader et du système.

Media:Systeme_FPGA_evrardh_harterg.tar.gz‎ : architecture matérielle à envoyer sur la carte.

Pour executer le système il faut exécuter les commandes suivantes :

source /Xilinx/env-8.1i.sh

Pour envoyer l'architecture sur la carte, brancher la carte sur le port parallèle et le port série, et exécuter dans le dossier Systeme_FPGA :

make -f system.make download
xmd -opt etc/xmd_microblaze_0.opt

Dans un nouveau terminal et dans le dossier avec les binaires lancer :

mb-gdb bootloader.elf --directory=. &
cu --line=/dev/ttyS0 --nostop --speed=115200 --parity=none

Lancer le bootloader avec le bouton Run dans mb-gdb , puis lorsque le bootloader dira, sur l'interface cu, qu'il est prêt à recevoir, envoyer le système avec la commande :

cat k2d.bin > /dev/ttyS0