Changes between Version 161 and Version 162 of Archi-1-TP9


Ignore:
Timestamp:
Nov 21, 2021, 3:31:25 PM (3 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP9

    v161 v162  
    5515511. Dans quel fichier se trouve la description de l'espace d'adressage du MIPS ? Que trouve-t-on dans ce fichier ?
    552552{{{#!protected ------------------------------------------------------------------------------------
    553 '''''''''''''''
     553''
    554554- C'est dans le fichier kernel.ld. \\On y trouve:
    555555  - la définition de variables du ldscript. Ce sont essentiellement des adresses dans l'espace d'adressage,
     
    557557  - On trouve ensuite la déclaration des régions mémoires.
    558558  - 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.
    559 '''''''''''''''
     559''
    560560}}}
    5615611. Dans quel fichier se trouve le code de boot et pourquoi, selon vous, avoir nommé ce fichier ainsi ?
    562562{{{#!protected ------------------------------------------------------------------------------------
    563 '''''''''''''''
    564 - Le code de boot est dans le fichier `hcpu.S`. Il a a été nommé ainsi parce que c'est du code qui dépend du
    565   hardware et qu'il concerne le cpu.
    566 '''''''''''''''
     563''
     564- Le code de boot est dans le fichier `hcpua.S`. Il a a été nommé ainsi parce que c'est du code qui dépend du
     565  hardware, qu'il concerne le cpu et que c'est du code en assembleur. Nous verrons plus tard qu'il y aura un fichier `hcpuc.c`
     566''
    567567}}}
    5685681. À quelle adresse démarre le MIPS ? Où peut-on le vérifier ?
    569569{{{#!protected ------------------------------------------------------------------------------------
    570 '''''''''''''''
     570''
    571571- L'adresse de démarrage est `0xBFC00000`.
    572572- On peut le vérifier dans le fichier `kernel.ld`.
    573   Il y a une définition des régions mémoires, dont une région commençant à cette adresse-là, et c'est dans
     573  Il y a une définition des régions de la mémoire, dont une région commençant à cette adresse-là, et c'est dans
    574574  cette région que l'on met le code de boot.
    575 '''''''''''''''
     575''
    576576}}}
    5775771. Que produit `gcc` quand on utilise l'option `-c` ?
    578578{{{#!protected ------------------------------------------------------------------------------------
    579 '''''''''''''''
     579''
    580580- L'option `-c` demande à `gcc` de s'arrêter après avoir produit le fichier objet.
    581581- Il produit donc un fichier au format `.o`
    582 '''''''''''''''
     582''
    583583}}}
    5845841. Que fait l'éditeur de liens ? Comment est-il invoqué ?
    585585{{{#!protected ------------------------------------------------------------------------------------
    586 '''''''''''''''
     586''
    587587- 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`).
    588588- L'éditeur de liens est appelé par `gcc` si on n'a pas l'option `-c`ou directement par `ld` (ici `mipsel_unknown_ld`)
    589 '''''''''''''''
     589''
    590590}}}
    5915911. De quels fichiers a besoin l'éditeur de liens pour fonctionner ?
    592592{{{#!protected ------------------------------------------------------------------------------------
    593 '''''''''''''''
    594 - L'éditeur de liens a besoin des fichiers objets `.o` et du fichier ldscript (ici, `kernel.ld`)
    595 '''''''''''''''
     593''
     594- L'éditeur de liens a besoin des fichiers objets `.o` et du fichier `ldscript` (ici, `kernel.ld`)
     595''
    596596}}}
    5975971. Dans quelle section se trouve le code de boot pour le compilateur ? ''(la réponse est dans le code assembleur)''
    598598{{{#!protected ------------------------------------------------------------------------------------
    599 '''''''''''''''
     599''
    600600- Le code de boot a été mis dans une section `.text`.
    601 '''''''''''''''
    602 }}}
    603 1. Dans quelle section se trouve le message hello pour le compilateur ? Ce choix est particulier, mais ce message est en lecture seule.
    604 {{{#!protected ------------------------------------------------------------------------------------
    605 '''''''''''''''
     601''
     602}}}
     6031. Dans quelle section se trouve le message "hello" pour le compilateur ? Ce choix est particulier, mais ce message est en lecture seule.
     604{{{#!protected ------------------------------------------------------------------------------------
     605''
    606606- Le message est aussi la section `.text`.
    607 '''''''''''''''
    608 }}}
    609 1. Dans quelle section se trouve le code de boot dans le code exécutable ?
    610 {{{#!protected ------------------------------------------------------------------------------------
    611 '''''''''''''''
     607''
     608}}}
     6091. Dans quelle section se trouve le code de boot dans le code exécutable ? (la réponse est dans `hcpua.S`)
     610{{{#!protected ------------------------------------------------------------------------------------
     611''
    612612- Dans le programme exécutable, le code de boot est mis dans la section `.boot`.
    613 '''''''''''''''
    614 }}}
    615 1. Dans quelle région de la mémoire le code de boot est-il placé ?
    616 {{{#!protected ------------------------------------------------------------------------------------
    617 '''''''''''''''
     613''
     614}}}
     6151. Dans quelle région de la mémoire le code de boot est-il placé ? (la réponse est dans `kernel.ld`)
     616{{{#!protected ------------------------------------------------------------------------------------
     617''
    618618- Le code de boot est placé dans la région `boot_region`
    619 '''''''''''''''
    620 }}}
    621 1. Comment connaît-on l'adresse du registre de sortie du contrôleur de terminal `TTY` ?
    622 {{{#!protected ------------------------------------------------------------------------------------
    623 '''''''''''''''
     619''
     620}}}
     6211. Comment connaît-on l'adresse du registre de sortie du contrôleur de terminal `TTY` ? (la réponse est dans `kernel.ld' et sur cette page)
     622{{{#!protected ------------------------------------------------------------------------------------
     623''
    624624- Le fichier `kernel.ld` déclare une variable `__tty_regs_map` initialisée avec l'adresse de
    625625  où sont placés les registres de contrôles du `TTY`. Le premier registre à l'adresse `__tty_regs_map`
    626626  est l'adresse du registre de sortie `TTY_WRITE`.
    627 '''''''''''''''
     627''
    628628}}}
    6296291. Le code de boot se contente d'afficher un message, comment sait-on que le message est fini
    630    et que le programme doit s'arrêter ?
    631 {{{#!protected ------------------------------------------------------------------------------------
    632 '''''''''''''''
     630   et que le programme doit s'arrêter ? (ou quel est le caractère de fin de chaîne ?)
     631{{{#!protected ------------------------------------------------------------------------------------
     632''
    633633- C'est quand la boucle d'affichage détecte le `0` terminateur de la chaîne de caractères.
    634 '''''''''''''''
    635 }}}
    636 1. Pourquoi terminer le programme par un `dead: j dead` ?
    637 {{{#!protected ------------------------------------------------------------------------------------
    638 '''''''''''''''
     634''
     635}}}
     6361. Pourquoi terminer le programme par un `dead: j dead` ? Notez qu'on ne peut pas encore faire un ''`syscall exit`'' parce qu'il n'y a pas de gestionnaire de syscall et surtout parce `syscall` est une instruction appeler par une application utilisateur, et qu'il n'y en a pas encore.
     637{{{#!protected ------------------------------------------------------------------------------------
     638''
    639639- If faut arrêter le programme, car il n'y a plus de code, mais on ne sait pas arrêter le processeur,
    640640  alors on le faire tourner en rond.
    641 '''''''''''''''
     641''
    642642}}}
    643643
     
    646646- Exécutez le programme en lançant le simulateur avec `make exec`, qu'observez-vous ?
    647647{{{#!protected ------------------------------------------------------------------------------------
    648 '''''''''''''''
     648''
    649649- On voit une fenêtre `xterm` qui affiche un message et c'est tout. Dans le terminal de lancement de `make exec`, on voit le compteur de cycles avancer.
    650 '''''''''''''''
    651 }}}
    652 - 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 `debug.log` contenant des informations pour chaque cycle simulé.\\Ce fichier n'est pas exploitable directement par vous, mais il est nécessaire pour la génération de la trace d'exécution avec la commande `tracelog`.\\`tracelog` (script écrit en langage `awk`) combine `debug.log` et l'exécutable désassemblé pour produire une trace exploitable `trace0.s`.\\Que voyez-vous dans `trace.0.s` ? 
    653 {{{#!protected ------------------------------------------------------------------------------------
    654 '''''''''''''''''
    655 - On voit la séquence des instructions exécutée:
    656 - La première colonne nous informe que les adresses lues sont dans l'espace Kernel
    657 - La seconde colonne sont les numéros de cycles
    658 - La troisième sont les adresses
    659 - La quatrième le code binaire des instructions
    660 - Le reste de la ligne contient l'instruction désassemblée
    661 - Lorsque les adresses ont un nom, c'est à dire qu'une étiquette leur a été attribuée, celle-ci est indiquée.
     650''
     651}}}
     652- 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 `debug.log` contenant des informations pour chaque cycle simulé. Ce fichier n'est pas exploitable directement par vous, mais il est nécessaire pour la génération de la trace d'exécution avec la commande `tracelog`. Ce script (écrit en langage `awk`) utilise `debug.log` et l'exécutable désassemblé pour produire une trace exploitable `trace0.s`.\\Ouvrez `trace.0.s` et repérez ce qui est cité ici 
     653 - On voit la séquence des instructions exécutées
     654 - La première colonne nous informe que les adresses lues sont dans l'espace Kernel
     655 - La seconde colonne sont les numéros de cycles
     656 - La troisième sont les adresses
     657 - La quatrième le code binaire des instructions
     658 - Le reste de la ligne contient l'instruction désassemblée
     659 - Lorsque les adresses ont un nom, c'est à dire qu'une étiquette leur a été attribuée, celle-ci est indiquée.
     660{{{#!protected ------------------------------------------------------------------------------------
     661''
    662662{{{#!asm
    663663K    12:     <boot>:--------------------------------------------------------------------------------
     
    672672K    39:     <-- WRITE MEMORY @ 0xd0200000 BE=---1 <-- 0x48
    673673}}}
    674 '''''''''''''''''
    675 }}}
    676 - Modifiez le code de `hcpu.S` afin d'afficher le message "Au revoir\n" (''Hommage VGE'') après le message "Hello".\\
     674''
     675}}}
     676- Modifiez le code de `hcpua.S` afin d'afficher le message "Au revoir\n" après le message "Hello".\\
    677677  Vous devez avoir deux messages, et pas seulement étendre le premier.
    678678{{{#!protected ------------------------------------------------------------------------------------
    679 '''''''''''''''
    680 * Il faut dupliquer la boucle d'affichage et le message. Il faut juste faire attention aux labels en en créant des nouveaux.
    681   On ne peut pas utiliser des fonctions parce qu'il n'y a pas encore de pile d'exécution.
    682 '''''''''''''''
     679''
     680* Il faut dupliquer la boucle d'affichage et le message. Il faut juste faire attention aux labels en en créant des nouveaux. On ne peut pas utiliser des fonctions parce qu'il n'y a pas encore de pile d'exécution.
     681''
    683682}}}
    684683