Changes between Version 5 and Version 6 of AS6-TME-B1


Ignore:
Timestamp:
Feb 8, 2022, 3:37:59 PM (2 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AS6-TME-B1

    v5 v6  
    930930
    931931
    932 == B1. Premier programme en assembleur dans la seule section de boot
    933 
    934 
    935 
    936 Nous commençons par un petit programme de quelques lignes en assembleur, placé entièrement dans la région mémoire
    937 du boot, qui réalise l'affichage du message "Hello World". C'est un tout tout petit programme, mais pour obtenir
     932== B1. Saut dans la fonction kinit() du noyau en langage C
     933
     934
     935
     936Dans ce premier 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. C'est un tout petit programme, mais pour obtenir
    938937l'exécutable, vous devrez utiliser tous les outils de la chaîne de cross-compilation MIPS et
    939 pour l'exécuter vous devrez exécuter le simulateur du prototype. C'est simple, mais c'est nouveau pour
    940 beaucoup d'entre vous
     938pour l'exécuter vous devrez exécuter le simulateur du prototype.
    941939
    942940**Objectifs**
    943941
    944 - produire un exécutable à partir d'un code en assembleur.
     942- produire un exécutable à partir d'un code en assembleur et en C
    945943- savoir comment afficher un caractère sur un terminal.
    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
    1079945- Savoir comment et où déclarer la pile d'exécution du noyau.
    1080946- Savoir comment afficher un caractère sur un terminal depuis un programme C.
     
    1092958**Questions**
    1093959
     9601. 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}}}
     9701. 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}}}
     9771. À 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}}}
     9861. 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}}}
     9931. 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}}}
     10001. 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}}}
     10061. 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}}}
     10121. 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}}}
     10181. 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}}}
    109410261. Quand faut-il initialiser la pile ? Dans quel fichier est-ce ? Quelle est la valeur du pointeur initial ?
    10951027{{{#!protected ------------------------------------------------------------------------------------
     
    11071039}}}
    11081040
     1041--
    11091042**Exercices**
    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
     1063K    12:     <boot> ------------------------------------------------------- ./hcpua.S
     1064K    12:     0xbfc00000 0x3c1d8040  lui sp,0x8040
     1065K    13:     0xbfc00004 0x27bd0000  addiu   sp,sp,0
     1066K    14:     0xbfc00008 0x3c1a8000  lui k0,0x8000
     1067K    15:     0xbfc0000c 0x275a0000  addiu   k0,k0,0
     1068K    26:     0xbfc00010 0x03400008  jr  k0
     1069K    27:     0xbfc00014 0x00000000  nop
     1070K    37:     <kinit> ------------------------------------------------------ ./kinit.c
     1071K    37:     0x80000000 0x3c028002  lui v0,0x8002
     1072K    38:     0x80000004 0x80430000  lb  v1,0(v0)
     1073K    39:     0x80000008 0x10600008  beqz    v1,8000002c <kinit+0x2c>
     1074K    48:     --> READ  MEMORY @ 0x80020000 BE=---1 --> 0x6c6c6548
     1075}}}
     1076''
     1077}}}
    11111078- Ouvrez les fichiers `kinit.o.s` et `kernel.x.s`, le premier fichier est le désassemblage de `kinit.o` et le second est le désassemblage de `kernel.x`. Dans ces fichiers, vous avez plusieurs sections. Les sections `.MIPS.abiflags`, `.reginfo` et `.pdr` ne nous sont pas utiles (elles servent au chargeur d'application, elles contiennent des informations sur le contenu du fichier et cela ne nous intéresse pas).\\Notez l'adresse de `kinit` dans les deux fichiers, sont-ce les mêmes ? Sont-elles dans les mêmes sections ? Expliquez pourquoi.
    11121079{{{#!protected ------------------------------------------------------------------------------------
     
    11191086'''''''''''''''
    11201087}}}
    1121 - Modifiez le code de `kinit.c`, et comme pour l'étape 1, afficher un second message ?
    1122 {{{#!protected ------------------------------------------------------------------------------------
    1123 '''''''''''''''
    1124 * Hormis, qu'il s'agit de code C, il n'y a pas de différence de principe, c'est toujours du copier-coller, l'important c'est qu'ils ouvrent le code
     1088- Modifiez le code de `kinit.c` et afficher un second message ?
     1089{{{#!protected ------------------------------------------------------------------------------------
     1090'''''''''''''''
     1091* C'est toujours du copier-coller, l'important c'est qu'ils ouvrent le code
    11251092'''''''''''''''
    11261093}}}
    11271094
    11281095
    1129 == B3. Premier petit pilote pour le terminal
     1096== B2. Premier petit pilote pour le terminal
    11301097
    11311098
     
    11451112├── harch.h      : API du code dépendant de l'architecture
    11461113├── hcpu.h       : prototype de la fonction clock()
    1147 ├── hcpu.S       : code dépendant du cpu matériel en assembleur
     1114├── hcpua.S      : code dépendant du cpu matériel en assembleur
    11481115├── kernel.ld    : ldscript décrivant l'espace d'adressage pour l'éditeur de lien
    11491116├── kinit.c      : fichier en C contenant le code de démarrage du noyau, ici c'est la fonction kinit().