Changes between Version 161 and Version 162 of Archi-1-TP9
- Timestamp:
- Nov 21, 2021, 3:31:25 PM (3 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Archi-1-TP9
v161 v162 551 551 1. Dans quel fichier se trouve la description de l'espace d'adressage du MIPS ? Que trouve-t-on dans ce fichier ? 552 552 {{{#!protected ------------------------------------------------------------------------------------ 553 '' '''''''''''''553 '' 554 554 - C'est dans le fichier kernel.ld. \\On y trouve: 555 555 - la définition de variables du ldscript. Ce sont essentiellement des adresses dans l'espace d'adressage, … … 557 557 - On trouve ensuite la déclaration des régions mémoires. 558 558 - 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 '' 560 560 }}} 561 561 1. Dans quel fichier se trouve le code de boot et pourquoi, selon vous, avoir nommé ce fichier ainsi ? 562 562 {{{#!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 du565 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 '' 567 567 }}} 568 568 1. À quelle adresse démarre le MIPS ? Où peut-on le vérifier ? 569 569 {{{#!protected ------------------------------------------------------------------------------------ 570 '' '''''''''''''570 '' 571 571 - L'adresse de démarrage est `0xBFC00000`. 572 572 - 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 dans573 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 574 574 cette région que l'on met le code de boot. 575 '' '''''''''''''575 '' 576 576 }}} 577 577 1. Que produit `gcc` quand on utilise l'option `-c` ? 578 578 {{{#!protected ------------------------------------------------------------------------------------ 579 '' '''''''''''''579 '' 580 580 - L'option `-c` demande à `gcc` de s'arrêter après avoir produit le fichier objet. 581 581 - Il produit donc un fichier au format `.o` 582 '' '''''''''''''582 '' 583 583 }}} 584 584 1. Que fait l'éditeur de liens ? Comment est-il invoqué ? 585 585 {{{#!protected ------------------------------------------------------------------------------------ 586 '' '''''''''''''586 '' 587 587 - 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`). 588 588 - 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 '' 590 590 }}} 591 591 1. De quels fichiers a besoin l'éditeur de liens pour fonctionner ? 592 592 {{{#!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 '' 596 596 }}} 597 597 1. Dans quelle section se trouve le code de boot pour le compilateur ? ''(la réponse est dans le code assembleur)'' 598 598 {{{#!protected ------------------------------------------------------------------------------------ 599 '' '''''''''''''599 '' 600 600 - Le code de boot a été mis dans une section `.text`. 601 '' '''''''''''''602 }}} 603 1. Dans quelle section se trouve le message hellopour le compilateur ? Ce choix est particulier, mais ce message est en lecture seule.604 {{{#!protected ------------------------------------------------------------------------------------ 605 '' '''''''''''''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 '' 606 606 - 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 }}} 609 1. Dans quelle section se trouve le code de boot dans le code exécutable ? (la réponse est dans `hcpua.S`) 610 {{{#!protected ------------------------------------------------------------------------------------ 611 '' 612 612 - 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 }}} 615 1. 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 '' 618 618 - 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 }}} 621 1. 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 '' 624 624 - Le fichier `kernel.ld` déclare une variable `__tty_regs_map` initialisée avec l'adresse de 625 625 où sont placés les registres de contrôles du `TTY`. Le premier registre à l'adresse `__tty_regs_map` 626 626 est l'adresse du registre de sortie `TTY_WRITE`. 627 '' '''''''''''''627 '' 628 628 }}} 629 629 1. 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 '' 633 633 - 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 }}} 636 1. 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 '' 639 639 - If faut arrêter le programme, car il n'y a plus de code, mais on ne sait pas arrêter le processeur, 640 640 alors on le faire tourner en rond. 641 '' '''''''''''''641 '' 642 642 }}} 643 643 … … 646 646 - Exécutez le programme en lançant le simulateur avec `make exec`, qu'observez-vous ? 647 647 {{{#!protected ------------------------------------------------------------------------------------ 648 '' '''''''''''''648 '' 649 649 - 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 cycles658 - 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 '' 662 662 {{{#!asm 663 663 K 12: <boot>:-------------------------------------------------------------------------------- … … 672 672 K 39: <-- WRITE MEMORY @ 0xd0200000 BE=---1 <-- 0x48 673 673 }}} 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".\\ 677 677 Vous devez avoir deux messages, et pas seulement étendre le premier. 678 678 {{{#!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 '' 683 682 }}} 684 683