260 | | 12 __asm__ volatile ( // this code allows to exit the kernel to go to user code |
261 | | 13 "la $26, __crt0 \n" // get first address of user code |
262 | | 14 "mtc0 $26, $14 \n" // put it in c0_EPC |
263 | | 15 "li $26, 0b00010010 \n" // next status [UM,0,ERL,EXL,IE] |
264 | | 16 "mtc0 $26, $12 \n" // UM <- 1, EXL <- 1, IE <- 0 |
265 | | 17 "la $29, __data_end \n" // define new user stack pointer |
266 | | 18 "eret \n"); // j EPC and EXL <- 0 |
267 | | 19 } |
| 260 | 12 |
| 261 | 13 // put bss sections to zero. bss contains uninitialised global variables |
| 262 | 14 extern int __bss_origin; // first int of bss section |
| 263 | 15 extern int __bss_end; // first int of above bss section |
| 264 | 16 for (int *a = &__bss_origin; a != &__bss_end; *a++ = 0); |
| 265 | 17 |
| 266 | 18 // this code allows to exit the kernel to go to user code |
| 267 | 19 __asm__ volatile ( "la $26, __text_origin \n" // get first address of user code |
| 268 | 20 "mtc0 $26, $14 \n" // put it in c0_EPC |
| 269 | 21 "li $26, 0b00010010 \n" // next status [UM,0,ERL,EXL,IE] |
| 270 | 22 "mtc0 $26, $12 \n" // UM <- 1, IE <- 0, EXL <- 1 |
| 271 | 23 "la $29, __data_end \n" // define new user stack pointer |
| 272 | 24 "eret \n"); // j EPC and EXL <- 0 |
| 273 | 25 } |
311 | | 1. Que faire avant et après l'exécution de la fonction `main()`? |
312 | | {{{#!protected ------------------------------------------------------------------------------------ |
313 | | ''''''''''''''' |
314 | | - |
315 | | ''''''''''''''' |
316 | | }}} |
317 | | 1. Quels sont les évènements traités par le noyau? |
318 | | {{{#!protected ------------------------------------------------------------------------------------ |
319 | | ''''''''''''''' |
320 | | - |
| 325 | 1. Le code Que faire avant et après l'exécution de la fonction `main()` du point de vue de l'initialisation? |
| 326 | {{{#!protected ------------------------------------------------------------------------------------ |
| 327 | ''''''''''''''' |
| 328 | - Comme dans la fonction `kinit()`, il faut explicitement initialiser les variables globales non initialisées dans le programme C. |
| 329 | ''''''''''''''' |
| 330 | }}} |
| 331 | 1. Nous avons vu que le noyau est sollicité par des événements, quels sont-ils? |
| 332 | {{{#!protected ------------------------------------------------------------------------------------ |
| 333 | ''''''''''''''' |
| 334 | - Il y en a 3 (si on excepte le signal `reset` qui redémarre tout le système: |
| 335 | 1. Les appels système donc l'exécution de l'instruction `syscall`. |
| 336 | 1. Les exceptions donc les "erreur" de programmation (division par 0, adressage mémoire incorrect, etc.). |
| 337 | 1. Les interruptions qui sont des demandes d'intervention provenant des périphériques. |