250 | | L'instruction `syscall` permet à une application de l'utilisateur de demander un service au noyau du système d'exploitation, comme par exemple effectuer une entrée-sortie. Le code définissant le type de service demandé au système, et d'éventuels paramètres doivent avoir été préalablement rangés dans des registres généraux. Quand le processeur exécute l'instruction `syscall, il passe en mode ''kernel'' et se branche au noyau. Après avoir identifié que la cause est un appel système (en examinant le contenu du registre `c0_cause`), le noyau se branche au gestionnaire d’appels système. L'instruction `syscall` réalise les opérations suivantes : |
251 | | |
252 | | - sauvegarder PC (l'adresse de l'instruction) dans le registre `c0_epc` (l’adresse de retour est PC + 4) ; |
253 | | - passer en mode système et masquage des interruptions dans c0_sr : `c0_sr`.'EXL` ← `1`; |
254 | | - écrire la cause du déroutement dans le registre `c0_cause` (ici `c0_cause`.`code` ← `8`); |
255 | | - brancher à l'adresse `0x80000180`. |
256 | | |
| 250 | L'instruction `syscall` permet à une application de l'utilisateur de demander un service au noyau du système d'exploitation, comme par exemple effectuer une entrée-sortie. Le code définissant le type de service demandé au système, et d'éventuels paramètres doivent avoir été préalablement rangés dans des registres généraux. Quand le processeur exécute l'instruction `syscall, il réalise les opérations suivantes : |
| 251 | - sauvegarde du `PC` (l'adresse de l'instruction) dans le registre `C0_EPC` (l’adresse de retour est `PC` + `4`) ; |
| 252 | - passage en mode ''kernel'' et masquage des interruptions dans `C0_SR` : `C0_SR`.`EXL` ← `1`; |
| 253 | - écriture de la cause du déroutement dans le registre `C0_CAUSE` (ici `c0_cause`.`code` ← `8`); |
| 254 | - branchement à l'adresse `0x80000180`. |
| 255 | |
| 256 | Pour information, après avoir identifié que la cause est un appel système (en examinant le contenu du registre `C0_CAUSE`), le noyau se branche au gestionnaire d’appels système. |
262 | | Le processeur possède également une entrée `RESET` dont l'activation pendant au moins un cycle entraîne le branchement inconditionnel du code de démarrage de l'ordinateur (code de boot). Ce code, implanté à l’adresse `0xBFC00000` doit principalement charger le code du noyau du système d’exploitation dans la mémoire depuis le disque ou le réseau et se brancher à la fonction d'initialisation du noyau. Cette fonction initialise les contrôleurs de périphériques et les structures internes du noyau et, à la fin elle se branche à la première application utilisateur. Dans notre modèle d'ordinateur, le noyau est pré-chargé en mémoire et le code de boot se contente d'appeler la fonction d'initialisation. |
263 | | |
264 | | Cette requête est très semblable à une septième ligne d'interruption externe avec les différences importantes suivantes: |
265 | | |
| 262 | Le processeur possède également une entrée `RESET` dont l'activation pendant au moins un cycle entraîne le branchement inconditionnel du code de démarrage de l'ordinateur (code de boot). Ce code, implanté à l’adresse `0xBFC00000` doit ''normalement'' charger le code du noyau du système d’exploitation dans la mémoire depuis le disque ou le réseau, puis se brancher à la fonction d'initialisation du noyau. Cette dernière initialise les contrôleurs de périphériques et les structures internes du noyau et, à la fin elle se branche à la première application utilisateur. Dans notre modèle d'ordinateur, le noyau est pré-chargé en mémoire et le code de boot se contente d'appeler la fonction d'initialisation après avoir juste initialisée le pointeur de pile `$29`. |
| 263 | |
| 264 | Cette requête est très semblable à une septième ligne d'interruption externe avec les différences importantes suivantes : |