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


Ignore:
Timestamp:
Sep 17, 2020, 11:22:12 AM (5 years ago)
Author:
franck
Comment:

--

Legend:

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

    v4 v5  
    5858
    5959 Le registre `PC`::
    60    C'est le ''Program Counter'' ou compteur de programme en français.\\
     60   C'est le ''Program Counter'' ou compteur ordinal en français.\\
    6161   Ce registre contient l'adresse de l'instruction en cours d'exécution. Sa valeur est modifiée
    6262   par toutes les instructions.
     
    156156}}}
    157157
    158 Quand 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.
    159 
    160 Si 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.
     158Quand le processeur est en mode système, les 2 parties sont accessibles. Quand le processeur est en mode utilisateur, seul la partie utilisateur est accessible.
     159
     160Le processeur part en exception (le programme est dérouté vers le noyau du système d'exploitation) si une instruction essaie d'accéder à la mémoire avec une adresse de la partie système alors que le processeur est en mode utilisateur.
     161
     162Si une anomalie est détectée au cours du transfert entre le processeur et la mémoire, le système mémoire le signale ce qui déclenche également un départ en exception.
    161163
    162164
     
    166168
    167169
    168 === 1) Généralités
     170=== 1) Généralités et format des instructions
    169171
    170172
     
    176178- 5     instructions système
    177179
    178 Toutes les instructions ont une longueur de 32 bits et possèdent un des trois formats suivants :
    179 
    180  - Le format R est utilisé par les instructions nécessitant 2 registres sources (désignés par RS et RT) et un registre résultat désigné par RD.
    181 
     180Toutes les instructions ont une longueur de 32 bits et possèdent l'un des trois formats suivants R, I ou J:
     181
     182 Format R::
     183  Le format R est utilisé par les instructions ayant 2 registres sources (désignés par RS et RT) et un registre résultat désigné par RD.\\
     184  La forme générale est `OPCOD RD, RS, RT` dont le comportement est `RD <- RS OPCOD RT`.\\
     185  Par exemple `sub $4,$8,$16` réalise `$4 <- $8 - $16`.\\
     186  Codage:
    182187{{{#!html
    183188<table border="1" cellspacing="0" cellpadding="0"align=center>
     
    204209}}}
    205210
    206  - Le format I est utilisé par les instructions de lecture/écriture mémoire, par les instructions utilisant un opérande immédiat, ainsi que par les branchements courte distance (conditionnels).
     211 Format I::
     212  Le format I est utilisé (i) par les instructions de lecture/écriture mémoire, (ii) par les instructions utilisant un opérande immédiat, (iii) ainsi que par les branchements courte distance (conditionnels).\\
     213  La forme générale est `OPCOD RT, RS, IMD16` dont le comportement est `RT <- RS OPCOD IMM16`.\\
     214  Par exemple `addi $4,$8,-42` réalise `$4 <- $8 - 42` ou `lb $4,42($8)` réalise `$4 <- MEM[$8 + 42]`\\
     215  Codage:
    207216
    208217{{{#!html
     
    226235}}}
    227236
    228  - Le format J n’est utilisé que pour les branchements inconditionnels lointains
    229 
     237 Format J::
     238  Le format J n’est utilisé que pour les branchements inconditionnels longue distance
     239  La forme générale est `OPCOD IMD26` dont le comportement est `PC <- PC+IMD26`.\\
     240  Par exemple `j 0x40` réalise `PC <- PC + 0x40` (notez que l'argument de l'instruction est presque toujours une étiquette du programme et que c'est le programme d'assemblage qui calcule la valeur IM26).\\
     241  Codage:
    230242{{{#!html
    231243<table border="1" cellspacing="0" cellpadding="0" align=center>
     
    249261
    250262
    251 - Le codage des instructions est principalement défini par les 6 bits du champ code opération (appelé OPCOD) de l'instruction (INS 31:26). Cependant, trois valeurs particulières de ce champ définissent en fait une famille d'instructions : il faut alors analyser d'autres bits de l'instruction pour décoder l'instruction. Ces codes particuliers sont : SPECIAL (valeur "000000"), BCOND (valeur "000001") et COPRO (valeur "010000")
    252 
     263Le codage des instructions est principalement défini par les 6 bits du champ code opération (appelé OPCOD) de l'instruction (INS 31:26). Cependant, trois valeurs particulières de ce champ définissent en fait une famille d'instructions : il faut alors analyser d'autres bits de l'instruction pour décoder l'instruction. Ces codes particuliers sont : SPECIAL (valeur "000000"), BCOND (valeur "000001") et COPRO (valeur "010000")
     264
     265- codage du champ OPCOD:
    253266{{{#!html
    254267<div align=center><b>INS 28:26</div>
     
    358371}}}
    359372
    360 - Lorsque le code opération a la valeur SPECIAL ("000000"), il faut analyser les 6 bits de poids faible de l'instruction (INS 5:0)
     373- Lorsque l'OPCODE a la valeur SPECIAL ("000000"), il faut analyser les 6 bits de poids faible de l'instruction (INS 5:0):
    361374
    362375{{{#!html
     
    467480}}}
    468481
    469 - Lorsque le code opération a la valeur BCOND, il faut analyser les bits 20 et 16 de l'instruction.
     482- Lorsque l'OPCOD a la valeur BCOND, il faut analyser les bits 20 et 16 de l'instruction.
    470483
    471484{{{#!html
     
    495508
    496509
    497 - Lorsque le code opération 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.
     510- 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.
    498511
    499512{{{#!html
     
    539552Le déplacement est de 16 bits pour les instructions de branchement conditionnelles (Bxxx) et de 26 bits pour les instructions de saut inconditionnelles (Jxxx). De plus les instructions JAL, JALR, BGEZAL, et BLTZAL sauvegardent une adresse de retour dans le registre $31. Ces instructions sont utilisées pour les appels de sous-programme.
    540553
    541 Toutes 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é.
    542 
    543 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 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.
     554Toutes les instructions de branchement conditionnel sont relatives au PC (compteur ordinal) pour que le code soit translatable (déplaçable ailleur en mémoire), c'est-à-dire que l'adresse de branchement est le résultat de l'addition entre la valeur du compteur ordinal et un déplacement signé.
     555
     556Les instructions `mtc0` et `mfc0` permettent de transférer le contenu des registres `c0_sr`, `c0_cause`, `c0_epc` etc. vers un registre général GPR 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 `c0_ sr` avant de sortir du gestionnaire d'exceptions.
    544557
    545558
     
    550563
    551564Il existe quatre types d'évènements qui peuvent interrompre l'exécution "normale" d'un programme:
    552  - les exceptions
    553  - les interruptions 
    554  - les appels système (instructions SYSCALL et BREAK)
    555  - le signal RESET
    556 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 système, à qui il faut transmettre les informations minimales lui permettant de traiter le problème.
     565
     566 - les exceptions ;
     567 - les interruptions ;
     568 - les appels système (instructions `syscall` et `break`)
     569 - le signal RESET.
     570
     571Dans tous ces cas, le principe général consiste à dérouter le programme vers un code spécial (appelée noyau du système d'exploitation) qui s'exécute en mode système et à qui il faut transmettre les informations minimales lui permettant de traiter le problème.
    557572
    558573
     
    561576
    562577
    563 Les exceptions sont des évènements "anormaux", le plus souvent liés à une erreur de programmation, qui empêche l'exécution correcte de l'instruction en cours. La détection d'une exception entraîne l'arrêt immédiat de l'exécution de l'instruction fautive. Ainsi, on assure que l'instruction fautive ne modifie pas la valeur d'un registre visible ou de la mémoire. Les exceptions ne sont évidemment pas masquables. Il y a 7 types d'exception dans cette version du processeur MIPS32 :
    564 
    565  ADEL:: Adresse illégale en lecture : adresse non alignée ou se trouvant dans le segment système alors que le processeur est en mode utilisateur.
    566  ADES:: Adresse illégale en écriture : adresse non alignée ou accès à une donnée dans le segment système alors que le processeur est en mode utilisateur.
    567  DBE::  Data bus erreur : le système mémoire signale une erreur en activant le signal BERR à la suite d'un accès de donnée.
    568  IBE::  Instruction bus erreur : le système mémoire signale une erreur en activant le signal BERR à l'occasion d'une lecture instruction.       
    569  OVF::  Dépassement de capacité : lors de l'exécution d'une instruction arithmétique (ADD, ADDI ou SUB), le résultat ne peut être représenté sur 32 bits.
    570  RI::   OPCOD illégal : l'OPCOD ne correspond à aucune instruction connue (il s'agit probablement d'un branchement dans une zone mémoire ne contenant pas du code exécutable.
    571  CPU::  Coprocesseur inaccessible : tentative d'exécution d'une instruction privilégiée (MTC0, MFC0, ERET) alors que le processeur est en mode utilisateur.
    572 
    573 Le 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:
    574 
    575  - sauvegarder PC (l'adresse de l'instruction fautive) dans le registre EPC
    576  - passer en mode système et masque les interruptions dans SR
    577  - sauvegarder éventuellement l’adresse fautive dans BAR       
    578  - écrire le type de l'exception dans le registre CR
    579  - brancher à l'adresse "0x80000180".
     578Les exceptions sont des évènements "anormaux" détectés au moment de l'exécution des instructions. Ils sont le plus souvent liés à une erreur de programmation qui empêche l'exécution correcte de l'instruction en cours. La détection d'une exception entraîne l'arrêt immédiat de l'exécution de l'instruction fautive. Ainsi, on assure que l'instruction fautive ne modifie pas la valeur d'un registre visible ou de la mémoire. Les exceptions ne sont évidemment pas masquables, cela signifie que l'on ne peut pas interdire leur gestion. Il y a 7 types d'exception dans cette version du processeur MIPS32 :
     579
     580 ADEL:: Adresse illégale en lecture : adresse non alignée ou se trouvant dans la partie système alors que le processeur est en mode utilisateur.
     581 
     582 ADES:: Adresse illégale en écriture : adresse non alignée ou accès à une donnée dans le partie système alors que le processeur est en mode utilisateur.
     583 
     584 DBE::  Data bus erreur : le système mémoire signale une erreur en activant le signal BERR à la suite d'un accès de donnée à une adresse qui n'a pas de case mémoire associée. On dit qu'elle n'est pas ''mappée''. Cette erreur est aussi nommée erreur de segmentation ('segmentation fault` en anglais).
     585 
     586 IBE::  Instruction bus erreur : le système mémoire signale une erreur en activant le signal BERR à l'occasion d'une lecture instruction. C'est le même problème que pour **DBE** mais cela concerne les instructions.
     587 
     588 OVF::  Dépassement de capacité : lors de l'exécution d'une instruction arithmétique (ADD ou ADDI), le résultat ne peut être représenté sur 32 bits. Par exemple, la somme de 2 nombres positifs donne un nombre négatif.
     589 
     590 RI::   OPCOD illégal : l'OPCOD ne correspond à aucune instruction connue, il s'agit probablement d'un branchement dans une zone mémoire ne contenant pas du code exécutable.
     591 
     592 CPU::  Coprocesseur inaccessible : tentative d'exécution d'une instruction privilégiée (`mtc0`, `mfc0`, `eret`) alors que le processeur est en mode utilisateur.
     593
     594Dans 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:
     595
     596 - sauvegarder `PC` (l'adresse de l'instruction fautive) dans le registre `c0_epc` ;
     597 - passer en mode système et masquer les interruptions dans `c0_sr` ;
     598 - sauvegarder éventuellement l’adresse fautive dans `c0_bar`; 
     599 - écrire le type de l'exception dans le registre `c0_cause`;
     600 - brancher à l'adresse `0x80000180`.
     601
     602
    580603
    581604=== 2) Interruptions