Changes between Version 42 and Version 43 of Doc-MIPS-Archi-Asm-kernel


Ignore:
Timestamp:
Nov 13, 2020, 12:35:03 PM (5 years ago)
Author:
franck
Comment:

--

Legend:

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

    v42 v43  
    1212Le MIPS supporte deux modes de fonctionnement utilisateur (''user'') et système (''kernel'').
    1313
    14  - Dans le mode ''user'', certaines régions de la mémoire et certains registres du processeur sont protégés et donc inaccessibles. C'est dans ce mode que s'exécute les applications.
    15  - Dans le mode ''kernel'', toutes les ressources sont accessibles, c'est-à-dire toute la mémoire et tous les registres. Dans ce mode, toutes les instructions sont autorisées, à la fois les instructions standards (`add`, `or`, `lw`, `mul`, etc.), mais aussi des **''instructions privilégiées''** qui vont permettre de contrôler l'état de fonctionnement du processeur. C'est dans ce mode que s'exécute le noyau du système d'exploitation.
     14 - Dans le mode ''user'', certaines régions de la mémoire et certains registres du processeur sont protégés et donc inaccessibles. C'est dans ce mode que s'exécute les applications. \\\\
     15 - Dans le mode ''kernel'', toutes les ressources sont accessibles, c'est-à-dire toute la mémoire et tous les registres. Dans ce mode, toutes les instructions sont autorisées, à la fois les instructions standards (`add`, `or`, `lw`, `mul`, etc.), mais aussi des **''instructions protégées''** qui vont permettre de contrôler l'état de fonctionnement du processeur. C'est dans ce mode que s'exécute le noyau du système d'exploitation.
    1616
    1717Ce document détaille les éléments de l'architecture du processeur et du langage d'assemblage spécifique au mode ''kernel''.
     
    2323En mode ''kernel'', tous les registres sont accessibles, à la fois les registres non protégés et aussi des registres protégés. Pour rappel, les registres non protégés sont les GPR (`$0` à `$31`), le registre `PC`(accessible implicitement avec les instructions de branchement) et les registres `HI` et `LO`. Les registres protégés sont destinés au calcul alors que les **''registres protégés''** sont destinés au contrôle de l'état du processeur.
    2424
    25 L'architecture du MIPS32 définit 32 registres protégés, numérotés de `$0` à `$31`, c'est-à-dire comme les registres GPR mais ils ont des instructions d'accès spécifiques. En effet, ces registres protégés ne sont accessibles que par les instructions privilégiées `mtc0` et `mfc0`.
    26 Ces instruction ne utilisables qu'en mode ''kernel''. `mtc0` et `mfc0` signifient respectivement ''Move-To-Coprocessor-0'' et ''Move-From-Coprocessor-0''.
    27 
    28 Ces registres appartiennent au "coprocesseur système" n°0 (appélé aussi `c0` pour ''Coprocessor 0''). Dans cette version du processeur MIPS32, il y en a 6. Ils sont tous utilisés par le système d’exploitation pour la gestion des interruptions, des exceptions et des appels système.
     25L'architecture du MIPS32 définit 32 registres protégés, numérotés de `$0` à `$31`, c'est-à-dire comme les registres GPR mais ils ont des instructions d'accès spécifiques. En effet, ces registres protégés ne sont accessibles que par des instructions protégées présentées dans la section 4.
     26
     27Ces registres appartiennent au "coprocesseur système" n°0 (appélé aussi `c0` pour ''Coprocessor 0''). Dans cette version du processeur MIPS32, il y en a 6. Ils sont tous utilisés par le système d’exploitation pour la gestion des interruptions, des exceptions et des appels système. Dans ce document, nous ferons précéder le numéro du registre protégé par `cO_` afin de lever l'ambiguïtés.
    2928
    3029 Le registre `c0_sr`::
     
    6665   Ce registre possède le numéro `$16`.
    6766
    68  Comportement des instructions `mtc0`et `mfc0`::
    69 
    70  || **instruction assembleur**  || **comportement dans le processeur**      || **Remarques** ||
    71  ||**`mtc0 $gpr, $c0`**   || Copro. 0 (`$c0`) ← GPR (`$gpr`)  || `$c0 ` = `$8`, `$12`, `$13`, `$14`, `$15` ou `$16`\\`$gpr` = `$0` ... `$31`      ||
    72  ||**`mfc0 $gpr, $c0`**       || GPR (`$gpr`) ← Copro. 0 (`$c0`)  || `$c0` = `$8`, `$12`, `$13`, `$14`, `$15` ou `$16`\\`$gpr ` = `$0` ... `$31`          ||
    73  
    74 
    7567
    7668= 3. Adressage de la mémoire
     
    9587
    9688
    97 La version du MIPS32 que nous utilisons possède une cinquantaine d'instructions, il y a les instructions standards utilisables quel que soit le mode d'exécution du processeur et il y a les instructions protégées (ou privilégiées) qui ne sont utilisables qu'en mode ''kernel''. Les instructions standards sont présentées dans le document sur [htdocs:cours/doc_MIPS32.pdf l'architecture et l'assembleur en mode user]. Elles contiennent les instructions arithmétiques/logiques entre registres, les instructions de branchement, les instructions de lecture et écriture mémoire et l'instruction `syscall`. Cette section décrit les instructions protégées.
    98 
    99  Les instructions protégées utilise le format R:: \\
     89La version du MIPS32 que nous utilisons possède une cinquantaine d'instructions, il y a les instructions standards utilisables quel que soit le mode d'exécution du processeur et il y a les instructions protégées qui ne sont utilisables qu'en mode ''kernel''. Les instructions standards sont présentées dans le document sur [htdocs:cours/doc_MIPS32.pdf l'architecture et l'assembleur en mode user]. Ce sont les instructions arithmétiques/logiques entre registres, les instructions de branchement, les instructions de lecture et écriture mémoire et l'instruction `syscall`.
     90La présente section décrit les instructions protégées (utilisables seulement en mode ''kernel''). Nous en utilisons 3 : `mtc0`, `mfc0` et `eret`. 
     91
     92 `mtc0` et `mfc0`:: \\
     93 signifient respectivement ''Move-To-Coprocessor-0'' et ''Move-From-Coprocessor-0''. Comme leur nom l'indique, elles permettent de déplacer le contenu des registres entre les bancs (GPR et Copro).
     94
     95 || **instruction assembleur**  || **comportement dans le processeur**      || **Remarques** ||
     96 ||**`mtc0 $GPR, $C0`**   || COPRO. 0 (`$C0`) ← GPR (`$GPR`)  || `$C0 ` = `$8`, `$12`, `$13`, `$14`, `$15` OU `$16`\\`$GPR` = `$0` ... `$31`      ||
     97 ||**`mfc0 $GPR, $C0`**       || GPR (`$GPR`) ← COPRO. 0 (`$C0`)  || `$C0` = `$8`, `$12`, `$13`, `$14`, `$15` OU `$16`\\`$GPR ` = `$0` ... `$31`          ||
     98 
     99 `eret`:: \\
     100 signifie ''Exception-RETurn'', c'est-à-dire ''retour d'une exception''. Nous allons voir en détail dans la section **5.** ce que cela signifie. Pour le moment, comprenez que c'est l'unique instruction permettant de sortir du mode ''kernel'' pour entrer dans le mode ''user''.
     101
     102 || **instruction assembleur**  || **comportement dans le processeur**      || **Remarques** ||
     103 ||**eret**   || `PC` ← `CO_EPC`\\`C0_SR.EXL` ← `0` || copie le contenu du registre `C0_EPC` (`C0_$14`)\\dans le registre `PC`  et met `0` dans le bit `EXL`\\du registre `C0_SR` (`C0_$12`) ||
     104 
     105 Codage des instructions protégées:: \\
     106 Elles utilisent toutes le format R avec le champ `OPCOD` à la valeur `COPRO` (c.-à-d. `0b010000`). L'instruction est alors coder avec les bits 25 et 23 de l'instruction (ces deux bits sont dans le champs RS). Remarquez que ERET à deux codages.\\\\
    100107{{{#!html
    101 <table border="1" cellspacing="0" cellpadding="0"align=center>
     108<table border="1" cellspacing="0" cellpadding="0" align=left>
    102109<tr>
    103110<td style="width:70px"; align=center> OPCOD</td>
     
    109116</tr>
    110117</table>
    111 <table border="0" cellspacing="0" cellpadding="0"align=center>
     118<br>
     119<br>
     120<table border="0" cellspacing="0" cellpadding="0" align=left>
    112121<tr>
    113122<td style="width:72px"; align=left> 31</td>
     
    121130</table>
    122131}}}
    123 
    124  Lorsque l'OPCOD a la valeur COPRO, il faut analyser les bits 25 et 23 de l'instruction. Les trois instructions de cette famille COPRO sont des instructions privilégiées. Remarquez que ERET à deux codages.
    125132
    126133{{{#!html
     
    143150</tr>
    144151<tr></table>
    145 <div align=center><br>
    146 Par exemple, l'instruction MTC0 a un OPCOD à "010000",<br>le bit IN20 est à "0" et le bit INS16 est à "0".
    147 </div>
    148 }}}
     152}}}
     153 Par exemple:\\ `mtc0 $4, $14`l'instruction MTC0 a un OPCOD à "010000",<br>le bit IN20 est à "0" et le bit INS16 est à "0".
    149154
    150155