Changes between Version 72 and Version 73 of Archi-1-TP9


Ignore:
Timestamp:
Dec 4, 2020, 1:10:11 PM (4 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP9

    v72 v73  
    6060**Questions**
    6161
    62 {{{#!protected ------------------------------------------------------------------------------------
    63 ''Les réponses sont dans les transparents du cours
    64 }}}
    65621. Il y a deux mémoires dans **almo1** : RAM et ROM. Qu'est-ce qui les distinguent et que contiennent-elles ?
    6663{{{#!protected ------------------------------------------------------------------------------------
     
    429426trace: compil
    430427    $(SX) -KERNEL kernel.x -DEBUG $(FROM) -NCYCLES $(NCYC) -NTTYS $(NTTY) > details.log;\
    431     echo -e "\ngenerate trace.log, please wait... ";\
     428    echo "\ngenerate trace.log, please wait... ";\
    432429    tracelog -vout="trace.log.s" *.x.s details.log ;\
    433430    rm details.log
     
    435432clean:
    436433    -rm *.o* *.x* *~ *.log.* proc?_term? 2> /dev/null || true
    437 
    438434}}}
    4394354. Au début du fichier se trouve la déclaration des variables du Makefile, quelle est la différence entre `=`, `?=` et `+=` ?
     
    445441'''''''''''''''
    446442}}}
    447 1. Ou est utilisé `CFLAGS` et que fait `-DNTTYS=$(NTTY)` ?
    448 {{{#!protected ------------------------------------------------------------------------------------
    449 '''''''''''''''
    450 * C'est une partie des la variable
    451 '''''''''''''''
    452 }}}
    453 
    454 
    455 
    456 = Travaux pratiques
    457 
    458 
    459 
    460 
    461 == 1. Premier programme en assembleur dans la seule section de boot**=
    462 **ajouter des analyses des fichiers objets et des traces**
    463 
    464 
    465 
    466 
    467  Nous commençons par un petit programme de quelques lignes en assembleur, placé entièrement dans la région mémoire
    468  du boot, qui réalise l'affichage du message "Hello World". C'est un tout tout petit programme, mais pour obtenir
    469  l'exécutable, vous devrez utiliser tous les outils de la chaîne de cross-compilation MIPS et
    470  pour l'exécuter vous devrez exécuter le simulateur du prototype. C'est simple, mais c'est nouveau pour
    471  beaucoup d'entre vous.
    472 
    473 
    474 
    475 - **Objectifs**\\\\
    476    - produire un exécutable à partir d'un code en assembleur.
    477    - savoir comment afficher un caractère sur un terminal.
    478    - analyse d'une trace d'exécution
    479 
    480 
    481 
    482 - **Fichiers**
     4431. Ou est utilisé `CFLAGS` ? Que fait `-DNTTYS=$(NTTY)` et pourquoi est-ce utile ici ?
     444{{{#!protected ------------------------------------------------------------------------------------
     445'''''''''''''''
     446* La variable `CFLAGS` est utilisé par `gcc`, il y a ici toutes les options indispensables pour compiler mais il en existe des tonnes !
     447* `-DNTTYS=$(NTTY)` permet de définir un #define en ligne de commande et donc de changer les sources sans ouvrir les codes.
     448'''''''''''''''
     449}}}
     4501. Si on exécute `make` sans cible, que se passe-t-il ?
     451{{{#!protected ------------------------------------------------------------------------------------
     452'''''''''''''''
     453* C'est la première cible qui est choisie, donc c'est équivalent à `make help`. Cela affiche l'usage pour connaître les cibles disponibles.
     454'''''''''''''''
     455}}}
     4561. à quoi servent  `@` et `-` au début de certaines commandes ?
     457{{{#!protected ------------------------------------------------------------------------------------
     458'''''''''''''''
     459* `@` permet de ne pas afficher la commande avant son exécution. On peut rendre ce comportement systématique en ajoutant la règle `.SILENT:` n'importe ou dans le fichier.
     460* `-` permet de ne pas stopper l'exécution des commandes même si elles rendent une erreur, c'est-à-dire une valeur de sortie différente de 0.
     461'''''''''''''''
     462}}}
     463
     464
     465= B. Travaux pratiques
     466
     467
     468
     469
     470== B1. Premier programme en assembleur dans la seule section de boot
     471
     472
     473
     474Nous commençons par un petit programme de quelques lignes en assembleur, placé entièrement dans la région mémoire
     475du boot, qui réalise l'affichage du message "Hello World". C'est un tout tout petit programme, mais pour obtenir
     476l'exécutable, vous devrez utiliser tous les outils de la chaîne de cross-compilation MIPS et
     477pour l'exécuter vous devrez exécuter le simulateur du prototype. C'est simple, mais c'est nouveau pour
     478beaucoup d'entre vous.
     479
     480
     481**Objectifs**
     482
     483- produire un exécutable à partir d'un code en assembleur.
     484- savoir comment afficher un caractère sur un terminal.
     485- analyse d'une trace d'exécution
     486
     487**Fichiers**
     488
    483489{{{
    4844901_hello_boot
     
    490496
    491497
    492 - **Questions**\\
    493   ''Les réponses sont dans le cours ou dans les fichiers sources''\\\\
    494   - Dans quel fichier se trouve la description de l'espace d'adressage du MIPS ? Que trouve-t-on dans ce fichier ?
    495 {{{#!protected ------------------------------------------------------------------------------------
    496 '''''''''''''''
    497   - C'est dans le fichier kernel.ld. \\On y trouve:
    498     - la définition de variable du ldscript. Ce sont essentiellement des adresses dans l'espace d'adressage,
    499       mais pas seulement, il y a aussi la taille des régions.
    500     - On trouve ensuite la déclaration des régions mémoires.
    501     - et enfin la définition des sections de sortie qui seront mises dans le fichier binaire produit et dans quelle région elles sont placées.
    502 '''''''''''''''
    503 }}}
    504   - Dans quel fichier se trouve le code de boot et pourquoi avoir nommé ce fichier ainsi ?
     498**Questions**
     499
     500''Les réponses sont dans le cours ou dans les fichiers sources. Certaines ont déjà été traitées plus haut.''
     501
     5021. Dans quel fichier se trouve la description de l'espace d'adressage du MIPS ? Que trouve-t-on dans ce fichier ?
     503{{{#!protected ------------------------------------------------------------------------------------
     504'''''''''''''''
     505- C'est dans le fichier kernel.ld. \\On y trouve:
     506  - la définition de variable du ldscript. Ce sont essentiellement des adresses dans l'espace d'adressage,
     507    mais pas seulement, il y a aussi la taille des régions.
     508  - On trouve ensuite la déclaration des régions mémoires.
     509  - et enfin la définition des sections de sortie qui seront mises dans le fichier binaire produit et dans quelle région elles sont placées.
     510'''''''''''''''
     511}}}
     5121. Dans quel fichier se trouve le code de boot et pourquoi, selon vous, avoir nommé ce fichier ainsi ?
    505513{{{#!protected ------------------------------------------------------------------------------------
    506514'''''''''''''''
     
    509517'''''''''''''''
    510518}}}
    511   - A quelle adresse démarre le MIPS ? Où peut-on le vérifier ?
    512 {{{#!protected ------------------------------------------------------------------------------------
    513 '''''''''''''''
    514   - L'adresse de démarrage est `0xBFC00000`.
    515   - On peut le vérifier dans le fichier `kernel.ld`.
    516     Il y a une définition des régions mémoires, dont une région commençant à cette adresse-là, et c'est dans
    517     cette région que l'on met le code de boot.
    518 '''''''''''''''
    519 }}}
    520   - Que produit `gcc` quand on utilise l'option `-c` ?
    521 {{{#!protected ------------------------------------------------------------------------------------
    522 '''''''''''''''
    523   - L'option `-c` demande à `gcc` de s'arrêter après avoir produit le fichier objet.
    524   - Il produit donc un fichier au format `.o`
    525 '''''''''''''''
    526 }}}
    527   - Que fait l'éditeur de liens ? Comment est-il invoqué ?
    528 {{{#!protected ------------------------------------------------------------------------------------
    529 '''''''''''''''
    530   - L'éditeur de liens rassemble toutes les sections produites par le compilateur, et donc présentes dans les fichiers objet `.o`, et il les place dans de nouvelles sections, elles-mêmes placées dans les régions de la mémoire, conformément au fichier ldscript (ici `kernel.ld`).
    531   - L'éditeur de liens est appelé par `gcc` si on n'a pas l'option `-c`ou directement par `ld` (ici `mipsel_unknown_ld`)
    532 '''''''''''''''
    533 }}}
    534   - De quels fichiers a besoin l'éditeur de liens pour fonctionner ?
    535 {{{#!protected ------------------------------------------------------------------------------------
    536 '''''''''''''''
    537   - L'éditeur de liens a besoin des fichiers objets `.o` et du fichier ldscript (ici, `kernel.ld`)
    538 '''''''''''''''
    539 }}}
    540   - Dans quelle section se trouve le code de boot pour le compilateur ? ''(la réponse est dans le code assembleur)''
    541 {{{#!protected ------------------------------------------------------------------------------------
    542 '''''''''''''''
    543   - Le code de boot a été mis dans une section `.text`.
    544 '''''''''''''''
    545 }}}
    546   - Dans quelle section se trouve le message hello pour le compilateur ?
    547 {{{#!protected ------------------------------------------------------------------------------------
    548 '''''''''''''''
    549   - Le message est aussi la section `.text`.
    550 '''''''''''''''
    551 }}}
    552   - Dans quelle section se trouve le code de boot dans le code exécutable ?
    553 {{{#!protected ------------------------------------------------------------------------------------
    554 '''''''''''''''
    555   - Dans le programme exécutable, le code de boot est mis dans la section `.boot`.
    556 '''''''''''''''
    557 }}}
    558   - Dans quelle région de la mémoire le code de boot est-il placé ?
    559 {{{#!protected ------------------------------------------------------------------------------------
    560 '''''''''''''''
    561   - Le code de boot est placé dans la région `boot_region`
    562 '''''''''''''''
    563 }}}
    564   - Comment connaît-on l'adresse du registre de sortie du contrôleur de terminal `TTY` ?
    565 {{{#!protected ------------------------------------------------------------------------------------
    566 '''''''''''''''
    567   - Le fichier `kernel.ld` déclare une variable `__tty_regs_map` initialisée avec l'adresse de
    568     où sont placés les registres de contrôles du `TTY`. Le premier registre à l'adresse `__tty_regs_map`
    569     est l'adresse du registre de sortie `TTY_WRITE`.
    570 '''''''''''''''
    571 }}}
    572   - Le code de boot se contente d'afficher un message, comment sait-on que le message est fini
    573     et que le programme doit s'arrêter ?
    574 {{{#!protected ------------------------------------------------------------------------------------
    575 '''''''''''''''
    576   - C'est quand la boucle d'affichage détecte le `0` terminateur de la chaîne de caractères.
    577 '''''''''''''''
    578 }}}
    579   - Pourquoi terminer le programme par un `dead: j dead` ?
    580 {{{#!protected ------------------------------------------------------------------------------------
    581 '''''''''''''''
    582   - If faut arrêter le programme, car il n'y a plus de code, mais on ne sait pas arrêter le processeur,
    583     alors on le faire tourner en rond.
    584 '''''''''''''''
    585 }}}
    586 * **Exercice
    587   - Modifiez le code de `hcpu.S` afin d'afficher le message "Au revoir\n" (''Hommage VGE'') après le message "Hello".\\
    588     Vous devez avoir deux messages, et pas seulement étendre le premier.
     5191. A quelle adresse démarre le MIPS ? Où peut-on le vérifier ?
     520{{{#!protected ------------------------------------------------------------------------------------
     521'''''''''''''''
     522- L'adresse de démarrage est `0xBFC00000`.
     523- On peut le vérifier dans le fichier `kernel.ld`.
     524  Il y a une définition des régions mémoires, dont une région commençant à cette adresse-là, et c'est dans
     525  cette région que l'on met le code de boot.
     526'''''''''''''''
     527}}}
     5281. Que produit `gcc` quand on utilise l'option `-c` ?
     529{{{#!protected ------------------------------------------------------------------------------------
     530'''''''''''''''
     531- L'option `-c` demande à `gcc` de s'arrêter après avoir produit le fichier objet.
     532- Il produit donc un fichier au format `.o`
     533'''''''''''''''
     534}}}
     5351. Que fait l'éditeur de liens ? Comment est-il invoqué ?
     536{{{#!protected ------------------------------------------------------------------------------------
     537'''''''''''''''
     538- L'éditeur de liens rassemble toutes les sections produites par le compilateur, et donc présentes dans les fichiers objet `.o`, et il les place dans de nouvelles sections, elles-mêmes placées dans les régions de la mémoire, conformément au fichier ldscript (ici `kernel.ld`).
     539- L'éditeur de liens est appelé par `gcc` si on n'a pas l'option `-c`ou directement par `ld` (ici `mipsel_unknown_ld`)
     540'''''''''''''''
     541}}}
     5421. De quels fichiers a besoin l'éditeur de liens pour fonctionner ?
     543{{{#!protected ------------------------------------------------------------------------------------
     544'''''''''''''''
     5451. L'éditeur de liens a besoin des fichiers objets `.o` et du fichier ldscript (ici, `kernel.ld`)
     546'''''''''''''''
     547}}}
     5481. Dans quelle section se trouve le code de boot pour le compilateur ? ''(la réponse est dans le code assembleur)''
     549{{{#!protected ------------------------------------------------------------------------------------
     550'''''''''''''''
     551- Le code de boot a été mis dans une section `.text`.
     552'''''''''''''''
     553}}}
     5541. Dans quelle section se trouve le message hello pour le compilateur ? Ce choix est particulier, mais ce message est en lecture seule.
     555{{{#!protected ------------------------------------------------------------------------------------
     556'''''''''''''''
     557- Le message est aussi la section `.text`.
     558'''''''''''''''
     559}}}
     5601. Dans quelle section se trouve le code de boot dans le code exécutable ?
     561{{{#!protected ------------------------------------------------------------------------------------
     562'''''''''''''''
     563- Dans le programme exécutable, le code de boot est mis dans la section `.boot`.
     564'''''''''''''''
     565}}}
     5661. Dans quelle région de la mémoire le code de boot est-il placé ?
     567{{{#!protected ------------------------------------------------------------------------------------
     568'''''''''''''''
     569- Le code de boot est placé dans la région `boot_region`
     570'''''''''''''''
     571}}}
     5721. Comment connaît-on l'adresse du registre de sortie du contrôleur de terminal `TTY` ?
     573{{{#!protected ------------------------------------------------------------------------------------
     574'''''''''''''''
     575- Le fichier `kernel.ld` déclare une variable `__tty_regs_map` initialisée avec l'adresse de
     576  où sont placés les registres de contrôles du `TTY`. Le premier registre à l'adresse `__tty_regs_map`
     577  est l'adresse du registre de sortie `TTY_WRITE`.
     578'''''''''''''''
     579}}}
     5801. Le code de boot se contente d'afficher un message, comment sait-on que le message est fini
     581   et que le programme doit s'arrêter ?
     582{{{#!protected ------------------------------------------------------------------------------------
     583'''''''''''''''
     584- C'est quand la boucle d'affichage détecte le `0` terminateur de la chaîne de caractères.
     585'''''''''''''''
     586}}}
     5871. Pourquoi terminer le programme par un `dead: j dead` ?
     588{{{#!protected ------------------------------------------------------------------------------------
     589'''''''''''''''
     590- If faut arrêter le programme, car il n'y a plus de code, mais on ne sait pas arrêter le processeur,
     591  alors on le faire tourner en rond.
     592'''''''''''''''
     593}}}
     594
     595**Exercices**
     596 
     597- Exécutez le programme en lançant le simulateur avec `make exec`, qu'observez-vous ?
     598- Exécutez le programme en lançant le simulateur avec `make trace`. Cela exécute le programme pour une courte durée et cela produit un fichier `trace.log.s`. Que voyez-vous dans la trace ? 
     599- Modifiez le code de `hcpu.S` afin d'afficher le message "Au revoir\n" (''Hommage VGE'') après le message "Hello".\\
     600  Vous devez avoir deux messages, et pas seulement étendre le premier.
    589601{{{#!protected ------------------------------------------------------------------------------------
    590602'''''''''''''''
     
    596608
    597609
    598 
    599 
    600 == 2. Saut dans le code du noyau en assembleur
    601 
    602 
    603 
    604 
    605    Dans le deuxième programme, nous restons en assembleur, mais nous avons deux fichiers source : (1) le fichier contenant
    606    le code de boot et (2) le fichier contenant le code du noyau. Ici, le code du noyau c'est juste une ''fonction'' `kinit()`. Ce n'est pas vraiment une fonction car on n'utilise pas la pile.
    607    \\\\
    608    **Objectifs**
    609    - Savoir comment le programme de boot fait pour sauter à l'adresse de la routine kinit.
    610    - Avoir un fichier kernel.ld un peu plus complet.
     610== B2. Saut dans le code du noyau en assembleur
     611
     612
     613
     614Dans le deuxième programme, nous restons en assembleur, mais nous avons deux fichiers source : (1) le fichier contenant
     615le code de boot et (2) le fichier contenant le code du noyau. Ici, le code du noyau c'est juste une ''fonction'' `kinit()`. Ce n'est pas vraiment une fonction car on n'utilise pas la pile.
     616   
     617**Objectifs**
     618
     619- Savoir comment le programme de boot fait pour sauter à l'adresse de la routine kinit.
     620- Avoir un fichier kernel.ld un peu plus complet.
    611621 
    612  **Fichiers**
     622**Fichiers**
     623
    613624{{{
    6146252_init_asm/
     
    619630}}}
    620631
    621 - **Questions**\\
    622   ''Les réponses sont dans le cours ou dans les fichiers sources''\\\\
    623   - Regarder dans le fichier `hcpu.S`, dans quelle section est désormais le code de boot ?
    624 {{{#!protected ------------------------------------------------------------------------------------
    625 '''''''''''''''
    626   - Réponse
    627 '''''''''''''''
    628 }}}
    629   - Le code de boot ne fait que sauter dans la fonction kinit avec l'instruction `j`,
     632**Questions**
     633
     6341. Regarder dans le fichier `hcpu.S`, dans quelle section est désormais le code de boot ?
     635{{{#!protected ------------------------------------------------------------------------------------
     636'''''''''''''''
     637- Il a été placé dans la section de `.boot`
     638'''''''''''''''
     639}}}
     640- Le code de boot ne fait que sauter dans la fonction kinit avec l'instruction `j`,
    630641    il n'y a pas de retour, ce n'est donc pas un `jal`, mais pourquoi ne pas avoir utilisé
    631642    `j init` et donc pourquoi passer par un registre ?