Changes between Version 57 and Version 58 of Doc-MIPS-Archi-Asm-kernel


Ignore:
Timestamp:
Nov 14, 2020, 6:15:09 PM (4 years ago)
Author:
franck
Comment:

--

Legend:

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

    v57 v58  
    234234Le processeur doit alors passer alors en mode système et se brancher au noyau du système d'exploitation.
    235235De manière plus détaillée, lorsque le processeur reçoit une interruption (c'est-à-dire qu'une de ces lignes en entrée est active et non masquée), alors il réalise les opérations suivantes :
    236  - sauvegarder PC+4 (l'adresse de retour) dans le registre `C0_EPC` ;
    237  - passer en mode système et masquer les interruptions dans `C0_SR` ;   
    238  - écrire qu'il s'agit d'une interruption dans le registre `C0_CAUSE` ;
     236 - sauvegarde de PC+4 (l'adresse de retour) dans le registre `C0_EPC` ;
     237 - passage en mode ''kernel'' et masquage des interruptions dans `C0_SR`  : `C0_SR`.`EXL` ← `1`;       
     238 - écriture qu'il s'agit d'une interruption dans le registre `C0_CAUSE` ;
    239239 - branchement à l'adresse `0x80000180`.
    240240
     
    248248
    249249
    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 
     250L'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
     256Pour 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.
    257257
    258258
     
    260260
    261261
    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 
     262Le 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
     264Cette requête est très semblable à une septième ligne d'interruption externe avec les différences importantes suivantes :
    266265 - elle n'est pas masquable :
    267266 - il n'est pas nécessaire de sauvegarder une adresse de retour.
    268267 - le gestionnaire de reset est implanté à l'adresse "0xBFC00000".
    269268
    270 Dans ce cas, le processeur doit :
    271 
    272  - passer en mode système et masque les interruptions dans SR   
    273  - brancher à l'adresse "0xBFC00000"
    274 
    275 
    276269
    277270== E. Sortie du noyau
    278271
    279272
    280 Avant de reprendre l'exécution de l'application qui a effectué un appel système (instructions `syscall`) ou qui a été interrompu par une interruption, il est nécessaire d'exécuter l'instruction `eret`.
    281 Cette instruction modifie le contenu du registre `c0_sr`, et effectue un branchement à l’adresse contenue dans le registre `C0_EPC`.
     273Pour reprendre l'exécution de l'application qui a effectué un appel système (instructions `syscall`) ou alors qui a été interrompu par une interruption, il faut exécuter l'instruction `eret`.
     274Cette instruction modifie le contenu du registre `C0_SR` en mettant `0` dans son bit `EXL`, et effectue un branchement à l’adresse contenue dans le registre `C0_EPC`. Le fonctionnement du registre `C0_SR` détaillé dans la section **6**.
    282275
    283276
     
    286279
    287280
    288 Le registre `c0_sr` contient l'état du processeur. Cela concerne son comportement vis-à-vis des requêtes d'interruptions, c'est-à-dire les masques des interruptions matérielles et logicielles, et le mode d'exécution, mode système (''kernel'') ou en mode utilisateur (''user'').
     281
     282Le registre `C0_SR` contient l'état du processeur. Il définit le comportement du processeur vis-à-vis des requêtes d'interruptions, c'est-à-dire que c'est lui qui contient les masques des lignes d'interruptions matérielles et logicielles, et il définit le mode d'exécution, mode ''kernel'' ou en mode ''user''.
    289283
    290284- La figure suivante présente le contenu des 16 bits de poids faible du registre `c0_sr`. Cette version du MIPS32 n’utilise que 12 bits: