Changes between Version 17 and Version 18 of Archi-1-TP10


Ignore:
Timestamp:
Dec 31, 2020, 9:40:35 AM (4 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP10

    v17 v18  
    258258 10 {
    259259 11     kprintf (0, banner);
    260  12     __asm__ volatile (          // this code allows to exit the kernel to go to user code
    261  13                          "la     $26,    __crt0         \n"     // get first address of user code
    262  14                          "mtc0   $26,    $14            \n"     // put it in c0_EPC
    263  15                          "li     $26,    0b00010010     \n"     // next status [UM,0,ERL,EXL,IE]     
    264  16                          "mtc0   $26,    $12            \n"     // UM <- 1, EXL <- 1, IE <- 0
    265  17                          "la     $29,    __data_end     \n"     // define new user stack pointer
    266  18                          "eret                          \n");   // j EPC and EXL <- 0
    267  19 }
     260 12
     261 13     // put bss sections to zero. bss contains uninitialised global variables
     262 14     extern int __bss_origin;    // first int of bss section
     263 15     extern int __bss_end;       // first int of above bss section
     264 16     for (int *a = &__bss_origin; a != &__bss_end; *a++ = 0);
     265 17
     266 18     // this code allows to exit the kernel to go to user code
     267 19     __asm__ volatile (   "la     $26,    __text_origin  \n"     // get first address of user code
     268 20                          "mtc0   $26,    $14            \n"     // put it in c0_EPC
     269 21                          "li     $26,    0b00010010     \n"     // next status [UM,0,ERL,EXL,IE]
     270 22                          "mtc0   $26,    $12            \n"     // UM <- 1, IE <- 0, EXL <- 1
     271 23                          "la     $29,    __data_end     \n"     // define new user stack pointer
     272 24                          "eret                          \n");   // j EPC and EXL <- 0
     273 25 }
    268274}}}
    269275{{{#!protected ------------------------------------------------------------------------------------
     
    275281- A cette adresse, on place la fonction `__start()`.
    276282- On est obligé d'écrire ce code en assembleur parce que la manière de changer de mode (de `kernel` à `user`) est propre à chaque processeur. Il n'y a aucun moyen de le faire en C.
     283'''''''''''''''
     284}}}
     2851. Dans le code C de la question précédente, à quoi servent les lignes 12 à 16? Pourquoi faire des déclarations `extern`?
     286{{{#!protected ------------------------------------------------------------------------------------
     287'''''''''''''''
     288- Ces lignes servent à mettre à 0 la zone des variables globales non initialisées explicitement par le programme.
     289- Les déclarations externes permettent d'informer le compilateur que les adresses `__bss_orgin` et `__bss_end`
     290  existent ailleurs. De fait, elles sont définies dans le fichier `kernel.ld`.
    277291'''''''''''''''
    278292}}}
     
    309323'''''''''''''''
    310324}}}
    311 1. Que faire avant et après l'exécution de la fonction `main()`?
    312 {{{#!protected ------------------------------------------------------------------------------------
    313 '''''''''''''''
    314 -
    315 '''''''''''''''
    316 }}}
    317 1. Quels sont les évènements traités par le noyau?
    318 {{{#!protected ------------------------------------------------------------------------------------
    319 '''''''''''''''
    320 -
     3251. Le code Que faire avant et après l'exécution de la fonction `main()` du point de vue de l'initialisation?
     326{{{#!protected ------------------------------------------------------------------------------------
     327'''''''''''''''
     328- Comme dans la fonction `kinit()`, il faut explicitement initialiser les variables globales non initialisées dans le programme C.
     329'''''''''''''''
     330}}}
     3311. Nous avons vu que le noyau est sollicité par des événements, quels sont-ils?
     332{{{#!protected ------------------------------------------------------------------------------------
     333'''''''''''''''
     334- Il y en a 3 (si on excepte le signal `reset` qui redémarre tout le système:
     335  1. Les appels système donc l'exécution de l'instruction `syscall`.
     336  1. Les exceptions donc les "erreur" de programmation (division par 0, adressage mémoire incorrect, etc.).
     337  1. Les interruptions qui sont des demandes d'intervention provenant des périphériques.
    321338'''''''''''''''
    322339}}}