Changes between Version 2 and Version 3 of TME2-2014


Ignore:
Timestamp:
Feb 25, 2010, 1:18:40 PM (14 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • TME2-2014

    v2 v3  
    88L'objectif général de ce second TME est également de faire que chaque processeur affiche un message "Hello", mais après que le code ait été préalablement déplacé de la rom vers la ram. Nous allons également gérer la première interruption. Les étapes:
    99
    10  1. Nous allons modifier le programme de boot pour qu'il recopie dans la ram le code des fonction `__do_init()` et `fputs()`
     10 1. Nous allons modifier le programme de boot pour qu'il recopie dans la ram le code des fonctions `__do_init()` et `tty_puts()`
    1111    avant de d'y sauter pour les exécuter.
    1212 2. Nous allons ajouter l'affichage du ''timestamp counter'' de chaque processeur devant le message "hello" en utilisant une
    13     fonction fputx() qui affiche un nombre en hexadécimale.
    14  3. Nous allons refaire l'étape 4 en faisant faire la copie du code par le module DMA. Vous noterez la différence de vitesse grâce
     13    fonction tty_putx() qui affiche un nombre en hexadécimale.
     14 3. Nous allons refaire l'étape 1 en faisant faire la copie du code par le module DMA. Vous noterez la différence de vitesse grâce
    1515    à l'affichage du ''timestamp''.
    1616
     
    2020Le programme exécuté jusque là s'exécutait directement dans la ROM. Cette mémoire n'est pas cachée par les cache L1. Elle n'est donc pas très rapide.
    2121
    22  * Nous allons placer le code des fonctions C {{{__do_init(), fputs(), fputx, ...}}} dans une autre section de la mémoire. Ces fonctions seront compilées
    23    dans le but d'une exécution dans la section ktext, mais on demandera à l'éditeur de lien de les placée dans la section ktext_lma_base de la ROM.
     22 * Nous allons placer le code des fonctions C `__do_init(), tty_puts(), tty_putx, ...` dans une autre section de la mémoire. Ces fonctions seront compilées
     23   dans le but d'une exécution dans la section ktext, mais on demandera à l'éditeur de lien de les placer dans la section ktext_lma_base de la ROM.
    2424 * Nous allons ensuite modifier le code du programme de boot pour que l'un des processeurs se charge du déplacement des programmes depuis la ROM jusque dans la mémoire RAM.
    25    Une fois que le programme est recopié, tous les processeurs saute à leur fonction {{{__do_init()}}}.
     25   Une fois que le programme est recopié, tous les processeurs saute à leur fonction `__do_init()`.
    2626 
    2727== 2. Hello en chiffre ==
     
    2929Pour déterminer la durée d'exécution de certaines opération, le MIPS propose un registre dans son coprocesseur 0 qui s'incrémente à cycle d'horloge.
    3030
    31  * Nous allons écrire une fonction {{{unsigned getTimeStamp()}}} permettant de récupérer la valeur de ce registre en y plaçant le code assembleur nécessaire.
    32    Cette fonction sera inliné.
    33  * Nous allons enuite écrire une fonction {{{fputx(int i, FILE *f)}}} qui écrit sur le terminal F, la chaine de caractère représentant le valeur du nombre
     31 * Nous allons écrire une fonction `unsigned getTimeStamp()` permettant de récupérer la valeur de ce registre en y plaçant le code assembleur nécessaire.
     32   Cette fonction sera inlinée.
     33 * Nous allons enuite écrire une fonction `tty_putx(unsigned int tty, unsigned i)}}} qui écrit sur le terminal tty, la chaine de caractère représentant le valeur du nombre
    3434   i en hexadécimal.
    35  * La fonction !__do_init() devra écrire le message "Hello at " suivi du nombre de cycle rendu par {{{getTimeStamp()}}}
     35 * La fonction `__do_init()` devra écrire le message "Hello at " suivi du nombre de cycle rendu par `getTimeStamp()`
    3636
    3737== 3. Hello avec le dma ==
     
    4040adapté aux transfert de données, c'est le DMA.
    4141
    42  * Nous allons modifier le programme de boot pour que la boucle de copie soit remplacé par une programmation d'une requête DMA. La terminaison de a requète DMA produit normalement une interruption.
    43    Nous n'allons pas pouvoir l'utiliser ici car le gestionnaire d'interruption n'est pas encore en place. nous allons donc tester le status du DMA afin de savoir si le transfert est terminé.
     42 * Nous allons modifier le programme de boot pour que la boucle de copie soit remplacée par une programmation d'une requête DMA. La terminaison de la requête DMA produit normalement une interruption.
     43   Nous n'allons pas pouvoir l'utiliser ici car le gestionnaire d'interruption n'est pas encore en place. nous allons donc tester le registre LEN du DMA afin de savoir si le transfert est terminé.
    4444   Le bus système transfert en moyenne 2 octets par cycles, il est donc possible d'évaluer approximativement la fin de l'opération.
    45  * Vous exécutez les codes {{{__do_init()}}} en notant la différence de date.
     45 * Vous exécutez les codes `__do_init()` en notant la différence de date.
     46
     47== 4. Première interruption ==
     48
     49Il s'agit maintenant de commencer à traiter les interruptions. Nous allons seulement traiter les interruptions venant des TTY.
     50Nous allons pour cela mettre un bout de code à l'adresse du point d'entrée du système (pour le mips32 c'est 0x80000180).
     51Ce code va devoir analyser le registre de cause qui contient la raison pour laquelle le système est invoqué.
     52Nous n'allons considérer que deux causes. Soit c'est une interruption, soit c'est autre chose.
     53Dans le cas d'une interruption, nous sauvegarderons dans la pile courante, les registres temporaires avant d'appeler la fonction `__do_interrupt()`.
     54Au retour de la fonction, les registres sont restaurés et on retourne au code interrompu.
     55La fonction `__do_interrupt()` prendra comme paramètre, le numéro du CPU et le masque
     56des interruptions (le second octet du registre cause).
     57Son but est de déterminer quelle TTY a émis l'interruption, lire le caractère (ce qui acquitte l'interruption) et l'écrire sur l'écran. C'est un echo.
     58Il faudra aussi modifier __do_init pour initialiser l'ICU.