{{{#!comment {{{#!protected ------------------------------------------------------------------------------------ ''''''''''''''' * ''''''''''''''' }}} }}} = Gestion des interruptions == Questions de cours Les questions de cette partie ont pour objectif de vérifier que vous avez compris le cours. Les réponses sont donc dans les [htdocs:cours/AS6-3.pdf slides du cours sur les interruptions]. L'ordre des questions suit globalement celui des slides du cours. Il y a beaucoup de questions, mais la plupart sont simples, certaines sont plus délicates. Ce n'est pas grave, si vous ne savez pas tout, mais vous devriez être en mesure de répondre à un grand nombre. 1. À quoi servent les interruptions ? {{{#!protected ------------------------------------------------------------------------------------ ''''''''''''''' * Les interruptions sont un mécanisme permettant de traiter au plus vite un événement matériel ou une demande d'un autre processeur. ''''''''''''''' }}} 1. Une interruption en informatique est à la fois une suspension temporaire d'un programme et un signal électrique. Comment s'appelle le signal d'interruption et comment s'appelle le code permettant de la traiter ? 1. Quel état peut prendre un signal d'interruption ? 1. Quel type de composant émet un signal d'interruption ? 1. Est-ce que tous les composants génèrent des signaux d'interruption ? Si la réponse est non, donnez un exemple ? 1. Est-ce qu'un composant peut produire plusieurs signaux d'interruption ? 1. À qui est destiné un signal d'interruption ? 1. Est-ce qu'une application utilisateur sait quand elle va être interrompue ? 1. Est-ce qu'une application utilisateur sait quand elle a été interrompue ? 1. Que signifie IPI et à quoi ça sert ? 1. Est-ce qu'un programme utilisateur peut interdire les interruptions en général ? 1. Est-ce que le noyau du système d'exploitation peut interdire les interruptions en général ? 1. Qui exécute le code de traitement du signal d'interruption ? 1. Quand un signal d'interruption s'active est ce que le noyau sait toujours quoi faire ? 1. Que signifie acquitter un signal d'interruption ? (on dit aussi acquitter une interruption) 1. Comment fait-on pour acquitter une interruption ? 1. Que signifie l'expression «vol de cycles» ? 1. Est-ce l'application qui a provoqué l'activation d'un signal d'interruption qui est volée ? 1. Pour le composant TTY, à quel moment produit-il un signal d'interruption ? 1. Pour le composant TTY, comment fait-on pour acquitter une d'interruption ? 1. Si plusieurs caractères ASCII sont en attente dans d'être lus dans un TTY, quelle conséquence cela a-t-il sur le signal d'interruption ? 1. À quoi sert le composant `TIMER` ? 1. Comment fait-on pour le configurer ? 1. Comment fait-on pour acquitter une interruption pour le composant TIMER ? 1. Est-ce que le registre `TIMER_VALUE` peut activer (on dit aussi lever) un signal d'interruption ? 1. Que signifie ICU et à quoi cela sert-il ? 1. Que signifie masquer une interruption ? 1. Dans l'ICU, que contient le registre `ICU_STATE` ? 1. Dans l'ICU, que contient le registre `ICU_MASK` ? 1. Dans l'ICU, comment fait-on pour modifier la valeur de `ICU_MASK` ? 1. Dans l'ICU, que contient le registre `ICU_HIGHEST` ? 1. Dans l'ICU, il y a autant de jeu de registres que de processeur, pourquoi ? 1. Qu'est-ce que la fonction `kinit()` ? 1. Que contient le vecteur d'interruption ? 1. À quel moment doit-on initialiser le vecteur d'interruption ? 1. En quoi consiste la liaison des interruptions (''interrupt binding'' en anglais) ? 1. À quelle adresse saute-t-on lorsqu'un signal interruption s'active et qui n'est pas masqué ? 1. Expliquer le rôle des bits `UM`, `EXL` et `IE` du registre `C0_SR`. 1. Comment le noyau sait-il que la cause de son invocation est une interruption ? 1. Quel est le rôle du gestionnaire d'interruption ? 1. Quelle instruction permet de sortir du noyau pour revenir dans le code interrompu ? et que fait-elle précisément ? 1. Rappeler la différence entre un registre temporaire et un registre persistant. 1. Dans le gestionnaire d'interruption, on sauve les registres temporaires seulement avant d'appeler la fonction de traitement d'un signal d'interruption ? 1. Pour qu'une IRQ soit effectivement prise en compte, il faut que le périphérique la lève et qu'elle ne soit pas masquée. Il y a plusieurs endroits où on peut masquer une IRQ, lesquels ? == Travaux pratiques === La plateforme Le but de ce TP est d'analyser, de modifier et d'utiliser le gestionnaire d'interruption. Nous allons utiliser la même plateforme que la dernière fois, mais malheureusement celle-ci avait un bug matériel. Vous allez donc devoir prendre un nouveau simulateur [htdocs:files/almo1.x.gz almo1.x.gz] (vous devez télécharger ce fichier, le dézipper et le placer dans le répertoire AS6/bin à la place du précédent). La plateforme que nous allons utiliser contient : - un processeur - une mémoire multisegment pour le code et les données du noyau et de l'utilisateur. - une ROM pour le boot - un contrôleur multittys (4) - un timer - une icu Sur cette plateforme, les composants produisant des IRQ sont le timer et les 4 ttys. Ces IRQ sont destinées au processeur, mais elles passent par l'ICU. l'ICU permet de masquer individuellement chaque IRQ et si plusieurs sont levées simultanément alors l'ICU permet de dire quelle est celle prioritaire. La manière dont sont routées les IRQ n'est pas modifiable par logiciel, les IRQ sont des signaux électriques câblés par les architectes. Sur `almo1`: - L'IRQ du timer entre sur l'entrée n°1 de l'ICU. - Les IRQ de TTY entrent respectivement sur les entrées 3, 4, 5 et 6 de l'ICU. **Question** : faire un dessin représentant la plateforme avec les signaux IRQ. === Analyse de code Pour ce TP, il n'y aura qu'une seule étape parce que j'ai voulu ajouter un minimum de code. En effet, la gestion des IRQ est liée à la gestion des périphériques puisque c'est eux c'est essentiellement eux qui les produise. Or, la gestion des périphériques de faire par le mécanisme des pilotes de périphériques. J'en présenterai une version simplifiée lorsque nous verrons les périphériques initiateurs. Pour l'heure, il s'agit de comprendre juste comment sont traités les IRQ et de jouer un peu avec. Par rapport à l'étape 6 sur tp1, voici les changments {{{ 7_isr/ ├── common │   └── syscalls.h : pas de changement parce qu'il y a pas d'ajout d'appel système ├── kernel │   ├── harch.c : ajout des fonctions d'accès aux nouveaux périphériques, des isr et de la fonction arch_init() │   ├── harch.h : ajout de la déclaration de la fonction arch_init, les autres fonctions de harch.c ne sont pas exportés. │   ├── hcpu.h : pas de changement │   ├── hcpu.S : ajout du gestionnaire d'interruption dans kentry │   ├── kernel.ld : ajout des informations sur les segments des nouveaux périphériques │   ├── kinit.c : ajout de l'appel à arch_init() et acceptation des interruptions │   ├── klibc.c │   ├── klibc.h │   ├── kpanic.c │   ├── kpanic.h │   ├── ksyscalls.c │   └── Makefile ├── Makefile ├── uapp │   ├── main.c │   └── Makefile └── ulib ├── crt0.c ├── libc.c ├── libc.h ├── Makefile └── user.ld }}}