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. |