Changes between Version 30 and Version 31 of Archi-1-TP9


Ignore:
Timestamp:
Nov 16, 2020, 8:11:58 AM (4 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP9

    v30 v31  
    99
    1010
     11
    1112= Présentation des étapes
    1213
     
    1516La séance est découpé en 5 étapes. Dans cette présentation, pour chaque étape, nous donnons une brève description, suivie d'une liste des objectifs principaux et d'une liste des fichiers présents. Un bref commentaire est ajouté pour les fichiers.
    1617
    17  [wiki:AS5-TME9#a1.Premierprogrammeenassembleurdanslaseulesectiondeboot 1. hello_boot]:: \\
    18  
    19    Nous commençons par un petit programme de quelques lignes en assembleur, placé entièrement dans la région mémoire
    20    du boot, qui réalise l'affichage du message "Hello World". C'est un tout tout petit programme, mais pour obtenir
    21    l'exécutable, vous devrez utiliser tous les outils de la chaîne de cross-compilation MIPS et
    22    pour l'exécuter vous devrez exécuter le simulateur du prototype. C'est simple, mais c'est nouveau pour
    23    beaucoup d'entre vous.
    24    \\\\
    25  **Objectifs**
     18
     19
     20= 1. Premier programme en assembleur dans la seule section de boot**=
     21
     22 Nous commençons par un petit programme de quelques lignes en assembleur, placé entièrement dans la région mémoire
     23 du boot, qui réalise l'affichage du message "Hello World". C'est un tout tout petit programme, mais pour obtenir
     24 l'exécutable, vous devrez utiliser tous les outils de la chaîne de cross-compilation MIPS et
     25 pour l'exécuter vous devrez exécuter le simulateur du prototype. C'est simple, mais c'est nouveau pour
     26 beaucoup d'entre vous.
     27
     28
     29
     30- **Objectifs**\\\\
    2631   - Savoir produire un exécutable à partir d'un code en assembleur.
    2732   - Savoir comment afficher un caractère sur un terminal.
    28  
    29  **Fichiers**
     33
     34
     35
     36- **Fichiers**
    3037{{{
    31381_hello_boot
     
    3643
    3744
    38  [wiki:AS5-TME9#a2.Sautdanslecodedunoyauenassembleur 2. kinit_asm]:: \\
    39     Dans le deuxième programme, nous restons en assembleur, mais nous avons deux fichiers source : (1) le fichier contenant
    40    le code de boot et (2) le fichier contenant le code du noyau. Ici, le code du noyau c'est juste une ''fonction'' `kinit()`. Ce n'est pas vraiment une fonction car on n'utilise pas la pile.
    41    \\\\
    42    **Objectifs**
    43    - Savoir comment le programme de boot fait pour sauter à l'adresse de la routine kinit.
    44    - Savoir un fichier kernel.ld un peu plus complet.
    45  
    46  **Fichiers**
    47 {{{
    48 2_init_asm/
    49 ├── hcpu.S       : code dépendant du cpu matériel en assembleur
    50 ├── kernel.ld    : ldscript décrivant l'espace d'adressage pour l'éditeur de lien
    51 ├── kinit.S      : fichier contenant le code de démarrage du noyau, ici c'est une routine kinit.
    52 └── Makefile     : description des actions possibles sur le code : compilation, exécution, nettoyage, etc.
    53 }}}
    54 
    55 
    56  [wiki:AS5-TME9#a3.SautdanslafonctionkinitdunoyauenlangageC 3. kinit_c]:: \\
    57    Dans ce troisième programme, nous faisons la même chose que pour le deuxième mais `kinit()` est désormais écrit en
    58    langage C. Cela change peu de choses, sauf une chose importante `kinit()` est une fonction et donc il faut absolument
    59    une pile d'exécution.
    60    \\\\
    61    **Objectifs**
    62    - Savoir comment et où déclarer la pile d'exécution du noyau.
    63    - Savoir comment afficher un caractère sur un terminal depuis un programme C.
    64  
    65  **Fichiers**
    66 {{{
    67 3_init_c/
    68 ├── hcpu.S       : code dépendant du cpu matériel en assembleur
    69 ├── kernel.ld    : ldscript décrivant l'espace d'adressage pour l'éditeur de lien
    70 ├── kinit.c      : fichier en C contenant le code de démarrage du noyau, ici c'est la fonction kinit().
    71 └── Makefile     : description des actions possibles sur le code : compilation, exécution, nettoyage, etc.
    72 }}}
    73 
    74  [wiki:AS5-TME9#a4.Acc%C3%A8sauxregistresdecontr%C3%B4ledesterminauxTTY 4. nttys]:: \\
    75    Le prototype de SoC que nous utilisons pour les TP est configurable. Il est possible par exemple de choisir le nombre
    76    terminaux texte (TTY). Par défaut, il y en a un mais, nous pouvons en avoir jusqu'à 4. Nous allons modifier le code du
    77    noyau pour s'adapter à cette variabilité. En outre, pour le moment, nous ne faisions qu'écrire sur le terminal,
    78    maintenant, nous allons aussi lire le clavier.
    79    \\\\
    80    **Objectifs**
    81    - Savoir comment compiler un programme C avec du code conditionnel.
    82    - Savoir comment décrire en C l'ensemble des registres d'un contrôleur de périphérique et y accéder.
    83  
    84  **Fichiers**
    85 {{{
    86 4_nttys/
    87 ├── hcpu.S       : code dépendant du cpu matériel en assembleur
    88 ├── kernel.ld    : ldscript décrivant l'espace d'adressage pour l'éditeur de lien
    89 ├── kinit.c      : fichier en C contenant le code de démarrage du noyau, ici c'est la fonction kinit().
    90 └── Makefile     : description des actions possibles sur le code : compilation, exécution, nettoyage, etc.
    91 }}}
    92 
    93  [wiki:AS5-TME9#a5.Premierpetitpilotepourleterminal 5. driver]::
    94    Dans l'étape 4, nous accédons au registre de périphérique directement dans la fonction `kinit()`, ce n'est pas très
    95    simple. C'est pourquoi, nous allons ajouter un niveau d'abstraction qui représente un début de pilote de périphérique
    96    (device driver). Ce pilote, même tout petit constitue une couche logicielle avec une API.
    97    \\\\
    98    **Objectifs**
    99    - Savoir comment créér uun début de pilote pour le terminal TTY.
    100    - Savoir comment décrire une API en C
    101 
    102  **Fichiers**
    103 {{{
    104 5_driver/
    105 ├── harch.c      : code dépendant de l'architecture du SoC, pour le moment c'est juste le pilote du TTY
    106 ├── harch.h      : API du code dépendant de l'architecture
    107 ├── hcpu.S       : code dépendant du cpu matériel en assembleur
    108 ├── kernel.ld    : ldscript décrivant l'espace d'adressage pour l'éditeur de lien
    109 ├── kinit.c      : fichier en C contenant le code de démarrage du noyau, ici c'est la fonction kinit().
    110 └── Makefile     : description des actions possibles sur le code : compilation, exécution, nettoyage, etc.
    111 }}}
    112    
    113 
    114 
    115 =  Premier programme en assembleur dans la seule section de boot
    116 
    117 
    118 - Dans quel fichier se trouve la description de l'espace d'adressage du MIPS ? Que trouve-t-on dans ce fichier ?
    119   (''(la réponse est dans le cours et dans le fichier'')
     45
     46- **Questions**\\\\
     47  - Dans quel fichier se trouve la description de l'espace d'adressage du MIPS ? Que trouve-t-on dans ce fichier ? (''la réponse est dans le cours et dans le fichier'')
    12048{{{#!protected
    12149''
     
    12654- On trouve ensuite la déclaration des régions mémoire.
    12755- et enfin la définition des sections de sortie qui seront mise dans le fichier binaire produit et dans quelle région elle sont placées.
    128 ''
    129 }}}
    130 - Dans quel fichier se trouve le code de boot et pourquoi l'avoir nommé ainsi ?
    131  (''la réponse est dans le fichier'')
     56
     57
     58
     59''
     60}}}
     61  - Dans quel fichier se trouve le code de boot et pourquoi l'avoir nommé ainsi ? (''la réponse est dans le fichier'')
    13262{{{#!protected
    13363''
    13464Le 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
    13565hardware et qu'il concerne le cpu.
    136 ''
    137 }}}
    138 - A quelle adresse démarre le MIPS ? Où peut-on le vérifier ?
     66
     67
     68
     69''
     70}}}
     71  - A quelle adresse démarre le MIPS ? Où peut-on le vérifier ?
    13972{{{#!protected
    14073''
    14174L'adresse de démarrage est `0xBFC00000`. On peut le vérifier dans le fichier `kernel.ld`. Il y a une définition des
    14275régions mémoire avec une région commençant à cette adresse et c'est dans cette région que l'on met le code de boot.
    143 ''
    144 }}}
    145 - Que produit le compilateur C quand on utilise l'option -c ?
    146 {{{#!protected
    147 
    148 }}}
    149 - Que fait l'éditeur de liens ?
    150 {{{#!protected
    151 
    152 }}}
    153 - De quels fichiers a besoin l'éditeur de liens pour fonctionner ?
    154 {{{#!protected
    155 
    156 }}}
    157 - Dans quelle section se trouve le code de boot pour le compilateur ?
    158 {{{#!protected
    159 
    160 }}}
    161 - Dans quelle section se trouve le message hello pour le compilateur ?
    162 {{{#!protected
    163 
    164 }}}
    165 - Dans quelle section se trouve le code de boot dans le code exécutable ?
    166 {{{#!protected
    167 
    168 }}}
    169 - Dans quelle région de la mémoire le code de boot est placé ?
    170 {{{#!protected
    171 
    172 }}}
    173 - Comment connaît-on l'adresse du registre de sortie du contrôleur de terminal TTY ?
    174 {{{#!protected
    175 
    176 }}}
    177 - Comment sait-on que le message est fini et que le programme doit s'arrêter ?
    178 {{{#!protected
    179 
    180 }}}
    181 - Pourquoi terminer le programme par un `dead: j dead` ?
     76
     77
     78
     79''
     80}}}
     81  - Que produit le compilateur C quand on utilise l'option -c ?
     82{{{#!protected
     83
     84
     85
     86
     87}}}
     88  - Que fait l'éditeur de liens ?
     89{{{#!protected
     90
     91
     92
     93
     94}}}
     95  - De quels fichiers a besoin l'éditeur de liens pour fonctionner ?
     96{{{#!protected
     97
     98}}}
     99  - Dans quelle section se trouve le code de boot pour le compilateur ?
     100{{{#!protected
     101
     102}}}
     103  - Dans quelle section se trouve le message hello pour le compilateur ?
     104{{{#!protected
     105
     106}}}
     107  - Dans quelle section se trouve le code de boot dans le code exécutable ?
     108{{{#!protected
     109
     110}}}
     111  - Dans quelle région de la mémoire le code de boot est placé ?
     112{{{#!protected
     113
     114}}}
     115  - Comment connaît-on l'adresse du registre de sortie du contrôleur de terminal TTY ?
     116{{{#!protected
     117
     118}}}
     119  - Comment sait-on que le message est fini et que le programme doit s'arrêter ?
     120{{{#!protected
     121
     122}}}
     123  - Pourquoi terminer le programme par un `dead: j dead` ?
    182124{{{#!protected
    183125
     
    192134
    193135
     136   Dans le deuxième programme, nous restons en assembleur, mais nous avons deux fichiers source : (1) le fichier contenant
     137   le code de boot et (2) le fichier contenant le code du noyau. Ici, le code du noyau c'est juste une ''fonction'' `kinit()`. Ce n'est pas vraiment une fonction car on n'utilise pas la pile.
     138   \\\\
     139   **Objectifs**
     140   - Savoir comment le programme de boot fait pour sauter à l'adresse de la routine kinit.
     141   - Savoir un fichier kernel.ld un peu plus complet.
     142 
     143 **Fichiers**
     144{{{
     1452_init_asm/
     146├── hcpu.S       : code dépendant du cpu matériel en assembleur
     147├── kernel.ld    : ldscript décrivant l'espace d'adressage pour l'éditeur de lien
     148├── kinit.S      : fichier contenant le code de démarrage du noyau, ici c'est une routine kinit.
     149└── Makefile     : description des actions possibles sur le code : compilation, exécution, nettoyage, etc.
     150}}}
     151
     152
     153
     154
     155
     156
     157
     158
     159 [wiki:AS5-TME9#a3.SautdanslafonctionkinitdunoyauenlangageC 3. kinit_c]:: \\
     160   Dans ce troisième programme, nous faisons la même chose que pour le deuxième mais `kinit()` est désormais écrit en
     161   langage C. Cela change peu de choses, sauf une chose importante `kinit()` est une fonction et donc il faut absolument
     162   une pile d'exécution.
     163   \\\\
     164   **Objectifs**
     165   - Savoir comment et où déclarer la pile d'exécution du noyau.
     166   - Savoir comment afficher un caractère sur un terminal depuis un programme C.
     167 
     168 **Fichiers**
     169{{{
     1703_init_c/
     171├── hcpu.S       : code dépendant du cpu matériel en assembleur
     172├── kernel.ld    : ldscript décrivant l'espace d'adressage pour l'éditeur de lien
     173├── kinit.c      : fichier en C contenant le code de démarrage du noyau, ici c'est la fonction kinit().
     174└── Makefile     : description des actions possibles sur le code : compilation, exécution, nettoyage, etc.
     175}}}
     176
     177
     178
     179
     180= 4.  Accès aux registres de contrôle des terminaux TTY
     181
     182
     183
     184
     185   Le prototype de SoC que nous utilisons pour les TP est configurable. Il est possible par exemple de choisir le nombre
     186   terminaux texte (TTY). Par défaut, il y en a un mais, nous pouvons en avoir jusqu'à 4. Nous allons modifier le code du
     187   noyau pour s'adapter à cette variabilité. En outre, pour le moment, nous ne faisions qu'écrire sur le terminal,
     188   maintenant, nous allons aussi lire le clavier.
     189   \\\\
     190   **Objectifs**
     191   - Savoir comment compiler un programme C avec du code conditionnel.
     192   - Savoir comment décrire en C l'ensemble des registres d'un contrôleur de périphérique et y accéder.
     193 
     194 **Fichiers**
     195{{{
     1964_nttys/
     197├── hcpu.S       : code dépendant du cpu matériel en assembleur
     198├── kernel.ld    : ldscript décrivant l'espace d'adressage pour l'éditeur de lien
     199├── kinit.c      : fichier en C contenant le code de démarrage du noyau, ici c'est la fonction kinit().
     200└── Makefile     : description des actions possibles sur le code : compilation, exécution, nettoyage, etc.
     201}}}
     202
     203
     204
     205
     206
     207= 5. Premier petit pilote pour le terminal
     208
     209
     210
     211
     212   Dans l'étape 4, nous accédons au registre de périphérique directement dans la fonction `kinit()`, ce n'est pas très
     213   simple. C'est pourquoi, nous allons ajouter un niveau d'abstraction qui représente un début de pilote de périphérique
     214   (device driver). Ce pilote, même tout petit constitue une couche logicielle avec une API.
     215   \\\\
     216   **Objectifs**
     217   - Savoir comment créér uun début de pilote pour le terminal TTY.
     218   - Savoir comment décrire une API en C
     219
     220 **Fichiers**
     221{{{
     2225_driver/
     223├── harch.c      : code dépendant de l'architecture du SoC, pour le moment c'est juste le pilote du TTY
     224├── harch.h      : API du code dépendant de l'architecture
     225├── hcpu.S       : code dépendant du cpu matériel en assembleur
     226├── kernel.ld    : ldscript décrivant l'espace d'adressage pour l'éditeur de lien
     227├── kinit.c      : fichier en C contenant le code de démarrage du noyau, ici c'est la fonction kinit().
     228└── Makefile     : description des actions possibles sur le code : compilation, exécution, nettoyage, etc.
     229}}}
     230   
     231
     232
     233
     234=
     235
     236
     237
     238
    194239- Quel est le nom de la directive assembleur permettant de déclarer une section
    195240
     
    208253
    209254
    210 = 4.  Accès aux registres de contrôle des terminaux TTY
    211255
    212256
     
    220264
    221265
    222 = 5. Premier petit pilote pour le terminal
     266
    223267
    224268