Changes between Version 31 and Version 32 of AS6-TME-B5
- Timestamp:
- Feb 22, 2022, 9:00:51 AM (3 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
AS6-TME-B5
v31 v32 35 35 {{{#!protected ------------------------------------------------------------------ 36 36 ''' 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. 38 38 * 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. 39 39 ''' … … 63 63 ''' 64 64 }}} 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 ? 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. Est-ce que le nouveau thread pourra appeler d'autres fonctions ? 67 66 {{{#!protected ------------------------------------------------------------------ 68 67 ''' … … 70 69 ''' 71 70 }}} 72 a. Est-ce qu'on peut créer deux threads avec la même fonction principale ?71 1. Est-ce qu'on peut créer deux threads avec la même fonction principale ? 73 72 {{{#!protected ------------------------------------------------------------------ 74 73 ''' … … 76 75 ''' 77 76 }}} 78 a. Combien d'arguments la fonction principale d'un thread peut-elle prendre et de quel type ?77 1. Combien d'arguments la fonction principale d'un thread peut-elle prendre et de quel type ? 79 78 {{{#!protected ------------------------------------------------------------------ 80 79 ''' … … 83 82 ''' 84 83 }}} 85 a. Que se passe-t-il lorsqu'on sort de la fonction principale d"un thread ?84 1. Que se passe-t-il lorsqu'on sort de la fonction principale d"un thread ? 86 85 {{{#!protected ------------------------------------------------------------------ 87 86 ''' … … 116 115 }}} 117 116 1. 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 ------------------------------------------------------------------ 118 118 ''' 119 119 * C'est le **tick**. Un tick d'horloge est la durée entre deux IRQ du timer. … … 136 136 ''' 137 137 }}} 138 1. Qu'est-ce qui provoque le changement de thread?138 1. Qu'est-ce qui provoque un changement de thread sans que le thread n'en fasse lui-même la demande ? 139 139 {{{#!protected ------------------------------------------------------------------ 140 140 ''' … … 299 299 ''' 300 300 }}} 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. 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. Où sont définis les symboles `__bss_origin`, `__bss_end`, `__main_thread`, `_start` et quel est leur type ? 302 302 {{{#!c 303 303 void kinit (void) … … 320 320 } 321 321 }}} 322 a. Où sont définis les symboles `__bss_origin`, `__bss_end`, `__main_thread`, `_start` et quel est leur type ?323 322 {{{#!protected ------------------------------------------------------------------ 324 323 ''' … … 327 326 ''' 328 327 }}} 329 a. Dites ce que sont les arguments `2` et `3` de `thread_create_kernel()` et pourquoi, ici, on les met à `0`.328 1. 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` ? 330 329 {{{#!protected ------------------------------------------------------------------ 331 330 ''' … … 338 337 ''' 339 338 }}} 340 a. Que se passe-t-il quand on sort de `thread_load()`et pourquoi avoir mis l'appel à `kpanic()` ?339 1. Dans la fonction `kinit()`, que se passe-t-il quand on sort de `thread_load()`et pourquoi avoir mis l'appel à `kpanic()` ? 341 340 {{{#!protected ------------------------------------------------------------------ 342 341 ''' … … 345 344 ''' 346 345 }}} 347 a. Dans quelle pile s'exécute la fonction `kinit()` ? dans quelle section est-elle ? Pourquoi elle n'est que temporaire ?346 1. Dans quelle pile s'exécute la fonction `kinit()` ? dans quelle section est-elle ? Pourquoi elle n'est que temporaire ? 348 347 {{{#!protected ------------------------------------------------------------------ 349 348 ''' … … 353 352 ''' 354 353 }}} 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 irandans `thread_launch()`. Alors, on accepte de restaurer des registres inutilement, c'est juste la première fois.354 1. 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. 359 358 ''' 360 359 }}}