Changes between Version 19 and Version 20 of SoclibCourseTp3


Ignore:
Timestamp:
Sep 17, 2009, 9:49:17 AM (15 years ago)
Author:
alain
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • SoclibCourseTp3

    v19 v20  
    5555== 3.1 Génération du code ==
    5656
    57 A détailler...
     57Les composants de la bibliothèque SoCLib permettent de modéliser des architectures matérielles complexes, capables d'exécuter des
     58systèmes d'exploitation avancés (tels que LINUX, Unix NetBSD, ou MUTEK). Mais dans ce TP et les suivants, on se contentera d'un
     59''système d'exploitation'' minimal, constitué par un Gestionnaire d'Interruptions, Eceptions et Trappes (GIET), quelques appels systèmes
     60permettant aux programmes utilisateurs d'accéder aux périphériques, plus le code boot pour initialiser la machine.
     61Tout ce code ''système'' est directement écrit en assembleur MIPS32 et vous est fourni. Les programmes utilisateurs seront écrits en langage C,
     62et seront écrits par vous.
     63
     64Les processeurs disponibles dans SoCLib, sont en majorités des processeurs RISC, capables
     65de démarrer une instruction à chaque cycle, grâce à leur structure pipe-line.
     66Chaque processeur est modélisé par un ISS (Instruction Set Simulator), qui doit - pour chaque instruction -
     67lire l'instruction dans le cache, la décoder et l'exécuter. C'est évidemment le contrôleur du cache qui se charge d'aller
     68lire le code binaire chargé dans les mémoires embarquées en cas de MISS.
     69
     70Ce code binaire doit donc être généré par un cross-compilateur spécifique. Dans le cas du processeur MIPS32, on utilise la chaîne de compilation GCC,
     71pour compiler l'ensemble du logiciel embarqué (code applicatif en C, et code système en assembleur MIPS32), et générer du code MIPS32.
     72
     73Le résultat de cette compilation est un fichier au format ELF, contenant le code binaire exécutable par le processeur MIP32.
    5874
    5975== 3.2 Chargement du code ==
     
    6177Il existe deux méthode méthodes permettant de charger le code binaire dans les mémoires embarquées sur la puce:
    6278 1. Le code peut être stocké dans des mémoires mortes (ROM). Le contenu de ces mémoires est défini lors de la fabrication de la puce, et n'est plus modifiable. Cette approche est évidemment très peu flexible, et elle n'est généralement utilisée que pour le code de boot.
    63  1. Le code est stocké dans des mémoires inscriptibles (SRAM), qui sont chargées lors de la mise sous tension du système à partir d'un périphérique de stockage externe (cela peut être une ROM externe, une mémoire flash, ou un autre dispositif de stockage. On peut même imaginer qu'on utilise une liaison sans fil pour télécharger du code applicatif disponible sur un serveur distant.  Cette approche est utilisée pour le code applicatif, mais également pour le système d'exploitation embarqué. Le code qui exécute ce chargement de code s'appelle un ''bootloader''.
     79 1. Le code peut être stocké dans des mémoires inscriptibles (SRAM), qui sont chargées lors de la mise sous tension du système à partir d'un périphérique de stockage externe (cela peut être une ROM externe, une mémoire flash, ou un autre dispositif de stockage. On peut même imaginer qu'on utilise une liaison sans fil pour télécharger du code applicatif disponible sur un serveur distant.  Cette approche est utilisée pour le code applicatif, mais également pour le système d'exploitation embarqué. Le code qui exécute ce chargement de code s'appelle un ''bootloader''.
    6480
    6581La phase de chargement du système d'exploitation et du code applicatif  est en pratique exécutée à chaque mise sous tension,
     
    7490contenu du fichier ELF contenant le code binaire. Le constructeur possédant un autre argument lui permettant d'accéder
    7591à la MappingTable, il peut déterminer quels segments de la RAM (ou de la ROM) doivent être initialisés.
    76 Danx ces conditions, le code de boot peut être beaucoup plus court.
     92
     93On ''économise'' ainsi plusieurs millions de cycles, et le code de boot peut être beaucoup plus court.
    7794 
    7895= 4 Travail à réaliser =
     
    111128
    112129 * '''seg_tty''' est le segment associé au contrôleur de terminaux TTY. On prendra pour adresse de base la valeur 0xC0000000, et pour longueur 64 octets, ce qui permet d'adresser jusqu'à 4 terminaux indépendants (consulter la spécification fonctionnelle du composant VciMultiTty).
    113  * '''seg_lcd''' est le segment associé au coprocesseur LCD. On prendra pour adresse de base la valeur 0xB0000000. La longueur de 16 octets correspond aux quatre registres adressables de ce composant.
     130 * '''seg_lcd''' est le segment associé au coprocesseur LCD. On prendra pour adresse de base la valeur 0x90000000. La longueur de 16 octets correspond aux quatre registres adressables de ce composant.
    114131 * '''seg_reset''' est le segment contenant contient le code de ''boot'' exécuté à la mise sous tension. Il est évidemment assigné à la ROM. L'adresse de base 0xBFC00000 est imposée par la spécification du processeur MIPS32. On choisira une capacité de stockage de 4Koctets.
    115132 * '''seg_kernel''' est le segment contenant le code du système qui s'exécute en mode ''kernel''. Il s'agit principalement du Gestionnaire d'Interruptions, Exceptions, et Trappes (GIET) et du code des appels systèmes. Ce segment  est assigné à la RAM. L'adresse de base 0x80000000 est imposée par la spécification du processeur MIPS32 qui impose que le point d'entrée est à l'adresse 0x80000180. On choisira une capacité de stockage de 4 Koctets. 
     
    117134 * '''seg_data''' est le segment contenant les données globales et la pile d'exécution de l'application logicielle embarquée. Il est assigné à la RAM. On choisira pour adresse de base la valeur 0x00000000, et une capacité de stockage de 64 Koctets.
    118135 * '''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 0x00800000, et une capacité de stockage de 64 Koctets.
     136
     137Remarquez que les 2 segments correspondant aux périphériques (seg_tty et seg_lcd), ainsi que les deux segments correspondant au code système sont dans la zone
     138protégée de l'espace adressable, qui n'est accessible qu'en mode ''kernel''.
    119139
    120140'''Remarque importante''' : Ces informations de segmentation sont utilisées à la fois par le matériel et par le logiciel embarqué. Elles doivent donc être définies à deux endroits :