Changes between Version 97 and Version 98 of Archi-1-TP10


Ignore:
Timestamp:
Nov 28, 2021, 4:12:22 PM (4 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP10

    v97 v98  
    654654
    655655
    656 1. Ouvrez le fichier Makefile, En ouvrant tous les fichiers dessiner le graphe de dépendance de `kernel.x` vis-à-vis de ses sources?
    657 {{{#!protected ------------------------------------------------------------------------------------
    658 '''''''''''''''
     6561. Ouvrez le fichier Makefile, En ouvrant tous les fichiers dessiner le graphe de dépendance de `kernel.x` vis-à-vis de ses sources?\\La réponse peut-être visible avec la commande `dot -Tpng Makefile.dot -oMakefile.png` à partir du fichier [htdocs:img/Makefile.dot Makefile.dot] en utilisant [https://www.graphviz.org graphviz] ... essayez c'est magique :-)
     657{{{#!protected ------------------------------------------------------------------------------------
     658''
    659659{{{#!make
    660660kernel.x : kernel.ld obj/hcpua.o obj/kinit.o obj/klibc.o obj/harch.o
     
    664664obj/harch.o : harch.c harch.h
    665665}}}
    666 {{{
    667 digraph G {
    668 node [shape=box color=brown]
    669 gcc1[label="gcc -c"];
    670 gcc2[label="gcc -c"];
    671 gcc3[label="gcc -c"];
    672 gcc4[label="gcc -c"];
    673 ld[label="ld"];
    674 node [shape=ellipse color=blue]
    675 "hcpu.h" , "hcpua.S"              -> gcc1 -> "obj/hcpua.o" -> ld -> "kernel.x"
    676 "kinit.c" , "klibc.h"             -> gcc2 -> "obj/kinit.o" -> ld
    677 "klibc.h" , "klibc.c" , "harch.h" -> gcc3 -> "obj/klibc.o" -> ld
    678 "harch.h" , "harch.c"             -> gcc4 -> "obj/harch.o" -> ld
    679 }
    680 }}}
    681666  [[Image(htdocs:img/Makefile.png, width=500, nolink)]]
    682667''
     
    6846691. Dans quel fichier se trouvent les codes dépendant du MIPS ?
    685670{{{#!protected ------------------------------------------------------------------------------------
    686 '''''''''''''''
     671''
    687672- Ils sont dans le fichier `hcpua.S`
    688 '''''''''''''''
     673''
    689674}}}
    690675
     
    713698}}}
    714699}}}
     700
     701
    715702== B2. Programme utilisateur mais exécuté en mode kernel
    716703
     
    720707Nous allons désormais avoir deux exécutables: le noyau et l'application. Dans cette étape, nous allons voir comment le noyau fait pour appeler l'application, alors même que celle-ci n'est pas compilée en même temps que le noyau. Nous allons passer du noyau à l'application à la fin de la fonction `kinit()`.
    721708
    722 Nous allons donc entrer dans l'application, en revanche, dans cette étape, nous n'allons pas mettre en place la gestion des syscalls. C'est-à-dire qu'il ne sera pas possible de revenir dans le noyau depuis l'application. C'est bien entendu une étape intermédiaire, parce qu'il faut absolument pouvoir invoquer le noyau depuis l'application pour accéder aux périphériques.
     709Nous allons donc entrer dans l'application, en revanche, dans cette étape, nous n'allons pas mettre en place la gestion des syscalls. **C'est-à-dire qu'il ne sera pas possible de revenir dans le noyau depuis l'application**. C'est bien entendu une étape intermédiaire, parce qu'il faut absolument pouvoir invoquer le noyau depuis l'application pour accéder aux périphériques.
    723710Pour pouvoir quand même accéder aux registres de périphériques, nous allons **exceptionnellement** exécuter l'application en mode kernel. Ainsi, l'application pourra accéder aux adresses de l'espace d'adressage réservées au mode `kernel`.
    724711
     
    7527391. Combien de fichiers de type ldscript avons-nous ?
    753740{{{#!protected ------------------------------------------------------------------------------------
    754 '''''''''''''''
     741''
    755742- Il en faut deux, un pour le kernel `kernel/kernel.ld` et un pour l'application `user/user.ld`
    756 '''''''''''''''
     743''
    757744}}}
    7587451. Dans quel fichier se trouve la première fonction de l'application et comment s'appelle-t-elle?
    759746{{{#!protected ------------------------------------------------------------------------------------
    760 '''''''''''''''
     747''
    761748- Dans le fichier `user/crt0.c`, c'est la fonction `_start()`.
    762 '''''''''''''''
     749''
    763750}}}
    7647511. Quelle est la fonction du noyau qui appelle cette fonction et dans quel fichier?
    765752{{{#!protected ------------------------------------------------------------------------------------
    766 '''''''''''''''
     753''
    767754- C'est la fonction `kinit()`, dans le fichier `kernel/kinit.c`.
    768 '''''''''''''''
     755''
    769756}}}
    7707571. Comment le noyau fait-il pour démarrer l'application en mode `kernel`? (la réponse est dans la fonction de la question précédente).
    771758{{{#!protected ------------------------------------------------------------------------------------
    772 '''''''''''''''
    773 - Dans la fonction `kinit()` : ligne 19, on initialise le bit `UM` du registre status `c0_sr` avec `0`. Ainsi, après l'exécution de `eret`, nous serons en mode `kernel`.
     759''
     760- Dans la fonction `kinit()`, on appelle `app_load(&_start)`, c'est une fonction écrite en assembleur, donc forcément dans `hcpua.S`. Dans cette fonction on initialise `c0_epc` avec l'adresse de `_start()`, on initialise le bit `UM` du registre status `c0_sr` avec `0`. Ainsi, après l'exécution de `eret`, nous serons en mode `kernel`.
    774761{{{#!c
    775 18     // this code allows to exit the kernel to go to user code
    776 19     __asm__ volatile (   "la     $26,    __text_origin  \n"     // get first address of user code
    777 20                          "mtc0   $26,    $14            \n"     // put it in c0_EPC
    778 21                          "li     $26,    0b00000010     \n"     // next status [UM,0,ERL,EXL,IE]
    779 22                          "mtc0   $26,    $12            \n"     // UM <- 0, IE <- 0, EXL <- 1
    780 23                          "la     $29,    __data_end     \n"     // define new user stack pointer
    781 24                          "eret                          \n");   // j EPC and EXL <- 0
    782 }}}
    783 '''''''''''''''
     762.globl app_load // ----------------- void app_load (void * fun) called by kinit()
     763app_load:                         // call when we exit kinit() function to go to user code
     764
     765    mtc0   $4,      $14           // put _start address in c0_EPC
     766    li     $26,     2             // define next status reg. value
     767    mtc0   $26,     $12           // UM <- 0, IE <- 0, EXL <- 1
     768    eret                          // j EPC and EXL <- 0
     769}}}
     770''
    784771}}}
    785772
     
    834821
    835822
    836 1. Dans quel fichier se trouve la définition des numéros de services tels que `SYSCALL_EXIT` ?
    837 {{{#!protected ------------------------------------------------------------------------------------
    838 '''''''''''''''
     8231. Dans quel fichier se trouve la définition des numéros de services tels que `SYSCALL_EXIT` ? (''Ces numéros sont communs au noyau et à l'application'')
     824{{{#!protected ------------------------------------------------------------------------------------
     825''
    839826- Ils sont dans le fichier `common/syscall.h`.
    840 '''''''''''''''
     827''
    841828}}}
    8428291. Dans quel fichier se trouve le vecteur de syscall, c'est-à-dire le tableau `syscall_vector[]` contenant les pointeurs sur les fonctions qui réalisent les services correspondants aux syscall ?
    843830{{{#!protected ------------------------------------------------------------------------------------
    844 '''''''''''''''
     831''
    845832- Il est dans le fichier `kernel/ksyscall.c`.
    846 '''''''''''''''
    847 }}}
    848 1. Dans quel fichier se trouve le gestionnaire de syscalls ?
    849 {{{#!protected ------------------------------------------------------------------------------------
    850 '''''''''''''''
     833''
     834}}}
     8351. Dans quel fichier se trouve le gestionnaire de syscalls ? (''c'est de l'assembleur'')
     836{{{#!protected ------------------------------------------------------------------------------------
     837''
    851838- Il est dans le fichier `kernel/hcpua.S`.
    852 '''''''''''''''
     839''
    853840}}}
    854841
     
    868855
    869856
    870 L'application utilisateur n'est pas censée utiliser directement les appels système. Elle utilise une librairie de fonctions standards (la `libc` POSIX, mais pas seulement) et ce sont ces fonctions qui réalisent les appels système. Toutes les fonctions de la `libc` n'utilisent pas les appels système. Par exemple, les fonctions `int rand(void)` ou `int strlen(char *)` (rendent, respectivement, un nombre pseudoaléatoire et la longueur d'une chaîne de caractères) n'ont pas besoin du noyau. Les librairies font partie du système d'exploitation mais elles ne sont pas dans le noyau.
     857L'application utilisateur n'est pas censée utiliser directement les appels système. Elle utilise une librairie de fonctions standards (la `libc` POSIX, mais pas seulement) et ce sont ces fonctions qui réalisent les appels système. Toutes les fonctions de la `libc` n'utilisent pas les appels système. Par exemple, les fonctions `int rand(void)` ou `int strlen(char *)` (rendent, respectivement, un nombre pseudo aléatoire et la longueur d'une chaîne de caractères) n'ont pas besoin du noyau. Les librairies font partie du système d'exploitation mais elles ne sont pas dans le noyau.
    871858
    872859 ''Le terme « librairie » vient de l'anglais « library » qui signifie bibliothèque. On utilise souvent le mot librairie même si le sens en français n'est pas le même que celui en anglais. Disons que, dans notre contexte, les deux mots sont synonymes.''
     
    9149011. Pour ce petit système, dans quel fichier sont placés tous les prototypes des fonctions de la libc? Est-ce ainsi pour POSIX sur LINUX?
    915902{{{#!protected ------------------------------------------------------------------------------------
    916 '''''''''''''''
     903''
    917904- Ils sont tous dans le fichier `libc.h`.
    918 - Non, pour POSIX, les prototypes de fonctions de la libc sont répartis dans plusieurs fichiers suivant leur rôle. Il y `stdio.h`, `string.h`, `stdlib.h`, etc. Nous n'avons pas voulu ajouter cette complexité.
    919 '''''''''''''''
     905- Non, pour POSIX, les prototypes de fonctions de la libc sont répartis dans plusieurs fichiers suivant leur rôle. Il y a `stdio.h`, `string.h`, `stdlib.h`, etc. Nous n'avons pas voulu ajouter cette complexité.
     906''
    920907}}}
    921908
     
    925912
    926913- Vous allez juste ajouter la fonction `int cpuid()` dans la librairie `libc`.
    927 - Au premier TP, vous deviez créer un petit jeu 'guess', vous pouvez en faire une application utilisateur, en utilisant cette fois les fonction de la `libc`.
     914- Au premier TP, vous deviez créer un petit jeu 'guess', vous pouvez en faire une application utilisateur, en utilisant cette fois les fonctions de la `libc`.