54 | | Si l'application logicielle est écrite en langage C, il faut utiliser un cross-compilateur C spécifique |
55 | | au processeur embarqué pour compiler ce code applicatif, ainsi que le code du système d'exploitation embarqué. |
56 | | Le résultat est un fichier binaire au format ELF, qui doit ensuite être chargé dans les mémoires embarquées du MPSoC. |
| 54 | Les composants de la bibliothèque SoCLib permettent d'exécuter des systèmes d'exploitation généralistes (tels que LINUX ou NetBSD), ou des systèmes d'exploitation spécialisés pour MPSoC (tels que MutekH ou ALMOS). Dans ce TP et les suivants, on se contentera d'un |
| 55 | système d'exploitation minimal, constitué par un Gestionnaire d'Interruptions, Exceptions et Trappes (GIET). |
| 56 | |
| 57 | L'application qui nous intéresse dans ce TP est une application logicielle qui s'exécute en mode utilisateur. |
| 58 | Comme elle utilise deux périphériques (terminal TTY et coprocesseur GCD), elle doit faire faire des appels |
| 59 | système vers le GIET pour accéder à ces périphériques. |
60 | | Les composants de la bibliothèque SoCLib permettent d'exécuter des systèmes d'exploitation généralistes (tels que LINUX ou NetBSD), ou des systèmes d'exploitation spécialisés pour MPSoC (tels que [https://www.mutek.fr/ MutekH]). Dans ce TP et les suivants, on se contentera d'un |
61 | | système d'exploitation minimal, constitué par un Gestionnaire d'Interruptions, Exceptions et Trappes (GIET). Le GIET fournit quelques appels systèmes permettant aux programmes utilisateurs d'accéder aux périphériques, il traite les requêtes d'interruption vectorisées émises par les périphériques, et facilite le debug du logiciel embarqué en signalant les exceptions. |
62 | | |
63 | | Vous pouvez consulter le code source du système d'exploitation dans le répertoire |
64 | | {{{ |
65 | | /users/enseig/alain/giet |
66 | | }}} |
67 | | |
68 | | * le fichier '''giet.s''' est écrit en assembleur et contient le code du Gestionnaire d'Interruption, Exceptions et Trappes. Le GIET est l'unique point d'entrée dans le système d'exploitation. Ce code s'exécute en mode ''kernel'', et se termine toujours par une instruction ''eret''. |
69 | | * les fichier '''stdio.c''' et '''stdio.h''' sont écrits en C, et contiennent le code des appels systèmes permettant à un programme s'exécutant en mode ''user'' d'accéder aux périphériques. |
70 | | * les fichiers '''drivers.c''' et '''drivers.h''' sont écrits en C et contiennent le code des fonctions systèmes qui s'exécutent en mode kernel, qui accèdent effectivement aux périphériques ou aux registres protégés du processeur. |
71 | | * le fichier '''isr.s''' contient le code des routines de traitement des interruptions (Interrupt Service Routine). |
| 63 | Le GIET fournit principalement trois services: |
| 64 | |
| 65 | * un ''gestionnaires d'appels systèmes'' fournissant en particulier des fonctions d'accès aux périphériques. |
| 66 | * un ''gestionnaire d'interruptions'' supportant un mécanismes d'interruptions vectorisées. |
| 67 | * un ''gestionnaire d'exceptions'' permettant de traiter les erreurs des programmes utilisateurs. |
| 68 | Les deux principales limitations du GIET, qui le différencient d'un ''vrai'' système d'exploitation, sont l'absence de support pour la mémoire virtuelle, et l'absence de support pour la création dynamique de tâches. |
| 69 | |
| 70 | Le code du GIET est séparé en deux parties: Les fichiers contenant le code qui s'exécute en mode ''superviseur'' est contenu dans le répertoire '''sys''', tandis que les fichiers contenant le code qui s'exécute en mode ''utilisateur'' est contenu dans le répertoire '''app'''. |
| 71 | |
| 72 | * Le fichier '''sys_handler.c''' est écrit en C. Il est dans le répertoire '''sys''', et contient le code du gestionnaire d'appels systèmes, chargé d'appeler la fonction système correspondant au service demandé. |
| 73 | * Le fichier '''exc_handler.c''' est écrit en C. Il est dans le répertoire '''sys''', et contient le code du gestionnaire d'exceptions, chargé de la signalisation et du traitement des erreurs détectées dans les programmes utilisateurs. |
| 74 | * Le fichier '''irq_handler.c''' est écrit en C. Il est dans le répertoire '''sys''', et contient le code du gestionnaire d'interruptions, ainsi que les routines de traitement des interruptions (ISR). |
| 75 | * Le fichier '''ctx_handler.c''' est écrit en C. Il est dans le répertoire '''sys''', et contient le code du gestionnaire de changements de contexte, utilisé lorsque un processeur exécute plusieurs tâches en multiplexage temporel. |
| 76 | * Le fichier '''drivers.c''' contient les fonctions d'accès aux périphériques. Il rassemble donc les ''pilotes'' de tous les périphériques de la machine. |
| 77 | * Le fichier '''common.c''' est écrit en C. Il est dans le répertoire '''sys''', et contient les fonctions générales du système d'exploitation, telles que les primitives de synchronisation entre tâches. |
| 78 | * Le fichier '''giet.s''' est écrit en assembleur MIPS32. Il est dans le répertoire '''sys''', et contient la fonction qui analyse la cause de l'appel au GIET, et la fonction de sauvegarde/restauration de contexte. |
| 79 | * Le fichier '''stdio.c''' est écrit en C. Il est dans le répertoire '''app''' car il contient l'ensemble des appels systèmes qui peuvent être utilisés par un programme utilisateur écrit en C. Le nom de ce fichier provient du fait que la plupart des appels systèmes sont utilisés pour accéder aux périphériques. |
| 80 | |
| 81 | Le code source du GIET est accessible et stocké dans le répertoire suivant: |
| 82 | |
| 83 | {{{ |
| 84 | /users/enseig/alain/giet_2011/ |
| 85 | }}} |
105 | | Pour cette architecture, il faut définir 9 segments dans l'espace adressable, dont 7 correspondent à de la mémoire, et 2 correspondent à 2 périphériques adressables : |
| 120 | == 4.1 segmentation de l'espace adressable == |
| 121 | |
| 122 | Pour cette architecture, il faut définir 9 segments dans l'espace adressable, dont 3 correspondent à l'application et 6 appartiennent au système d'exploitation (adrresses plus grandes que 0x80000000). |
| 123 | |
| 124 | === segments applicatifs === |
| 125 | |
| 126 | * '''seg_code''' est le segment contenant le code de l'application logicielle embarquée, qui s'exécute en mode ''user''. Il est assigné à la RAM. On choisira pour adresse de base la valeur 0x00400000, et une capacité de stockage de 64 Koctets. |
| 127 | |
| 128 | * '''seg_data''' est le segment contenant les données globales de l'application logicielle embarquée. Il est assigné à la RAM. On choisira pour adresse de base la valeur 0x01000000, et une capacité de stockage de 64 Koctets. |
| 129 | |
| 130 | * '''seg_stack''' est le segment contenant la pile d'exécution de l'application logicielle embarquée. Il est assigné à la RAM. On choisira pour adresse de base la valeur 0x02000000, et une capacité de stockage de 64 Koctets. |
| 131 | |
| 132 | === segments système === |
121 | | 1. Pour le logiciel, les adresses de base des segments doivent être définies dans le fichier ''soft/ldscript'' qui contient les directives pour l'éditeur de liens lors de la compilation du logiciel embarqué. |
122 | | |
123 | | Par ailleurs le GIET peut supporter des architectures comportant plusieurs processeur, mais les structures de données utilisées par le système doivent être dimensionnées en fonction du nombre de composants matériels disponibles: nombre de processeurs, nombre de terminaux TTY. Ces paramètres doivent donc être définies dans le fichier ''tp"_top.cpp'' et dans le fichier ''soft/ldscript''. |
| 149 | |
| 150 | 1. Pour le logiciel, les adresses de base des segments doivent être définies dans le fichier ''soft/seg.ld'' qui contient les directives pour l'éditeur de liens lors de la compilation du logiciel embarqué. |
| 151 | |
| 152 | Par ailleurs le GIET peut supporter des architectures comportant plusieurs processeur, mais les structures de données utilisées par le système doivent être dimensionnées en fonction du nombre de processeurs et du nombre de tâches parallèles. Ces paramètres doivent donc être définies dans le fichier ''tp"_top.cpp'' et dans le fichier ''soft/config.h''. |