Changes between Version 39 and Version 40 of Doc-MIPS-Archi-Asm-kernel


Ignore:
Timestamp:
Nov 13, 2020, 9:37:49 AM (5 years ago)
Author:
franck
Comment:

--

Legend:

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

    v39 v40  
    55
    66
    7 == A) INTRODUCTION
    8 
    9 
    10 Ce document est la suite du document [htdocs:cours/doc_MIPS32.pdf Documentation MIPS32 architecture et assembleur (mode user)] (''Ce document est tiré du document initialement écrit par Alain Greiner''). Le MIPS supporte deux modes de fonctionnement utilisateur (''user'') et système (''kernel'').
     7= 1. Introduction
     8
     9
     10Ce document est la suite du document [htdocs:cours/doc_MIPS32.pdf Documentation MIPS32 architecture et assembleur (mode user)] (''Ce document est tiré du document initialement écrit par Alain Greiner'').
     11
     12Le MIPS supporte deux modes de fonctionnement utilisateur (''user'') et système (''kernel'').
    1113
    1214 - 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.
    13  - Dans le mode ''kernel'', toutes les ressources sont accessibles, c'est-à-dire toute la mémoire et tous les registres. C'est dans ce mode que s'exécute le noyau du système d'exploitation.
    14 
    15 Nous allons donc voir les éléments de l'architecture et du langage d'assemblage, sq
    16 
    17 
    18 == B) REGISTRES VISIBLES DU LOGICIEL
    19 
    20 
    21 Tous les registres visibles du logiciel, c'est-à-dire ceux dont la valeur peut être lue ou modifiée par les instructions, sont des registres 32 bits. Il y a deux catégories de registres, protégés et non protégés, dont l'accès dépend du mode d'exécution du processeur. En mode ''user'', seuls les registres non protégés sont accessibles. En mode ''kernel'', tous les registres sont accessibles.
    22 
    23 
    24 
    25 
    26 === 1) Registres non protégés
    27 
    28 
    29 Le processeur possède 35 registres utilisables par les instructions standards (c'est-à-dire les instructions qui peuvent s'exécuter aussi bien en mode ''user'' qu'en mode ''kernel'').
    30 
    31  Les registres GPR::
    32    Il y a 32 registres généraux (GPR signifie ''General Purpose Register'') numétotés de `$0` à `$31`\\
    33    Ces registres sont directement utilisés par les instructions et permettent de stocker des résultats de calculs intermédiaires.\\\\
    34    Le registre `$0` est particulier:\\
    35    — la lecture fournit la valeur constante `0x00000000` \\
    36    — l’écriture ne modifie pas son contenu.\\\\
    37    Le registre `$31` est utilisé par les instructions d'appel de fonctions pour sauvegarder l'adresse de retour.\\
    38    — Les instructions d'appel de fonctions sont : `bgezal`, `bltzal`, `jal`et `jalr`
    39 
    40  Le registre `PC`::
    41    C'est le ''Program Counter'' ou compteur ordinal en français.\\
    42    Ce registre contient l'adresse de l'instruction en cours d'exécution. Sa valeur est modifiée
    43    par toutes les instructions.
    44 
    45  Les registres `HI` et `LO`::
    46    Ces sont les registres de la multiplication entière et de la division Euclidienne.\\
    47    Ces deux registres 32 bits sont utilisés pour stocker le résultat d'une multiplication
    48    ou d'une division.\\
    49    La multiplication de deux nombre de 32 bits est un mot de 64 bits (poids forts dans `HI` et poids faibles dans `LO`).\\
    50    La division Euclidienne de deux nombres 32 bits produit un quotient sur 32 bits dans `LO`
    51    et un reste sur 32 bits dans `HI`.
    52 
    53 
    54 
    55 === 2) Registres protégés
    56 
    57 
    58 L'architecture du MIPS32 définit 32 registres protégés (numérotés également de `$0` à `$31` mais ils sont dans un coprocesseur). Ces registres protégés ne sont accessibles, en lecture comme en écriture, que par les instructions privilégiées `mtc0` et `mfc0` ne pouvant être exécutées qu'en mode ''kernel''. `mtc0` et `mfc0` signifient respectivement ''Move-To-Coprocessor-0'' et ''Move-From-Coprocessor-0''. En effet, ces registres appartiennent au "coprocesseur système" n°0 (appélé aussi `c0` pour ''Coprocessor 0''). En pratique, cette version du processeur MIPS32 en définit 6. Ils sont utilisés par le système d’exploitation pour la gestion des interruptions, des exceptions et des appels système  (voir chapitre E).
     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.
     16
     17Ce document détaille les éléments de l'architecture du processeur et du langage d'assemblage spécifique au mode ''kernel''.
     18
     19
     20= 2. Registres protégés utilisables seulement en mode kernel
     21
     22
     23En 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.
     24
     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 les instructions privilégiées `mtc0` et `mfc0`.
     26Ces instruction ne utilisables qu'en mode ''kernel''. `mtc0` et `mfc0` signifient respectivement ''Move-To-Coprocessor-0'' et ''Move-From-Coprocessor-0''.
     27
     28Ces 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.
    5929
    6030 Le registre `c0_sr`::
    6131   Le registre `sr` de `c0` est le registre d'état (''Status Register'').
    62    Il contient en particulier le bit qui définit le mode : ''user'' ou ''kernel'',
    63    ainsi que les bits de masquage des interruptions.\\
     32   Il contient en particulier le bit qui définit le mode d'exécution du processeur:
     33   ''user'' ou ''kernel'', ainsi que les bits de masquage des interruptions.\\
    6434   Ce registre a le numéro `$12`.
    6535
    6636 Le registre `c0_cause`::
    6737   Le registre `cause` de `c0` est le registre de cause (''Cause Register'').
    68    En cas d'interruption, d'exception ou d'appel système, le code en cours d'exécution
    69    par le processeur est dérouté vers le noyau du système d'exploitation.
    70    Le  contenu de `c0_cause` définit la cause d'appel du noyau.\\
    71    Ce registre a  le numéro `$13`.
     38   En cas d'interruption, d'exception ou d'appel système, le programme en cours d'exécution
     39   est dérouté vers le noyau du système d'exploitation.
     40   Le  contenu de `c0_cause` contient un code qui définit la cause d'appel du noyau.\\
     41   Ce registre a le numéro `$13`.
    7242
    7343 Le registre `c0_epc`::
    7444   Le registre `epc` de `c0 est le registre d'exception (''Exception Program Counter'').
    75    Il contient soit l'adresse de retour (PC + 4) en cas d'interruption, soit l'adresse de l'instruction courante
    76    (`pc`) en cas d'exception ou d'appel système.\\
     45   Il contient : (i) soit l'adresse de retour (PC + 4) en cas d'interruption, (ii) soit
     46   l'adresse de l'instruction courante (`PC`) en cas d'exception ou d'appel système.\\
    7747   Ce registre a le numéro `$14`.
    7848
    7949 Le registre `c0_bar`::
    80    Le registre `bar` de `c0` est legistre d'adresse illégale (''Bad Address Register'').
    81    En cas d'exception de type "adresse illégale", il contient la valeur de l'adresse mal formée.\\     
     50   Le registre `bar` de `c0` est le registre d'adresse illégale (''Bad Address Register'').
     51   En cas d'exception de type ''adresse illégale'', il contient la valeur de l'adresse mal
     52   formée. Une adresse est illégale, par exemple,  si vous tentez une lecture de mot (`lw`)
     53   a une adresse non-alignée (non multiple de 4) ou si vous tentez une lecture en dehors
     54   des segments d'adresse où se trouve de la mémoire.\\
    8255   Ce registre a le numéro `$8`.
    8356
    8457 Le registre `c0_procid`::
    85    Le registre `procid` est le registre en lecture seulement contenant le numéro du processeur.
    86    Cet index « cablé » est utilisé par le noyau du système d’exploitation
    87    pour gérer des architectures multiprocesseurs.\\
     58   Le registre `procid` est un registre en lecture seule contenant le numéro du processeur.
     59   Cet index « cablé » est utilisé par le noyau du système d’exploitation. Il n'a de sens que
     60   pour gérer des architectures multiprocesseurs (multicore).\\
    8861   Ce registre possède le numéro `$15`.
    8962
     
    9669
    9770 || instruction assembleur  || ||comportement dans le processeur       || || Remarques ||
    98  ||**`mtc0 $gpr, $c0`**   || || Copro. 0 (`$c0`) <--- Reg. GPR (`$gpr`)  || || `$c0` = `$8`, `$12`, `$13`, `$14`, `$15` ou `$16` ; `$gpr` = `$0` .. `$31`      ||
    99  ||**`mfc0 $gpr, $c0`**       || || Reg. GPR (`$gpr`) <--- Copro. 0 (`$c0`)  || || `$c0` = `$8`, `$12`, `$13`, `$14`, `$15` ou `$16` ; `$gpr` = `$0` .. `$31`          ||
     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`          ||
    10073 
    10174
    10275
    10376
    104 == C) ADRESSAGE DE LA MÉMOIRE
     77== 3. Adressage de la mémoire
    10578
    10679