Changes between Version 6 and Version 7 of Doc-MIPS-Archi-Asm-kernel


Ignore:
Timestamp:
Sep 17, 2020, 8:53:38 PM (4 years ago)
Author:
franck
Comment:

--

Legend:

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

    v6 v7  
    593593 CPU::  Coprocesseur inaccessible : tentative d'exécution d'une instruction privilégiée (`mtc0`, `mfc0`, `eret`) alors que le processeur est en mode utilisateur.
    594594
    595 Dans tous les cas, le processeur doit passer en mode système et se brancher au noyau du système d'exploitation implanté à l'adresse `0x80000180`. Après avoir identifié que la cause est une exception (en examinant le contenu du registre `c0_cause`), le noyau se branche alors au gestionnaire d’exception. Ici, toutes les exceptions sont fatales, il n'y a pas de reprise de l'exécution du programme contenant l'instruction fautive. Le processeur doit cependant transmettre au gestionnaire d'exceptions l'adresse de l'instruction fautive et indiquer dans le registre de cause le type d'exception détectée. Lorsqu’il détecte une exception, le matériel doit donc:
     595Dans tous les cas, le processeur doit passer en mode système et se brancher au noyau du système d'exploitation implanté à l'adresse `0x80000180`. Après avoir identifié que la cause est une exception (en examinant le contenu du registre `c0_cause`), le noyau se branche alors au gestionnaire d’exception. Ici, toutes les exceptions sont fatales, il n'y a pas de reprise de l'exécution de l'application contenant l'instruction fautive. Le processeur doit cependant transmettre au gestionnaire d'exceptions l'adresse de l'instruction fautive et indiquer dans le registre de cause le type d'exception détectée. Lorsqu’il détecte une exception, le matériel doit donc:
    596596
    597597 - sauvegarder `PC` (l'adresse de l'instruction fautive) dans le registre `c0_epc` ;
     
    608608Les requêtes d'interruption matérielles sont des évènements asynchrones provenant des contrôleurs de périphériques. Elles peuvent être masquées (ignorées) par le processeur. Le processeur MIPS32 possède 6 lignes d'interruptions externes qui peuvent être masquées globalement ou individuellement. L'activation d'une de ces lignes est une requête d'interruption. Elles sont notifiées dans le registre `c0_cause` et, si elles ne sont pas masquées, elles sont prises en compte à la fin de l'exécution de l'instruction en cours. Cette requête doit être maintenue active par le contrôleur de périphérique tant qu'elle n'a pas été prise en compte par le processeur.
    609609
    610 Le processeur doit alors passer alors en mode système et se brancher au noyau du système d'exploitation. Après avoir identifié que la cause est une interruption (en examinant le contenu du registre `c0_cause`), le noyau se branche au gestionnaire d’interruption qui doit appeler une fonction appropriée pour le traitement de la requête. Cette fonction est appelée routine d’interruption ou ISR (pour ''Interrupt Service Routine''). Comme il faut reprendre l'exécution du programme en cours à la fin du traitement de l'interruption, il faut sauvegarder une adresse de retour. Lorsqu’il reçoit une requête d’interruption non masquée, le matériel  doit donc :
    611 
    612  - sauvegarder PC+4 (l'adresse de retour) dans le registre EPC
    613  - passer en mode système et masque les interruptions dans SR   
    614  - écrire qu'il s'agit d'une interruption dans le registre CR
    615  - brancher à l'adresse "0x80000180".
    616 
    617 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 CR 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.
     610Le processeur doit alors passer alors en mode système et se brancher au noyau du système d'exploitation. Après avoir identifié que la cause est une interruption (en examinant le contenu du registre `c0_cause`), le noyau se branche au gestionnaire d’interruption qui doit appeler une fonction appropriée pour le traitement de la requête. Cette fonction est appelée routine d’interruption ou ISR (pour ''Interrupt Service Routine''). Comme il faut reprendre l'exécution de l'application en cours à la fin du traitement de l'interruption, il faut sauvegarder une adresse de retour. Lorsqu’il reçoit une requête d’interruption non masquée, le matériel  doit donc :
     611
     612 - sauvegarder PC+4 (l'adresse de retour) dans le registre `c0_epc` ;
     613 - passer en mode système et masquer les interruptions dans `c0_sr` ;   
     614 - écrire qu'il s'agit d'une interruption dans le registre `c0_cause` ;
     615 - brancher à l'adresse `0x80000180`program.
     616
     617En 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.
    618618
    619619
     
    622622
    623623
    624 L'instruction SYSCALL permet à une tâche (utilisateur ou système) de demander un service au 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 un éventuel paramètre 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 déverminage du logiciel): on remplace brutalement une instruction du programme à déverminer par l'instruction BREAK. Dans les deux cas, le processeur passe en mode système et se branche ici encore au GIET. Après avoir identifié que la cause est un appel système (en examinant le contenu du registre CR), le GIET 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 :
    625 
    626  - sauvegarder PC (l'adresse de l'instruction) dans le registre EPC (l’adresse de retour est PC + 4)
    627  - passer en mode système et masquage des interruptions dans SR
    628  - écrire  la cause du déroutement dans le registre CR
    629  - brancher à l'adresse "0x80000180".
    630 
    631 
    632 
    633 === 4) Signal RESET
    634 
    635 
    636 Le processeur possède également une entrée RESET dont l'activation, pendant au moins un cycle, entraîne le branchement inconditionnel au logiciel bootloader. Ce logiciel, implanté conventionnellement à l’adresse 0xBFC00000 doit principalement charger le code du système d’exploitation dans la mémoire et initialiser les périphériques. Cette requête est très semblable à une septième ligne d'interruption externe avec les différences importantes suivantes :
    637 
    638  - elle n'est pas masquable.
     624L'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 :
     625
     626 - sauvegarder PC (l'adresse de l'instruction) dans le registre `c0_epc` (l’adresse de retour est PC + 4) ;
     627 - passer en mode système et masquage des interruptions dans `c0_sr` ;
     628 - écrire  la cause du déroutement dans le registre `c0_cause` ;
     629 - brancher à l'adresse `0x80000180`.
     630
     631
     632
     633=== 4) Signal `RESET`
     634
     635
     636Le 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.
     637
     638Cette requête est très semblable à une septième ligne d'interruption externe avec les différences importantes suivantes:
     639
     640 - elle n'est pas masquable :
    639641 - il n'est pas nécessaire de sauvegarder une adresse de retour.
    640642 - le gestionnaire de reset est implanté à l'adresse "0xBFC00000".
     
    647649
    648650
    649 === 5) Sortie du GIET ou du bootloader
    650 
    651 
    652 Avant de reprendre l'exécution d'un programme qui a effectué un appel système (instructions SYSCALL ou BREAK) ou qui a été interrompu par une interruption, ou pour sortir du bootloader, il est nécessaire d'exécuter l'instruction ERET.
    653 Cette instruction modifie le contenu du registre SR, et effectue un branchement à l’adresse  contenue dans le registre EPC.
    654 
    655 
    656 
    657 === 6) Gestion du registre d'état SR
    658 
    659 
    660 Le registre SR contient le mode d'exécution du processeur. Cela concerne son comportement vis-à-vis des signauc d'interruptions, c'est-à-dire les masques, et s'il est en mode ''kernel'' ou en mode ''user''
    661 - La figure suivante présente le contenu des 16 bits de poids faible du registre SR. Cette version du MIP32 n’utilise que 12 bits:
     651=== 5) Sortie du noyau
     652
     653
     654Avant 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`.
     655Cette instruction modifie le contenu du registre `c0_sr`, et effectue un branchement à l’adresse contenue dans le registre `c0_epc`.
     656
     657
     658
     659=== 6) Gestion du registre d'état `c0_sr`
     660
     661
     662Le 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'').
     663
     664- 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:
    662665{{{#!html
    663666<br><br>
     
    691694}}}
    692695
    693  ||**IE        **||Interrupt Enable  ||
    694  ||**EXL       **||Exception Level   ||
    695  ||**ERL       **||Reset Level       ||
    696  ||**UM        **||User Mode         ||
    697  ||**IM![7:0]  **||Masques individuels pour les six lignes d’interruption matérielles (bits IM![7:2])\\et pour les 2 interruptions logicielles (bits IM![1:0])
    698 
    699  - Le processeur a le droit d’accéder aux ressources protégées (registres du CP0,
    700    et adresses mémoires > 0x7FFFFFFF) si et seulement si le bit UM vaut 0,
    701    ou si l’un des deux bits ERL et EXL vaut 1.
    702  - Les  interruptions sont autorisées si et seulement si le bit IE vaut 1,
    703    et si les deux bits ERL et EXL valent 00, et si le bit correspondant de IM vaut 1.
    704  - Les trois types d’évènements qui déclenchent le branchement au GIET
    705    (interruptions, exceptions et appels système) forcent le bit EXL à 1,
    706    ce qui masque les interruptions et autorise l’accès aux ressources protégées.
    707  - L’activation du signal RESET qui force le branchement au Boot-Loader force le bit ERL à 1,
    708    ce qui masque les interruptions et autorise l’accès aux ressources protégées.
    709  - L’instruction ERET force le bit EXL  à  0.
     696 ||**IE        **||Interrupt Enable ||0 = toutes les interruptions sont masquées\\1 = interruptions non-masquées mais elles peuvent l'être avec IM[7:0]||
     697 ||**EXL       **||Exception Level  ||0 = aucun effet sur le processeur\\1 = le processeur vient d'entrer dans le noyau et donc le processeur est en mode ''kernel'' interruptions massquées||
     698 ||**ERL       **||Error Level      ||1 = une exception est survennue quand EXL == 1, c'est une erreur fatale ||
     699 ||**UM        **||User Mode        ||0 = mode d'exécution ''kernel''\\1 = mode d'exécution ''user''||
     700 ||**IM![7:0]  **||Masques individuels || pour les six lignes d’interruption matérielles (bits IM![7:2])\\et pour les 2 interruptions logicielles (bits IM![1:0])
     701
     702- Quelques remarques
     703   - Le processeur a le droit d’accéder aux ressources protégées (registres du coprocessor 0(`c0`),
     704     et aux adresses mémoires >= `0x80000000) si et seulement si le bit UM vaut 0,
     705     ou si l’un des deux bits ERL et EXL vaut 1.
     706   - Les  interruptions sont autorisées si et seulement si le bit IE vaut 1,
     707     et si les deux bits ERL et EXL valent 00, et si le bit correspondant de IM vaut 1.
     708   - Les trois types d’évènements qui déclenchent le branchement au GIET
     709     (interruptions, exceptions et appels système) forcent le bit EXL à 1,
     710     ce qui masque les interruptions et autorise l’accès aux ressources protégées.
     711   - L’activation du signal RESET qui force le branchement au Boot-Loader force le bit ERL à 1,
     712     ce qui masque les interruptions et autorise l’accès aux ressources protégées.
     713   - L’instruction ERET force le bit EXL  à  0.
    710714
    711715Lors de l’activation du RESET :