946 | | - analyse d'une trace d'exécution |
947 | | |
948 | | **Fichiers** |
949 | | |
950 | | {{{ |
951 | | 1_hello_boot |
952 | | ├── hcpu.S : code dépendant du cpu matériel en assembleur |
953 | | ├── kernel.ld : ldscript décrivant l'espace d'adressage pour l'éditeur de lien |
954 | | └── Makefile : description des actions possibles sur le code : compilation, exécution, nettoyage, etc. |
955 | | }}} |
956 | | |
957 | | |
958 | | |
959 | | **Questions** |
960 | | |
961 | | |
962 | | 1. Dans quel fichier se trouve la description de l'espace d'adressage du MIPS ? Que trouve-t-on dans ce fichier ? |
963 | | {{{#!protected ------------------------------------------------------------------------------------ |
964 | | ''''''''''''''' |
965 | | - C'est dans le fichier kernel.ld. \\On y trouve: |
966 | | - la définition de variables du ldscript. Ce sont essentiellement des adresses dans l'espace d'adressage, |
967 | | mais pas seulement, il y a aussi la taille des régions. |
968 | | - On trouve ensuite la déclaration des régions mémoires. |
969 | | - 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. |
970 | | ''''''''''''''' |
971 | | }}} |
972 | | 1. Dans quel fichier se trouve le code de boot et pourquoi, selon vous, avoir nommé ce fichier ainsi ? |
973 | | {{{#!protected ------------------------------------------------------------------------------------ |
974 | | ''''''''''''''' |
975 | | - 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 |
976 | | hardware et qu'il concerne le cpu. |
977 | | ''''''''''''''' |
978 | | }}} |
979 | | 1. À quelle adresse démarre le MIPS ? Où peut-on le vérifier ? |
980 | | {{{#!protected ------------------------------------------------------------------------------------ |
981 | | ''''''''''''''' |
982 | | - L'adresse de démarrage est `0xBFC00000`. |
983 | | - On peut le vérifier dans le fichier `kernel.ld`. |
984 | | Il y a une définition des régions mémoires, dont une région commençant à cette adresse-là, et c'est dans |
985 | | cette région que l'on met le code de boot. |
986 | | ''''''''''''''' |
987 | | }}} |
988 | | 1. Que produit `gcc` quand on utilise l'option `-c` ? |
989 | | {{{#!protected ------------------------------------------------------------------------------------ |
990 | | ''''''''''''''' |
991 | | - L'option `-c` demande à `gcc` de s'arrêter après avoir produit le fichier objet. |
992 | | - Il produit donc un fichier au format `.o` |
993 | | ''''''''''''''' |
994 | | }}} |
995 | | 1. Que fait l'éditeur de liens ? Comment est-il invoqué ? |
996 | | {{{#!protected ------------------------------------------------------------------------------------ |
997 | | ''''''''''''''' |
998 | | - 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`). |
999 | | - L'éditeur de liens est appelé par `gcc` si on n'a pas l'option `-c`ou directement par `ld` (ici `mipsel_unknown_ld`) |
1000 | | ''''''''''''''' |
1001 | | }}} |
1002 | | 1. De quels fichiers a besoin l'éditeur de liens pour fonctionner ? |
1003 | | {{{#!protected ------------------------------------------------------------------------------------ |
1004 | | ''''''''''''''' |
1005 | | - L'éditeur de liens a besoin des fichiers objets `.o` et du fichier ldscript (ici, `kernel.ld`) |
1006 | | ''''''''''''''' |
1007 | | }}} |
1008 | | 1. Dans quelle section se trouve le code de boot pour le compilateur ? ''(la réponse est dans le code assembleur)'' |
1009 | | {{{#!protected ------------------------------------------------------------------------------------ |
1010 | | ''''''''''''''' |
1011 | | - Le code de boot a été mis dans une section `.text`. |
1012 | | ''''''''''''''' |
1013 | | }}} |
1014 | | 1. Dans quelle section se trouve le message hello pour le compilateur ? Ce choix est particulier, mais ce message est en lecture seule. |
1015 | | {{{#!protected ------------------------------------------------------------------------------------ |
1016 | | ''''''''''''''' |
1017 | | - Le message est aussi la section `.text`. |
1018 | | ''''''''''''''' |
1019 | | }}} |
1020 | | 1. Dans quelle section se trouve le code de boot dans le code exécutable ? |
1021 | | {{{#!protected ------------------------------------------------------------------------------------ |
1022 | | ''''''''''''''' |
1023 | | - Dans le programme exécutable, le code de boot est mis dans la section `.boot`. |
1024 | | ''''''''''''''' |
1025 | | }}} |
1026 | | 1. Dans quelle région de la mémoire le code de boot est-il placé ? |
1027 | | {{{#!protected ------------------------------------------------------------------------------------ |
1028 | | ''''''''''''''' |
1029 | | - Le code de boot est placé dans la région `boot_region` |
1030 | | ''''''''''''''' |
1031 | | }}} |
1032 | | 1. Comment connaît-on l'adresse du registre de sortie du contrôleur de terminal `TTY` ? |
1033 | | {{{#!protected ------------------------------------------------------------------------------------ |
1034 | | ''''''''''''''' |
1035 | | - Le fichier `kernel.ld` déclare une variable `__tty_regs_map` initialisée avec l'adresse de |
1036 | | où sont placés les registres de contrôles du `TTY`. Le premier registre à l'adresse `__tty_regs_map` |
1037 | | est l'adresse du registre de sortie `TTY_WRITE`. |
1038 | | ''''''''''''''' |
1039 | | }}} |
1040 | | 1. Le code de boot se contente d'afficher un message, comment sait-on que le message est fini |
1041 | | et que le programme doit s'arrêter ? |
1042 | | {{{#!protected ------------------------------------------------------------------------------------ |
1043 | | ''''''''''''''' |
1044 | | - C'est quand la boucle d'affichage détecte le `0` terminateur de la chaîne de caractères. |
1045 | | ''''''''''''''' |
1046 | | }}} |
1047 | | 1. Pourquoi terminer le programme par un `dead: j dead` ? |
1048 | | {{{#!protected ------------------------------------------------------------------------------------ |
1049 | | ''''''''''''''' |
1050 | | - If faut arrêter le programme, car il n'y a plus de code, mais on ne sait pas arrêter le processeur, |
1051 | | alors on le faire tourner en rond. |
1052 | | ''''''''''''''' |
1053 | | }}} |
1054 | | |
1055 | | **Exercices** |
1056 | | |
1057 | | - Exécutez le programme en lançant le simulateur avec `make exec`, qu'observez-vous ? |
1058 | | - Exécutez le programme en lançant le simulateur avec `make debug`.\\Cela exécute le programme pour une courte durée et cela produit un fichier `debug.log` contenant des informations par cycle.\\Ce fichier n'est pas exploitable directement par vous, il est nécessaire pour la génération de la trace d'exécution à l'étape suivante. |
1059 | | - Exécutez alors la génération de la trace d'exécution avec `make trace`.\\Cela génère le fichier `trace.log.s` à partir du de l'exécutable désassemblé et du fichier debug.log. Que voyez-vous dans `trace.log.s` ? |
1060 | | - Modifiez le code de `hcpu.S` afin d'afficher le message "Au revoir\n" (''Hommage VGE'') après le message "Hello".\\ |
1061 | | Vous devez avoir deux messages, et pas seulement étendre le premier. |
1062 | | {{{#!protected ------------------------------------------------------------------------------------ |
1063 | | ''''''''''''''' |
1064 | | * Ils doivent dupliquer la boucle d'affichage et le message. Il faut juste faire attention aux labels en en créant des nouveaux. |
1065 | | Ils ne peuvent pas utiliser des fonctions parce qu'ils n'ont pas de pile. |
1066 | | ''''''''''''''' |
1067 | | }}} |
1068 | | |
1069 | | |
1070 | | |
1071 | | == B2. Saut dans la fonction kinit() du noyau en langage C |
1072 | | |
1073 | | |
1074 | | |
1075 | | Dans ce second programme, le code de boot entre dans le noyau par la fonction C `kinit()`, c'est une fonction et donc il faut absolument une pile d'exécution. |
1076 | | |
1077 | | **Objectifs** |
1078 | | |
| 944 | - savoir analyser une trace d'exécution |
| 960 | 1. Dans quel fichier se trouve la description de l'espace d'adressage du MIPS ? Que trouve-t-on dans ce fichier ? |
| 961 | {{{#!protected ------------------------------------------------------------------------------------ |
| 962 | ''''''''''''''' |
| 963 | - C'est dans le fichier kernel.ld. \\On y trouve: |
| 964 | - la définition de variables du ldscript. Ce sont essentiellement des adresses dans l'espace d'adressage, |
| 965 | mais pas seulement, il y a aussi la taille des régions. |
| 966 | - On trouve ensuite la déclaration des régions mémoires. |
| 967 | - 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. |
| 968 | ''''''''''''''' |
| 969 | }}} |
| 970 | 1. Dans quel fichier se trouve le code de boot et pourquoi, selon vous, avoir nommé ce fichier ainsi ? |
| 971 | {{{#!protected ------------------------------------------------------------------------------------ |
| 972 | ''''''''''''''' |
| 973 | - 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 |
| 974 | hardware et qu'il concerne le cpu. |
| 975 | ''''''''''''''' |
| 976 | }}} |
| 977 | 1. À quelle adresse démarre le MIPS ? Où peut-on le vérifier ? |
| 978 | {{{#!protected ------------------------------------------------------------------------------------ |
| 979 | ''''''''''''''' |
| 980 | - L'adresse de démarrage est `0xBFC00000`. |
| 981 | - On peut le vérifier dans le fichier `kernel.ld`. |
| 982 | Il y a une définition des régions mémoires, dont une région commençant à cette adresse-là, et c'est dans |
| 983 | cette région que l'on met le code de boot. |
| 984 | ''''''''''''''' |
| 985 | }}} |
| 986 | 1. Que produit `gcc` quand on utilise l'option `-c` ? |
| 987 | {{{#!protected ------------------------------------------------------------------------------------ |
| 988 | ''''''''''''''' |
| 989 | - L'option `-c` demande à `gcc` de s'arrêter après avoir produit le fichier objet. |
| 990 | - Il produit donc un fichier au format `.o` |
| 991 | ''''''''''''''' |
| 992 | }}} |
| 993 | 1. Que fait l'éditeur de liens ? Comment est-il invoqué ? |
| 994 | {{{#!protected ------------------------------------------------------------------------------------ |
| 995 | ''''''''''''''' |
| 996 | - 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`). |
| 997 | - L'éditeur de liens est appelé par `gcc` si on n'a pas l'option `-c`ou directement par `ld` (ici `mipsel_unknown_ld`) |
| 998 | ''''''''''''''' |
| 999 | }}} |
| 1000 | 1. De quels fichiers a besoin l'éditeur de liens pour fonctionner ? |
| 1001 | {{{#!protected ------------------------------------------------------------------------------------ |
| 1002 | ''''''''''''''' |
| 1003 | - L'éditeur de liens a besoin des fichiers objets `.o` et du fichier ldscript (ici, `kernel.ld`) |
| 1004 | ''''''''''''''' |
| 1005 | }}} |
| 1006 | 1. Dans quelle section se trouve le code de boot ? ''(la réponse est dans le code assembleur)'' |
| 1007 | {{{#!protected ------------------------------------------------------------------------------------ |
| 1008 | ''''''''''''''' |
| 1009 | - Le code de boot a été mis dans une section `.boot`. |
| 1010 | ''''''''''''''' |
| 1011 | }}} |
| 1012 | 1. Dans quelle région de la mémoire le code de boot est-il placé ? ''(la réponse est dans `kernel.ld`)'' |
| 1013 | {{{#!protected ------------------------------------------------------------------------------------ |
| 1014 | ''''''''''''''' |
| 1015 | - Le code de boot est placé dans la région `boot_region` |
| 1016 | ''''''''''''''' |
| 1017 | }}} |
| 1018 | 1. Comment connaît-on l'adresse du registre de sortie du contrôleur de terminal `TTY` ? |
| 1019 | {{{#!protected ------------------------------------------------------------------------------------ |
| 1020 | ''''''''''''''' |
| 1021 | - Le fichier `kernel.ld` déclare une variable `__tty_regs_map` initialisée avec l'adresse de |
| 1022 | où sont placés les registres de contrôles du `TTY`. Le premier registre à l'adresse `__tty_regs_map` |
| 1023 | est l'adresse du registre de sortie `TTY_WRITE`. |
| 1024 | ''''''''''''''' |
| 1025 | }}} |
1110 | | |
| 1043 | |
| 1044 | - Exécutez le programme en lançant le simulateur avec `make exec`, qu'observez-vous ? |
| 1045 | {{{#!protected ------------------------------------------------------------------------------------ |
| 1046 | '' |
| 1047 | - 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. |
| 1048 | '' |
| 1049 | }}} |
| 1050 | - Exécutez le programme en lançant le simulateur avec `make debug`.\\Cela exécute le programme pour une courte durée et cela produit deux fichiers `trace0.s` et `label0.s`.\\`trace0.s` contient la trace des instructions assembleur exécutées par le processeur. \\Ouvrez `trace.0.s` et repérez ce qui est cité ici |
| 1051 | - On voit la séquence des instructions exécutées |
| 1052 | - La première colonne nous informe que les adresses lues sont dans l'espace Kernel |
| 1053 | - La seconde colonne sont les numéros de cycles |
| 1054 | - La troisième sont les adresses |
| 1055 | - La quatrième le code binaire des instructions |
| 1056 | - Le reste de la ligne contient l'instruction désassemblée |
| 1057 | - Lorsque les adresses ont un nom, c'est à dire qu'une étiquette leur a été attribuée, celle-ci est indiquée. |
| 1058 | |
| 1059 | `label0.s` contient la séquence des appels de fonctions de l'exécutions. C'est en fait un extrait de la trace.\\Ouvrez le fichier `label0.s` et interprétez ce que vous voyez. |
| 1060 | {{{#!protected ------------------------------------------------------------------------------------ |
| 1061 | '' |
| 1062 | {{{#!asm |
| 1063 | K 12: <boot> ------------------------------------------------------- ./hcpua.S |
| 1064 | K 12: 0xbfc00000 0x3c1d8040 lui sp,0x8040 |
| 1065 | K 13: 0xbfc00004 0x27bd0000 addiu sp,sp,0 |
| 1066 | K 14: 0xbfc00008 0x3c1a8000 lui k0,0x8000 |
| 1067 | K 15: 0xbfc0000c 0x275a0000 addiu k0,k0,0 |
| 1068 | K 26: 0xbfc00010 0x03400008 jr k0 |
| 1069 | K 27: 0xbfc00014 0x00000000 nop |
| 1070 | K 37: <kinit> ------------------------------------------------------ ./kinit.c |
| 1071 | K 37: 0x80000000 0x3c028002 lui v0,0x8002 |
| 1072 | K 38: 0x80000004 0x80430000 lb v1,0(v0) |
| 1073 | K 39: 0x80000008 0x10600008 beqz v1,8000002c <kinit+0x2c> |
| 1074 | K 48: --> READ MEMORY @ 0x80020000 BE=---1 --> 0x6c6c6548 |
| 1075 | }}} |
| 1076 | '' |
| 1077 | }}} |