| 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** |
| | 443 | 1. 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 | }}} |
| | 450 | 1. 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 | }}} |
| | 456 | 1. à 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 | |
| | 474 | Nous commençons par un petit programme de quelques lignes en assembleur, placé entièrement dans la région mémoire |
| | 475 | du boot, qui réalise l'affichage du message "Hello World". C'est un tout tout petit programme, mais pour obtenir |
| | 476 | l'exécutable, vous devrez utiliser tous les outils de la chaîne de cross-compilation MIPS et |
| | 477 | pour l'exécuter vous devrez exécuter le simulateur du prototype. C'est simple, mais c'est nouveau pour |
| | 478 | beaucoup 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 | |
| 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 | |
| | 502 | 1. 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 | }}} |
| | 512 | 1. Dans quel fichier se trouve le code de boot et pourquoi, selon vous, avoir nommé ce fichier ainsi ? |
| 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. |
| | 519 | 1. 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 | }}} |
| | 528 | 1. 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 | }}} |
| | 535 | 1. 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 | }}} |
| | 542 | 1. De quels fichiers a besoin l'éditeur de liens pour fonctionner ? |
| | 543 | {{{#!protected ------------------------------------------------------------------------------------ |
| | 544 | ''''''''''''''' |
| | 545 | 1. L'éditeur de liens a besoin des fichiers objets `.o` et du fichier ldscript (ici, `kernel.ld`) |
| | 546 | ''''''''''''''' |
| | 547 | }}} |
| | 548 | 1. 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 | }}} |
| | 554 | 1. 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 | }}} |
| | 560 | 1. 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 | }}} |
| | 566 | 1. 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 | }}} |
| | 572 | 1. 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 | }}} |
| | 580 | 1. 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 | }}} |
| | 587 | 1. 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. |