| 17 | | [wiki:AS5-TME9#a1.Premierprogrammeenassembleurdanslaseulesectiondeboot 1. hello_boot]:: \\ |
| 18 | | |
| 19 | | Nous commençons par un petit programme de quelques lignes en assembleur, placé entièrement dans la région mémoire |
| 20 | | du boot, qui réalise l'affichage du message "Hello World". C'est un tout tout petit programme, mais pour obtenir |
| 21 | | l'exécutable, vous devrez utiliser tous les outils de la chaîne de cross-compilation MIPS et |
| 22 | | pour l'exécuter vous devrez exécuter le simulateur du prototype. C'est simple, mais c'est nouveau pour |
| 23 | | beaucoup d'entre vous. |
| 24 | | \\\\ |
| 25 | | **Objectifs** |
| | 18 | |
| | 19 | |
| | 20 | = 1. Premier programme en assembleur dans la seule section de boot**= |
| | 21 | |
| | 22 | Nous commençons par un petit programme de quelques lignes en assembleur, placé entièrement dans la région mémoire |
| | 23 | du boot, qui réalise l'affichage du message "Hello World". C'est un tout tout petit programme, mais pour obtenir |
| | 24 | l'exécutable, vous devrez utiliser tous les outils de la chaîne de cross-compilation MIPS et |
| | 25 | pour l'exécuter vous devrez exécuter le simulateur du prototype. C'est simple, mais c'est nouveau pour |
| | 26 | beaucoup d'entre vous. |
| | 27 | |
| | 28 | |
| | 29 | |
| | 30 | - **Objectifs**\\\\ |
| 38 | | [wiki:AS5-TME9#a2.Sautdanslecodedunoyauenassembleur 2. kinit_asm]:: \\ |
| 39 | | Dans le deuxième programme, nous restons en assembleur, mais nous avons deux fichiers source : (1) le fichier contenant |
| 40 | | le code de boot et (2) le fichier contenant le code du noyau. Ici, le code du noyau c'est juste une ''fonction'' `kinit()`. Ce n'est pas vraiment une fonction car on n'utilise pas la pile. |
| 41 | | \\\\ |
| 42 | | **Objectifs** |
| 43 | | - Savoir comment le programme de boot fait pour sauter à l'adresse de la routine kinit. |
| 44 | | - Savoir un fichier kernel.ld un peu plus complet. |
| 45 | | |
| 46 | | **Fichiers** |
| 47 | | {{{ |
| 48 | | 2_init_asm/ |
| 49 | | ├── hcpu.S : code dépendant du cpu matériel en assembleur |
| 50 | | ├── kernel.ld : ldscript décrivant l'espace d'adressage pour l'éditeur de lien |
| 51 | | ├── kinit.S : fichier contenant le code de démarrage du noyau, ici c'est une routine kinit. |
| 52 | | └── Makefile : description des actions possibles sur le code : compilation, exécution, nettoyage, etc. |
| 53 | | }}} |
| 54 | | |
| 55 | | |
| 56 | | [wiki:AS5-TME9#a3.SautdanslafonctionkinitdunoyauenlangageC 3. kinit_c]:: \\ |
| 57 | | Dans ce troisième programme, nous faisons la même chose que pour le deuxième mais `kinit()` est désormais écrit en |
| 58 | | langage C. Cela change peu de choses, sauf une chose importante `kinit()` est une fonction et donc il faut absolument |
| 59 | | une pile d'exécution. |
| 60 | | \\\\ |
| 61 | | **Objectifs** |
| 62 | | - Savoir comment et où déclarer la pile d'exécution du noyau. |
| 63 | | - Savoir comment afficher un caractère sur un terminal depuis un programme C. |
| 64 | | |
| 65 | | **Fichiers** |
| 66 | | {{{ |
| 67 | | 3_init_c/ |
| 68 | | ├── hcpu.S : code dépendant du cpu matériel en assembleur |
| 69 | | ├── kernel.ld : ldscript décrivant l'espace d'adressage pour l'éditeur de lien |
| 70 | | ├── kinit.c : fichier en C contenant le code de démarrage du noyau, ici c'est la fonction kinit(). |
| 71 | | └── Makefile : description des actions possibles sur le code : compilation, exécution, nettoyage, etc. |
| 72 | | }}} |
| 73 | | |
| 74 | | [wiki:AS5-TME9#a4.Acc%C3%A8sauxregistresdecontr%C3%B4ledesterminauxTTY 4. nttys]:: \\ |
| 75 | | Le prototype de SoC que nous utilisons pour les TP est configurable. Il est possible par exemple de choisir le nombre |
| 76 | | terminaux texte (TTY). Par défaut, il y en a un mais, nous pouvons en avoir jusqu'à 4. Nous allons modifier le code du |
| 77 | | noyau pour s'adapter à cette variabilité. En outre, pour le moment, nous ne faisions qu'écrire sur le terminal, |
| 78 | | maintenant, nous allons aussi lire le clavier. |
| 79 | | \\\\ |
| 80 | | **Objectifs** |
| 81 | | - Savoir comment compiler un programme C avec du code conditionnel. |
| 82 | | - Savoir comment décrire en C l'ensemble des registres d'un contrôleur de périphérique et y accéder. |
| 83 | | |
| 84 | | **Fichiers** |
| 85 | | {{{ |
| 86 | | 4_nttys/ |
| 87 | | ├── hcpu.S : code dépendant du cpu matériel en assembleur |
| 88 | | ├── kernel.ld : ldscript décrivant l'espace d'adressage pour l'éditeur de lien |
| 89 | | ├── kinit.c : fichier en C contenant le code de démarrage du noyau, ici c'est la fonction kinit(). |
| 90 | | └── Makefile : description des actions possibles sur le code : compilation, exécution, nettoyage, etc. |
| 91 | | }}} |
| 92 | | |
| 93 | | [wiki:AS5-TME9#a5.Premierpetitpilotepourleterminal 5. driver]:: |
| 94 | | Dans l'étape 4, nous accédons au registre de périphérique directement dans la fonction `kinit()`, ce n'est pas très |
| 95 | | simple. C'est pourquoi, nous allons ajouter un niveau d'abstraction qui représente un début de pilote de périphérique |
| 96 | | (device driver). Ce pilote, même tout petit constitue une couche logicielle avec une API. |
| 97 | | \\\\ |
| 98 | | **Objectifs** |
| 99 | | - Savoir comment créér uun début de pilote pour le terminal TTY. |
| 100 | | - Savoir comment décrire une API en C |
| 101 | | |
| 102 | | **Fichiers** |
| 103 | | {{{ |
| 104 | | 5_driver/ |
| 105 | | ├── harch.c : code dépendant de l'architecture du SoC, pour le moment c'est juste le pilote du TTY |
| 106 | | ├── harch.h : API du code dépendant de l'architecture |
| 107 | | ├── hcpu.S : code dépendant du cpu matériel en assembleur |
| 108 | | ├── kernel.ld : ldscript décrivant l'espace d'adressage pour l'éditeur de lien |
| 109 | | ├── kinit.c : fichier en C contenant le code de démarrage du noyau, ici c'est la fonction kinit(). |
| 110 | | └── Makefile : description des actions possibles sur le code : compilation, exécution, nettoyage, etc. |
| 111 | | }}} |
| 112 | | |
| 113 | | |
| 114 | | |
| 115 | | = Premier programme en assembleur dans la seule section de boot |
| 116 | | |
| 117 | | |
| 118 | | - Dans quel fichier se trouve la description de l'espace d'adressage du MIPS ? Que trouve-t-on dans ce fichier ? |
| 119 | | (''(la réponse est dans le cours et dans le fichier'') |
| | 45 | |
| | 46 | - **Questions**\\\\ |
| | 47 | - Dans quel fichier se trouve la description de l'espace d'adressage du MIPS ? Que trouve-t-on dans ce fichier ? (''la réponse est dans le cours et dans le fichier'') |
| 143 | | '' |
| 144 | | }}} |
| 145 | | - Que produit le compilateur C quand on utilise l'option -c ? |
| 146 | | {{{#!protected |
| 147 | | |
| 148 | | }}} |
| 149 | | - Que fait l'éditeur de liens ? |
| 150 | | {{{#!protected |
| 151 | | |
| 152 | | }}} |
| 153 | | - De quels fichiers a besoin l'éditeur de liens pour fonctionner ? |
| 154 | | {{{#!protected |
| 155 | | |
| 156 | | }}} |
| 157 | | - Dans quelle section se trouve le code de boot pour le compilateur ? |
| 158 | | {{{#!protected |
| 159 | | |
| 160 | | }}} |
| 161 | | - Dans quelle section se trouve le message hello pour le compilateur ? |
| 162 | | {{{#!protected |
| 163 | | |
| 164 | | }}} |
| 165 | | - Dans quelle section se trouve le code de boot dans le code exécutable ? |
| 166 | | {{{#!protected |
| 167 | | |
| 168 | | }}} |
| 169 | | - Dans quelle région de la mémoire le code de boot est placé ? |
| 170 | | {{{#!protected |
| 171 | | |
| 172 | | }}} |
| 173 | | - Comment connaît-on l'adresse du registre de sortie du contrôleur de terminal TTY ? |
| 174 | | {{{#!protected |
| 175 | | |
| 176 | | }}} |
| 177 | | - Comment sait-on que le message est fini et que le programme doit s'arrêter ? |
| 178 | | {{{#!protected |
| 179 | | |
| 180 | | }}} |
| 181 | | - Pourquoi terminer le programme par un `dead: j dead` ? |
| | 76 | |
| | 77 | |
| | 78 | |
| | 79 | '' |
| | 80 | }}} |
| | 81 | - Que produit le compilateur C quand on utilise l'option -c ? |
| | 82 | {{{#!protected |
| | 83 | |
| | 84 | |
| | 85 | |
| | 86 | |
| | 87 | }}} |
| | 88 | - Que fait l'éditeur de liens ? |
| | 89 | {{{#!protected |
| | 90 | |
| | 91 | |
| | 92 | |
| | 93 | |
| | 94 | }}} |
| | 95 | - De quels fichiers a besoin l'éditeur de liens pour fonctionner ? |
| | 96 | {{{#!protected |
| | 97 | |
| | 98 | }}} |
| | 99 | - Dans quelle section se trouve le code de boot pour le compilateur ? |
| | 100 | {{{#!protected |
| | 101 | |
| | 102 | }}} |
| | 103 | - Dans quelle section se trouve le message hello pour le compilateur ? |
| | 104 | {{{#!protected |
| | 105 | |
| | 106 | }}} |
| | 107 | - Dans quelle section se trouve le code de boot dans le code exécutable ? |
| | 108 | {{{#!protected |
| | 109 | |
| | 110 | }}} |
| | 111 | - Dans quelle région de la mémoire le code de boot est placé ? |
| | 112 | {{{#!protected |
| | 113 | |
| | 114 | }}} |
| | 115 | - Comment connaît-on l'adresse du registre de sortie du contrôleur de terminal TTY ? |
| | 116 | {{{#!protected |
| | 117 | |
| | 118 | }}} |
| | 119 | - Comment sait-on que le message est fini et que le programme doit s'arrêter ? |
| | 120 | {{{#!protected |
| | 121 | |
| | 122 | }}} |
| | 123 | - Pourquoi terminer le programme par un `dead: j dead` ? |
| | 136 | Dans le deuxième programme, nous restons en assembleur, mais nous avons deux fichiers source : (1) le fichier contenant |
| | 137 | le code de boot et (2) le fichier contenant le code du noyau. Ici, le code du noyau c'est juste une ''fonction'' `kinit()`. Ce n'est pas vraiment une fonction car on n'utilise pas la pile. |
| | 138 | \\\\ |
| | 139 | **Objectifs** |
| | 140 | - Savoir comment le programme de boot fait pour sauter à l'adresse de la routine kinit. |
| | 141 | - Savoir un fichier kernel.ld un peu plus complet. |
| | 142 | |
| | 143 | **Fichiers** |
| | 144 | {{{ |
| | 145 | 2_init_asm/ |
| | 146 | ├── hcpu.S : code dépendant du cpu matériel en assembleur |
| | 147 | ├── kernel.ld : ldscript décrivant l'espace d'adressage pour l'éditeur de lien |
| | 148 | ├── kinit.S : fichier contenant le code de démarrage du noyau, ici c'est une routine kinit. |
| | 149 | └── Makefile : description des actions possibles sur le code : compilation, exécution, nettoyage, etc. |
| | 150 | }}} |
| | 151 | |
| | 152 | |
| | 153 | |
| | 154 | |
| | 155 | |
| | 156 | |
| | 157 | |
| | 158 | |
| | 159 | [wiki:AS5-TME9#a3.SautdanslafonctionkinitdunoyauenlangageC 3. kinit_c]:: \\ |
| | 160 | Dans ce troisième programme, nous faisons la même chose que pour le deuxième mais `kinit()` est désormais écrit en |
| | 161 | langage C. Cela change peu de choses, sauf une chose importante `kinit()` est une fonction et donc il faut absolument |
| | 162 | une pile d'exécution. |
| | 163 | \\\\ |
| | 164 | **Objectifs** |
| | 165 | - Savoir comment et où déclarer la pile d'exécution du noyau. |
| | 166 | - Savoir comment afficher un caractère sur un terminal depuis un programme C. |
| | 167 | |
| | 168 | **Fichiers** |
| | 169 | {{{ |
| | 170 | 3_init_c/ |
| | 171 | ├── hcpu.S : code dépendant du cpu matériel en assembleur |
| | 172 | ├── kernel.ld : ldscript décrivant l'espace d'adressage pour l'éditeur de lien |
| | 173 | ├── kinit.c : fichier en C contenant le code de démarrage du noyau, ici c'est la fonction kinit(). |
| | 174 | └── Makefile : description des actions possibles sur le code : compilation, exécution, nettoyage, etc. |
| | 175 | }}} |
| | 176 | |
| | 177 | |
| | 178 | |
| | 179 | |
| | 180 | = 4. Accès aux registres de contrôle des terminaux TTY |
| | 181 | |
| | 182 | |
| | 183 | |
| | 184 | |
| | 185 | Le prototype de SoC que nous utilisons pour les TP est configurable. Il est possible par exemple de choisir le nombre |
| | 186 | terminaux texte (TTY). Par défaut, il y en a un mais, nous pouvons en avoir jusqu'à 4. Nous allons modifier le code du |
| | 187 | noyau pour s'adapter à cette variabilité. En outre, pour le moment, nous ne faisions qu'écrire sur le terminal, |
| | 188 | maintenant, nous allons aussi lire le clavier. |
| | 189 | \\\\ |
| | 190 | **Objectifs** |
| | 191 | - Savoir comment compiler un programme C avec du code conditionnel. |
| | 192 | - Savoir comment décrire en C l'ensemble des registres d'un contrôleur de périphérique et y accéder. |
| | 193 | |
| | 194 | **Fichiers** |
| | 195 | {{{ |
| | 196 | 4_nttys/ |
| | 197 | ├── hcpu.S : code dépendant du cpu matériel en assembleur |
| | 198 | ├── kernel.ld : ldscript décrivant l'espace d'adressage pour l'éditeur de lien |
| | 199 | ├── kinit.c : fichier en C contenant le code de démarrage du noyau, ici c'est la fonction kinit(). |
| | 200 | └── Makefile : description des actions possibles sur le code : compilation, exécution, nettoyage, etc. |
| | 201 | }}} |
| | 202 | |
| | 203 | |
| | 204 | |
| | 205 | |
| | 206 | |
| | 207 | = 5. Premier petit pilote pour le terminal |
| | 208 | |
| | 209 | |
| | 210 | |
| | 211 | |
| | 212 | Dans l'étape 4, nous accédons au registre de périphérique directement dans la fonction `kinit()`, ce n'est pas très |
| | 213 | simple. C'est pourquoi, nous allons ajouter un niveau d'abstraction qui représente un début de pilote de périphérique |
| | 214 | (device driver). Ce pilote, même tout petit constitue une couche logicielle avec une API. |
| | 215 | \\\\ |
| | 216 | **Objectifs** |
| | 217 | - Savoir comment créér uun début de pilote pour le terminal TTY. |
| | 218 | - Savoir comment décrire une API en C |
| | 219 | |
| | 220 | **Fichiers** |
| | 221 | {{{ |
| | 222 | 5_driver/ |
| | 223 | ├── harch.c : code dépendant de l'architecture du SoC, pour le moment c'est juste le pilote du TTY |
| | 224 | ├── harch.h : API du code dépendant de l'architecture |
| | 225 | ├── hcpu.S : code dépendant du cpu matériel en assembleur |
| | 226 | ├── kernel.ld : ldscript décrivant l'espace d'adressage pour l'éditeur de lien |
| | 227 | ├── kinit.c : fichier en C contenant le code de démarrage du noyau, ici c'est la fonction kinit(). |
| | 228 | └── Makefile : description des actions possibles sur le code : compilation, exécution, nettoyage, etc. |
| | 229 | }}} |
| | 230 | |
| | 231 | |
| | 232 | |
| | 233 | |
| | 234 | = |
| | 235 | |
| | 236 | |
| | 237 | |
| | 238 | |