Changes between Version 46 and Version 47 of Doc-MIPS-Archi-Asm-kernel


Ignore:
Timestamp:
Nov 13, 2020, 3:54:43 PM (4 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Doc-MIPS-Archi-Asm-kernel

    v46 v47  
    166166
    167167
    168 == E) EXCEPTIONS / INTERRUPTIONS / APPELS SYSTÈME
     168
     169= 5. Exceptions / Interruptions / Appels système
     170
    169171
    170172
    171173Il existe quatre types d'évènements qui peuvent interrompre l'exécution "normale" d'un programme:
    172 
    173174 - les exceptions ;
    174175 - les interruptions ;
    175  - les appels système (instructions `syscall` et `break`)
     176 - les appels système (instructions `syscall`)
    176177 - le signal RESET.
    177178
     
    179180
    180181
    181 
    182 === 1) Exceptions
     182== 5.1. Exceptions
    183183
    184184
     
    208208
    209209
    210 
    211 === 2) Interruptions
     210== 5.2 Interruptions
    212211
    213212
     
    221220 - brancher à l'adresse `0x80000180`program.
    222221
    223 En plus des 6 lignes d'interruption matérielles, le processeur MIPS32 possède un mécanisme d'interruption logicielle: Il existe 2 bits dans le registre de cause `c0_cause` qui peuvent être écrits par le logiciel au moyen de l'instruction privilégiée `mtc0`. La mise à 1 de ces bits déclenche le même traitement que les requêtes d'interruptions externes, s'ils ne sont pas masqués.
    224 
    225 
    226 
    227 === 3) Appels système: instructions `syscall` et `break`
    228 
    229 
    230 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. L'instruction `break` est utilisée plus spécifiquement pour poser un point d'arrêt (dans un but de debuggage du logiciel): on remplace brutalement une instruction du programme à debugger par l'instruction `break`. Dans les deux cas, le processeur passe en mode système et se branche ici encore 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. Lorsqu’il rencontre une des deux instructions `syscall` ou `break`, le matériel effectue les opérations suivantes :
     222En plus des 6 lignes d'interruption matérielles, le processeur MIPS32 possède un mécanisme d'interruption logicielle: Il existe 2 bits dans le registre de cause `c0_cause` qui peuvent être écrits par le logiciel au moyen de l'instruction privilégiée `mtc0`. La mise à 1 de ces bits déclenche le même traitement que les requêtes d'interruptions externes, s'ils ne sont pas masqués. 
     223
     224
     225
     226== 5.3 Appels système: instruction `syscall`
     227
     228
     229L'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 :
    231230
    232231 - sauvegarder PC (l'adresse de l'instruction) dans le registre `c0_epc` (l’adresse de retour est PC + 4) ;
    233  - passer en mode système et masquage des interruptions dans `c0_sr` ;
    234  - écrire  la cause du déroutement dans le registre `c0_cause` ;
     232 - passer en mode système et masquage des interruptions dans c0_sr : `c0_sr`.'EXL` ← `1`;
     233 - écrire  la cause du déroutement dans le registre `c0_cause` (ici `c0_cause`.`code` ← `8`);
    235234 - brancher à l'adresse `0x80000180`.
    236235