299 | | 1. Dans la question **A2.5**, nous avons vu comment la fonction `kinit` appelle la fonction `__start()` grâce à bout de code assembleur. Nous allons voir maintenant quelles sont les condition de cet appel. Dans le code de la question **A2.5**, `$26` est un registre de travail pour le kernel. Quels sont les autres registres modifiés? Expliquez pour chacun la valeur affectée. |
300 | | {{{#!protected ------------------------------------------------------------------------------------ |
301 | | ''''''''''''''' |
302 | | - |
| 299 | 1. Dans la question **A2.5**, nous avons vu comment la fonction `kinit` appelle la fonction `__start()` grâce à un bout de code en assembleur. Nous allons voir maintenant quelles sont les conditions de cet appel. Dans le code de la question **A2.5**, `$26` est un registre de travail pour le kernel. Quels sont les autres registres modifiés? Expliquez pour chacun la valeur affectée. |
| 300 | {{{#!protected ------------------------------------------------------------------------------------ |
| 301 | ''''''''''''''' |
| 302 | - Il y a 3 registres affectés, dans l'ordre : |
| 303 | - Le registre système `$14` nommé `c0_EPC`, il reçoit l'adresse `__crt0`, c'est-à-dire l'adresse de la fonction `__start()`. |
| 304 | - Le registre système `$12` nommé `c0_sr`, il reçoit la valeur `0x12`, donc les bits `UM`, `EXL` et `IE` prennent respectivement les valeurs `1`, `1` et `0` |
| 305 | - UM = 1 et IE = 0, signifie que l'on est normalement en mode `user` interruptions masquées, |
| 306 | **mais** comme `EXL` est à 1, on reste en mode `kernel` interruptions masquées. L'exécution de l'instruction `eret` mettra `EXL` |
| 307 | à `0` pour rendre le bit `UM` actif et passer en mode `user`. |
| 308 | - Le registre GPR `$29` reçoit l'adresse de la première adresse après la section `.data`. C'est le haut de la pile. |