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 | |