Changes between Version 59 and Version 60 of Doc-MIPS-Archi-Asm-kernel


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

--

Legend:

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

    v59 v60  
    4242 Le registre `C0_EPC`::
    4343   Le registre `EPC` de `C0 est le registre d'exception (''Exception Program Counter'').
    44    Il contient : (i) soit l'adresse de retour (PC + 4) en cas d'interruption, (ii) soit
     44   Il contient : (i) soit l'adresse de retour (PC + 4) en cas d'interruption ; (ii) soit
    4545   l'adresse de l'instruction courante (`PC`) en cas d'exception ou d'appel système.\\
    4646   Ce registre a le numéro `$14`.
     
    5050   En cas d'exception de type ''adresse illégale'', il contient la valeur de l'adresse mal
    5151   formée. Une adresse est illégale, par exemple,  si vous tentez une lecture de mot (`lw`)
    52    a une adresse non-alignée (non multiple de 4) ou si vous tentez une lecture en dehors
     52   a une adresse non alignée (non multiple de 4) ou si vous tentez une lecture en dehors
    5353   des segments d'adresse où se trouve de la mémoire.\\
    5454   Ce registre a le numéro `$8`.
     
    7171
    7272
    73 L’espace d'adressage de la mémoire est découpé en 2 parties identifiés par le bit de poids fort de l’adresse (bit n°31). Quand le processeur est en mode ''kernel'' alors les 2 parties (protégée et non protégée) sont accessibles. Quand le processeur est en mode ''user'' alors seule la partie protégée est accessible.
     73L’espace d'adressage de la mémoire est découpé en 2 parties identifiées par le bit de poids fort de l’adresse (bit n°31). Quand le processeur est en mode ''kernel'' alors les 2 parties (protégée et non protégée) sont accessibles. Quand le processeur est en mode ''user'' alors seule la partie protégée est accessible.
    7474
    7575{{{
     
    105105 
    106106 Codage des instructions protégées:: \\
    107  Elles utilisent toutes le format R avec le champ `OPCOD` à la valeur `COPRO` (c.-à-d. `0b010000`). L'instruction est alors codée avec les bits 25 et 23 de l'instruction (ces deux bits sont dans le champs `RS`). Remarquez que `eret` à deux codages.\\\\
     107 Elles utilisent toutes le format R avec le champ `OPCOD` à la valeur `COPRO` (c.-à-d. `0b010000`). L'instruction est alors codée avec les bits 25 et 23 de l'instruction (ces deux bits sont dans le champ `RS`). Remarquez que `eret` à deux codages.\\\\
    108108{{{#!html
    109109<table border="1" cellspacing="0" cellpadding="0">
     
    149149}}}
    150150
    151  Pour les instructions `mtc0` et `mfc0`, le premier argument est mis dans le champs `RT` et le second argument est mis dans le champs `RD`.
     151 Pour les instructions `mtc0` et `mfc0`, le premier argument est mis dans le champ `RT` et le second argument est mis dans le champ `RD`.
    152152
    153153 || **instruction**  || ||  **comportement** || || **commentaire** ||
     
    160160 — `mtc0 $5, $14` = `0b``010000`|`0.1..`| `$5` | `$14`|`.....`|`......` \\
    161161 — `mtc0 $5, $14` = `0b``010000`|`0.1..`|`00101`|`01110`|`.....`|`......` \\
    162  — `.` est un jocker qui peut être remplacé par `0`ou `1`, utilisons `0`\\
     162 — `.` est un joker qui peut être remplacé par `0`ou `1`, utilisons `0`\\
    163163 — `mtc0 $5, $14` = `0b``010000`|`00100`|`00101`|`01110`|`00000`|`000000` \\
    164164 — `mtc0 $5, $14` = `0b``0100 0000 1000 0101 0111 0000 0000 0000`\\
     
    215215
    216216Dans un ordinateur, nous avons vu qu'il y a au moins un processeur, une mémoire et des contrôleurs de périphériques. Les périphériques permettent, par exemple, de communiquer avec le monde extérieur (par exemple le terminal texte).
    217 Les périphériques reçoivent des commandes dans leur registres par des instructions de lecture et d'écriture (`lw`/`sw`) venant du processeur.
    218 
    219 Lorsqu'ils ont terminées une commande ou lorsqu'ils ont reçus ou calculés des données, les contrôleurs de périphériques peuvent le signaler au processeur par des **requêtes d'interruption** (IRQ pour Interrupt Request en anglais).
     217Les périphériques reçoivent des commandes dans leurs registres par des instructions de lecture et d'écriture (`lw`/`sw`) venant du processeur.
     218
     219Lorsqu'ils ont terminé une commande ou lorsqu'ils ont reçu ou calculé des données, les contrôleurs de périphériques peuvent le signaler au processeur par des **requêtes d'interruption** (IRQ pour Interrupt Request en anglais).
    220220**Une requête d'interruption est un signal d'état** produit par un contrôleur de périphérique avec deux états possibles : **actif** (ou levé) qui signifie que le contrôleur demande que le noyau intervienne ou **inactif** (ou baissé) qui signifie que le contrôleur n'a pas de demande.
    221221Les requêtes d'interruptions sont donc des notifications de fins de commandes ou d'arrivée de données sur un canal d'entrée ou encore des ticks d'horloge.
     
    230230Si elles ne sont pas masquées alors elles sont prises en compte à la fin de l'exécution de l'instruction en cours. Une requête émise par un contrôleur de périphérique doit être maintenue active par le contrôleur tant qu'elle n'a pas été prise en compte par le noyau du système d'exploitation.
    231231
    232 Même si l'activation d'une ligne d'interruption est toujours un événement attendu par le noyau du système d'exploitation, elle survient de manière asynchrone par rapport au programme en cours d'exécution.
     232Même si l'activation d'une ligne d'interruption est toujours un évènement attendu par le noyau du système d'exploitation, elle survient de manière asynchrone par rapport au programme en cours d'exécution.
    233233
    234234Le processeur doit alors passer alors en mode système et se brancher au noyau du système d'exploitation.
     
    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 réalise les opérations suivantes :
     250L'instruction `syscall` permets à 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 :
    251251 - sauvegarde du `PC` (l'adresse de l'instruction) dans le registre `C0_EPC` (l’adresse de retour est `PC` + `4`) ;
    252252 - passage en mode ''kernel'' et masquage des interruptions dans `C0_SR` : `C0_SR`.`EXL` ← `1`;
     
    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 ''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`.
     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é le pointeur de pile `$29`.
    263263
    264264Cette requête est très semblable à une septième ligne d'interruption externe avec les différences importantes suivantes :
     
    271271
    272272
    273 Pour 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`.
     273Pour reprendre l'exécution de l'application qui a effectué un appel système (instructions `syscall`) ou alors qui a été interrompue par une requête d’interruption, il faut exécuter l'instruction `eret`.
    274274Cette 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**.
    275275
     
    314314
    315315 ||**`IE     `**||Interrupt Enable ||0 = toutes les interruptions sont masquées\\1 = interruptions non-masquées mais elles peuvent l'être avec `IM[7:0]`||
    316  ||**`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'' et interruptions massquées||
     316 ||**`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'' et interruptions masquées||
    317317 ||**`ERL     `**||Error Level      ||1 = après le signal reset ou certaines erreurs de la mémoire ||
    318318 ||**`UM      `**||User Mode        ||0 = mode d'exécution ''kernel''\\1 = mode d'exécution ''user''||
     
    326326   b. Les  interruptions sont autorisées si et seulement si le bit `IE` vaut `1`,
    327327      et si les deux bits `ERL` et `EXL` valent `00`, et si le bit correspondant de `IM` vaut `1`.
    328    c. Les trois types d’événements qui déclenchent le branchement au noyau:
     328   c. Les trois types d’évènements qui déclenchent le branchement au noyau:
    329329     (interruptions, exceptions et appels système) mettent le bit `EXL` à `1`,
    330330      ce qui donc masque les interruptions et autorise l’accès aux ressources protégées.