Changes between Version 3 and Version 4 of Doc-MIPS-Archi-Asm-kernel


Ignore:
Timestamp:
Sep 17, 2020, 10:09:52 AM (5 years ago)
Author:
franck
Comment:

--

Legend:

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

    v3 v4  
    2424Le processeur MIPS32 est un processeur 32 bits conçu dans les années 1980. Son jeu d'instructions est de type RISC (Reduced Instruction Set Computer). Il existe de nombreuses réalisations industrielles de cette architecture (SIEMENS, NEC, LSI LOGIC, SILICON GRAPHICS, MICROCHIP, etc.).
    2525
    26 Cette architecture est suffisamment simple pour présenter les principes de base de l'architecture des processeurs, et suffisamment puissante pour supporter un système d'exploitation multitâches tel qu'UNIX, puisqu’il supporte deux modes de fonctionnement utilisateur (''user'') et superviseur (''kernel'').
     26Cette architecture est suffisamment simple pour présenter les principes de base de l'architecture des processeurs, et suffisamment puissante pour supporter un système d'exploitation multitâches tel qu'UNIX, puisqu’il supporte deux modes de fonctionnement utilisateur (''user'') et système (''kernel'').
    2727
    2828 - Dans le mode ''user'', certaines régions de la mémoire et certains registres du processeur sont protégés et donc inaccessibles.
     
    112112   Ce registre possède le numéro `$16`.
    113113
    114 
    115 
    116 
    117 == C) ADRESSAGE MÉMOIRE
     114 Comportement des instructions `mtc0`et `mfc0`::
     115
     116 || instruction assembleur  || ||comportement dans le processeur       || || Remarques ||
     117 ||**mtc0 $gpr, $c0**       || || Copro. 0 ($C0) <--- Reg. GPR ($gpr)  || || $c0 = $8, $12, $13, $14, $15 ou $16 ; $gpr = $0 .. $31      ||
     118 ||**mfc0 $gpr, $c0**       || || Reg. GPR ($gpr) <--- Copro. 0 ($C0)  || || $c0 = $8, $12, $13, $14, $15 ou $16 ; $gpr = $0 .. $31          ||
     119 
     120
     121
     122
     123== C) ADRESSAGE DE LA MÉMOIRE
    118124
    119125
     
    121127
    122128
    123 L'ensemble des adresses que peut former le processeur définit son espace d'adressage. Toutes les adresses formées sont des adresses d'octets, ce qui signifie que la mémoire est vue comme un tableau d'octets, qui contient aussi bien les données que les instructions.
    124 
    125 Les adresses sont codées sur 32 bits. Les instructions sont codées sur 32 bits. Les échanges de données avec la mémoire se font par mot (4 octets consécutifs), demi-mot (2 octets consécutifs), ou par octet. Pour les transferts de mots et de demi-mots, le processeur respecte la convention "little endian".
    126 
    127 L'adresse d'un mot de donnée ou d'une instruction doit être multiple de 4. L'adresse d'un demi-mot doit être multiple de 2. (on dit que les adresses doivent être "alignées"). Le processeur part en exception si une instruction calcule une adresse qui ne respecte pas cette contrainte.
     129L'ensemble des adresses que peut former le processeur définit son espace d'adressage. Toutes les adresses formées sont des adresses d'octets, ce qui signifie que la mémoire est vue par le processeur comme un tableau d'octets qui contient aussi bien les données que les instructions.
     130
     131Les adresses sont codées sur 32 bits. Les instructions sont codées sur 32 bits. Les échanges de données avec la mémoire se font par mot (4 octets consécutifs), demi-mot (2 octets consécutifs) ou par octet. Pour les transferts de mots et de demi-mots, le processeur respecte la convention "little endian" (l'octet de poids faible est à l'adresse à plus petite).
     132
     133L'adresse d'un mot (4 octets) de donnée ou d'instruction doit être multiple de 4. L'adresse d'un demi-mot doit être multiple de 2, on dit que les adresses doivent être "alignées". Le processeur part en exception si une instruction calcule une adresse qui ne respecte pas cette contrainte. Plus généralement, une donnée est alignée en mémoire, si l'adresse de son premier octet (à l'adresse la plus petite) est un multiple de sa taille.
    128134
    129135
     
    132138
    133139
    134 Il existe un seul mode d’adressage, consistant à effectuer la somme entre le contenu d'un registre général Ri, défini dans l'instruction, et d'un déplacement qui est une valeur immédiate signée, sur 16 bits, contenue également dans l'instruction:
     140Le mode d'adressage définit la manière dont le processeur calcule les adresses de la mémoire pour y accéder en lecture ou en écriture. Il n'existe qu'un seul et unique mode d’adressage pour le MIPS32. Il consiste à effectuer la somme entre le contenu d'un registre général (GPR) $i, défini dans l'instruction, et d'un déplacement qui est une valeur immédiate signée, sur 16 bits (de -32768 à +32767), contenue également dans l'instruction:
    135141
    136142{{{
     
    139145
    140146
    141 === 3) Mémoire virtuelle
    142 
    143 
    144 Pour des raisons de simplicité, cette version du processeur MIPS32 ne possède pas de mémoire virtuelle, c'est à dire que le processeur ne contient aucun mécanisme matériel de traduction des adresses virtuelles en adresses physiques. Les adresses calculées par le logiciel sont donc transmises au système mémoire sans modifications.
    145 
    146 On suppose que la mémoire répond en un cycle. Un signal permet au système mémoire de "geler" le processeur s'il n'est pas capable de répondre en un cycle (ce mécanisme peut être utilisé pour gérer les MISS du ou des caches).
    147 
    148 
    149 
    150 === 4) Protection mémoire
    151 
    152 
    153 En l’absence de mémoire virtuelle, l’espace mémoire est simplement découpé en 2 segments identifiés par le bit de poids fort de l’adresse :
     147
     148=== 3) Protection mémoire
     149
     150
     151L’espace d'adressage de la mémoire est découpé en 2 parties identifiés par le bit de poids fort de l’adresse :
    154152
    155153{{{
    156 adr 31 = 0      ==>     segment utilisateur
    157 adr 31 = 1      ==>     segment système
    158 }}}
    159 
    160 Quand le processeur est en mode superviseur, les 2 segments sont accessibles. Quand le processeur est en mode utilisateur, seul le segment utilisateur est accessible. Le processeur part en exception si une instruction essaie d'accéder à la mémoire avec une adresse correspondant au segment système alors que le processeur est en mode utilisateur.
     154bit n°31 de l'adresse = 0       ==>     partie utilisateur
     155bit n°0 de l'adresse  = 1       ==>     partie système
     156}}}
     157
     158Quand le processeur est en mode système, les 2 segments sont accessibles. Quand le processeur est en mode utilisateur, seul le segment utilisateur est accessible. Le processeur part en exception si une instruction essaie d'accéder à la mémoire avec une adresse correspondant au segment système alors que le processeur est en mode utilisateur.
    161159
    162160Si une anomalie est détectée au cours du transfert entre le processeur et la mémoire, le système mémoire peut le signaler au moyen d'un signal d'erreur, qui déclenche un départ en exception.
     
    543541Toutes les instructions de branchement conditionnel sont relatives au compteur ordinal pour que le code soit translatable. L'adresse de saut est le résultat d'une addition entre la valeur du compteur ordinal et un déplacement signé.
    544542
    545 Les instructions MTC0 et MFC0 permettent de transférer le contenu des registres SR, CR, EPC et BAR vers un registre général et inversement. Ces 2 instructions ne peuvent être exécutées qu’en mode superviseur, de même que l'instruction ERET qui permet de restaurer l'état antérieur du registre d'état avant de sortir du gestionnaire d'exceptions.
     543Les instructions MTC0 et MFC0 permettent de transférer le contenu des registres SR, CR, EPC et BAR vers un registre général et inversement. Ces 2 instructions ne peuvent être exécutées qu’en mode système, de même que l'instruction ERET qui permet de restaurer l'état antérieur du registre d'état avant de sortir du gestionnaire d'exceptions.
    546544
    547545
     
    556554 - les appels système (instructions SYSCALL et BREAK)
    557555 - le signal RESET
    558 Dans tous ces cas, le principe général consiste à passer la main à une procédure logicielle spécialisée (appelée Gestionnaire d’Interrutions, Exceptions et Trappes) qui s'exécute en mode superviseur, à qui il faut transmettre les informations minimales lui permettant de traiter le problème.
     556Dans tous ces cas, le principe général consiste à passer la main à une procédure logicielle spécialisée (appelée Gestionnaire d’Interrutions, Exceptions et Trappes) qui s'exécute en mode système, à qui il faut transmettre les informations minimales lui permettant de traiter le problème.
    559557
    560558
     
    573571 CPU::  Coprocesseur inaccessible : tentative d'exécution d'une instruction privilégiée (MTC0, MFC0, ERET) alors que le processeur est en mode utilisateur.
    574572
    575 Le processeur doit alors passer en mode superviseur, et se brancher au  Gestionnaire d'Interruptions, Exceptions et Trappes (GIET), implanté conventionnellement à l'adresse "0x80000180". Après avoir identifié que la cause est une exception (en examinant le contenu du registre CR), le GIET se branche alors au gestionnaire d’exception. Toutes les exceptions étant fatales il n'est pas nécessaire de sauvegarder une adresse de retour, car 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:
     573Le processeur doit alors passer en mode système, et se brancher au  Gestionnaire d'Interruptions, Exceptions et Trappes (GIET), implanté conventionnellement à l'adresse "0x80000180". Après avoir identifié que la cause est une exception (en examinant le contenu du registre CR), le GIET se branche alors au gestionnaire d’exception. Toutes les exceptions étant fatales il n'est pas nécessaire de sauvegarder une adresse de retour, car 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:
    576574
    577575 - sauvegarder PC (l'adresse de l'instruction fautive) dans le registre EPC
    578  - passer en mode superviseur et masque les interruptions dans SR
     576 - passer en mode système et masque les interruptions dans SR
    579577 - sauvegarder éventuellement l’adresse fautive dans BAR       
    580578 - écrire le type de l'exception dans le registre CR
     
    586584Les requêtes d'interruption matérielles sont des évènements asynchrones provenant généralement de périphériques externes. Elles peuvent être masquées. Le processeur  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 écrites dans le registre CR, et elles sont prises en compte à la fin de l'exécution de l'instruction en cours si elles ne sont pas masquées. Cette requête doit être maintenue active par le périphérique tant qu'elle n'a pas été prise en compte par le processeur.
    587585
    588 Le processeur doit alors passer alors en mode superviseur et se brancher au GIET. Après avoir identifié que la cause est une interruption (en examinant le contenu du registre CR), le GIET se branche au gestionnaire d’interruption, qui doit appeler la routine d’interruption (ISR) appropriée. 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 :
     586Le processeur doit alors passer alors en mode système et se brancher au GIET. Après avoir identifié que la cause est une interruption (en examinant le contenu du registre CR), le GIET se branche au gestionnaire d’interruption, qui doit appeler la routine d’interruption (ISR) appropriée. 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 :
    589587
    590588 - sauvegarder PC+4 (l'adresse de retour) dans le registre EPC
    591  - passer en mode superviseur et masque les interruptions dans SR       
     589 - passer en mode système et masque les interruptions dans SR   
    592590 - écrire qu'il s'agit d'une interruption dans le registre CR
    593591 - brancher à l'adresse "0x80000180".
     
    600598
    601599
    602 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 superviseur 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 :
     600L'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 :
    603601
    604602 - sauvegarder PC (l'adresse de l'instruction) dans le registre EPC (l’adresse de retour est PC + 4)
    605  - passer en mode superviseur et masquage des interruptions dans SR
     603 - passer en mode système et masquage des interruptions dans SR
    606604 - écrire  la cause du déroutement dans le registre CR
    607605 - brancher à l'adresse "0x80000180".
     
    620618Dans ce cas, le processeur doit :
    621619
    622  - passer en mode superviseur et masque les interruptions dans SR       
     620 - passer en mode système et masque les interruptions dans SR   
    623621 - brancher à l'adresse "0xBFC00000"
    624622