Changes between Version 94 and Version 95 of Archi-1-TP10
- Timestamp:
- Nov 28, 2021, 12:49:24 PM (4 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Archi-1-TP10
v94 v95 474 474 }}} 475 475 {{{#!protected ------------------------------------------------------------------------------------ 476 ''''''''''''''' 476 '' 477 COurs 10 / slide 42 477 478 - État de la pile après l'exécution des lignes 36 à 43 478 479 {{{#!xml … … 496 497 }}} 497 498 - L'instruction ligne 44 met `0` dans le registre `c0_sr`. Ce qui a pour conséquence de mettre à `0` les bits `UM`, `EXL` et `IE`. On est donc en mode kernel avec interruptions masquées. 498 - ''Notez qu'interdire les interruptions pendant l'exécution des syscall est contraignant. Pour le moment, ce n'est pas important puisque nous ne traitons pas les interruptions, mais si nous les traitions, elles seraient masquées. En conséquence, il serait interdit aux fonctions qui traitent les appels système d'exécuter des attentes longues (comme une boucle qui attend le changement d'état d'un registre de périphérique) car sinon, le noyau serait bloqué (plus rien ne bougerait).''\\ \\499 - ''Notez qu'interdire les interruptions pendant l'exécution des syscall est un choix important. Pour le moment, ce n'est pas un problème puisque nous ne traitons pas les interruptions, mais si nous les traitions, elles seraient masquées. En conséquence, il serait interdit aux fonctions qui traitent les appels système d'exécuter des attentes longues (comme une boucle qui attend le changement d'état d'un registre de périphérique) car sinon, le noyau serait figé (plus rien ne bougerait). Nous verrons comment faire au prochain cours.''\\ \\ 499 500 - Commentaire du code lignes 46 à 53 500 501 - Ligne 46 : `$26` **←** l'adresse du tableau syscall_vector\\⟶ On s'apprête à y faire un accès indexé par le registre `$2` 501 - Ligne 47 : `$2` **←** `$2 & 0x1F`\\⟶ pour éviter de sortir du tableau si l'utilisateur à mis n'importe quoi dans `$2` 502 - Ligne 47 : `$2` **←** `$2 & 0x1F`\\⟶ pour éviter de sortir du tableau si l'utilisateur à mis n'importe quoi dans `$2`.\\On ne fait pas un modulo et donc `SYSCALL_NR` doit être une puissance de 2 ! 502 503 - Ligne 48 : `$2` **←** `$2 * 4`\\⟶ Les cases du tableau sont des pointeurs et font 4 octets 503 504 - Ligne 49 : `$2` **←** `$26 + $2`\\⟶ `$2` contient désormais l'adresse de la case contenant la fonction correspondante au service n°`$2` 504 505 - Ligne 50 : `$2` **←** MEM[`$2`] \\⟶ $2 contient l'adresse de la fonction à appeler 505 - Ligne 51 : jal $2 \\⟶ appel de la fonction de service\\On rappelle que `$4` à `$7` etqu'il y a de place pour ces arguments dans la pile.\\ \\506 - Ligne 51 : `jal $2` \\⟶ appel de la fonction de service\\On rappelle que `$4` à `$7` contiennent les 4 premiers argument, mais qu'il y a de place pour ces arguments dans la pile.\\ \\ 506 507 - Les lignes 53 à 59 restaurent l'état des registres `$31`, `c0_status`, `c0_epc` et le pointeur de pile puis on sort du noyau avec l'instruction `eret`. 507 '' '''''''''''''508 '' 508 509 }}} 509 510