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