Changes between Version 31 and Version 32 of AS6-TME-B5


Ignore:
Timestamp:
Feb 22, 2022, 9:00:51 AM (3 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AS6-TME-B5

    v31 v32  
    3535{{{#!protected ------------------------------------------------------------------
    3636'''
    37  * Non pour les interruptions, les demandes d'interruption (IRQ pour Interrupt ReQuest) sont faites par les périphériques grâce à des signaux électriques binaires (2 états). Ces demandes ne peuvent pas être faites directement par le code de l'utilisateur. Toutefois, une IRQ est la conséquence d'une commande ou d'une configuration faite par le programme, alors on pourrait dire que les IRQ sont provoquées par les programmes.
     37 * Non pour les interruptions, les demandes d'interruption (IRQ pour Interrupt !ReQuest) sont faites par les périphériques grâce à des signaux électriques binaires (2 états). Ces demandes ne peuvent pas être faites directement par le code de l'utilisateur. Toutefois, une IRQ est la conséquence d'une commande ou d'une configuration faite par le programme, alors on pourrait dire que les IRQ sont provoquées par les programmes.
    3838 * Oui pour les exceptions, une exception est toujours la conséquence de l'exécution d'une instruction que le processeur ne peut pas ou ne sait pas faire.
    3939'''
     
    6363'''
    6464}}}
    65 1. Lorsque l'on crée un nouveau thread (un nouveau fil d'exécution du processus), il faut indiquer sa fonction principale, c'est-à-dire la fonction par laquelle qu'il doit exécuter.
    66   a. Est-ce que le nouveau thread pourra appeler d'autres fonctions ?
     651. Lorsque l'on crée un nouveau thread (un nouveau fil d'exécution du processus), il faut indiquer sa fonction principale, c'est-à-dire la fonction par laquelle qu'il doit exécuter.  Est-ce que le nouveau thread pourra appeler d'autres fonctions ?
    6766{{{#!protected ------------------------------------------------------------------
    6867'''
     
    7069'''
    7170}}}
    72   a. Est-ce qu'on peut créer deux threads avec la même fonction principale ?
     711. Est-ce qu'on peut créer deux threads avec la même fonction principale ?
    7372{{{#!protected ------------------------------------------------------------------
    7473'''
     
    7675'''
    7776}}}
    78   a. Combien d'arguments la fonction  principale d'un thread peut-elle prendre et de quel type ?
     771. Combien d'arguments la fonction  principale d'un thread peut-elle prendre et de quel type ?
    7978{{{#!protected ------------------------------------------------------------------
    8079'''
     
    8382'''
    8483}}}
    85   a. Que se passe-t-il lorsqu'on sort de la fonction principale d"un thread ?
     841. Que se passe-t-il lorsqu'on sort de la fonction principale d"un thread ?
    8685{{{#!protected ------------------------------------------------------------------
    8786'''
     
    116115}}}
    1171161. Comment nomme-t-on la durée entre deux interruptions d'horloge ? Ici, c'est le temps d'une instance d'exécution d'un thread.
     117{{{#!protected ------------------------------------------------------------------
    118118'''
    119119 * C'est le **tick**. Un tick d'horloge est la durée entre deux IRQ du timer.
     
    136136'''
    137137}}}
    138 1. Qu'est-ce qui provoque le changement de thread ?
     1381. Qu'est-ce qui provoque un changement de thread sans que le thread n'en fasse lui-même la demande ?
    139139{{{#!protected ------------------------------------------------------------------
    140140'''
     
    299299'''
    300300}}}
    301 1. Dans le cours, nous suivons l'exécution du code au démarrage (vers le slide 37), nous pouvons voir que la fonction `kinit()` fait 3 choses importantes : (1) initialiser à `0` la section `BSS` (contenant les variables globales non explicitement initialisées dans le programme), (2) demander à l'architecture de s'initialiser et (3) lancer la première (et ici seule) application.
     3011. Dans le cours, nous suivons l'exécution du code au démarrage (vers le slide 37), nous pouvons voir que la fonction `kinit()` fait 3 choses importantes : (1) initialiser à `0` la section `BSS` (contenant les variables globales non explicitement initialisées dans le programme), (2) demander à l'architecture de s'initialiser et (3) lancer la première (et ici seule) application. Où sont définis les symboles `__bss_origin`, `__bss_end`, `__main_thread`, `_start` et quel est leur type ?
    302302{{{#!c
    303303void kinit (void)
     
    320320}
    321321}}}
    322  a. Où sont définis les symboles `__bss_origin`, `__bss_end`, `__main_thread`, `_start` et quel est leur type ?
    323322{{{#!protected ------------------------------------------------------------------
    324323'''
     
    327326'''
    328327}}}
    329  a. Dites ce que sont les arguments `2` et `3` de `thread_create_kernel()` et pourquoi, ici, on les met à `0`.
     3281. Dites ce que sont les arguments `2` et `3` de `thread_create_kernel()` dans le code de `kinit()` et pourquoi, ici, on les met à `0` ?
    330329{{{#!protected ------------------------------------------------------------------
    331330'''
     
    338337'''
    339338}}}
    340  a. Que se passe-t-il quand on sort de `thread_load()`et pourquoi avoir mis l'appel à `kpanic()` ?
     3391. Dans la fonction `kinit()`, que se passe-t-il quand on sort de `thread_load()`et pourquoi avoir mis l'appel à `kpanic()` ?
    341340{{{#!protected ------------------------------------------------------------------
    342341'''
     
    345344'''
    346345}}}
    347  a. Dans quelle pile s'exécute la fonction `kinit()` ? dans quelle section est-elle ? Pourquoi elle n'est que temporaire ?
     3461. Dans quelle pile s'exécute la fonction `kinit()` ? dans quelle section est-elle ? Pourquoi elle n'est que temporaire ?
    348347{{{#!protected ------------------------------------------------------------------
    349348'''
     
    353352'''
    354353}}}
    355  a. Pour le chargement de thread `main()` avec `thread_load (_main_thread.context)`, on initialise les registres `$16` à `$23`, `$30`, `$c0_EPC`, est-utile ? Si oui pourquoi ? Sinon, pourquoi faire ces initialisations ?
    356 {{{#!protected ------------------------------------------------------------------
    357 '''
    358  * Non, ça ne sert à rien, le contexte restauré ne contient rien dans ces registres, mais quand appelle `thread_load()`, on ne veut pas savoir si c'est pour la première fois pour ce thread ou si c'est une vraie restauration. C'est le `jr $31` qui retournera dans `sched_switch()` ou iran dans `thread_launch()`. Alors, on accepte de restaurer des registres inutilement, c'est juste la première fois.
     3541. Pour le chargement de thread `main()` avec `thread_load (_main_thread.context)`, on initialise les registres `$16` à `$23`, `$30`, `$c0_EPC`, est-utile ? Si oui pourquoi ? Sinon, pourquoi faire ces initialisations ?
     355{{{#!protected ------------------------------------------------------------------
     356'''
     357 * Non, ça ne sert à rien, le contexte restauré ne contient rien dans ces registres, **mais** quand appelle `thread_load()`, on ne veut pas savoir si c'est pour la première fois pour ce thread ou si c'est une vraie restauration. C'est le `jr $31` qui retournera dans `sched_switch()` ou ira dans `thread_launch()`. Alors, on accepte de restaurer des registres inutilement, c'est juste la première fois.
    359358'''
    360359}}}