Changes between Version 53 and Version 54 of Archi-1-TP9


Ignore:
Timestamp:
Dec 4, 2020, 1:48:47 AM (4 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP9

    v53 v54  
    7373* L'espace d'adressage du MIPS est l'ensemble des adresses que peut former le MIPS.
    7474* Les adresses sont sur 32 bits qui désigne chacune un octet, il y a donc 2^32^ octets.
    75 * On accède à l'espace d'adressage avec les instructions load/store (lw, lh, lb, lhu, lbu, sw, sh, sb).
     75* On accède à l'espace d'adressage avec les instructions load/store (`lw`, `lh`, `lb`, `lhu`, `lbu`, `sw`, `sh`, `sb`).
    7676* Non, les mémoires sont des composants contenant des cases de mémoire adressable. Les mémoires sont placées (on dit aussi « ''mappées'' » dans l'espace d'adressage).
    7777'''''''''''''''
     
    8888'''''''''''''''
    8989* Ici, c'est le composant TTY qui permet de sortir des caractères sur un écran et de lire des caractères depuis un clavier.
    90 * Dans un autre SoC, on pourrait avoir un contrôleur de disque, un contrôleur vidéo, un port réseau ethernet, un port USB, des entrées analogiques (pour mesurer des tensions), etc.
     90* Dans un autre SoC, on pourrait avoir un contrôleur de disque, un contrôleur vidéo, un port réseau Ethernet, un port USB, des entrées analogiques (pour mesurer des tensions), etc.
    9191'''''''''''''''
    9292}}}
     
    9696* Le composant TTY est placé à partir de l'adresse `0xD0200000`.
    9797* Non, ce sont des registres de périphériques placés dans l'espace d'adressage et donc accessibles par des instructions load/store uniquement.
    98 * Pour écrire un caractère sur l'écran, il faut écrire le code ascii du caractère dans le registre `TTY_WRITE`
    99 * `TTY_STATUS` contient 1 s'il y a au moins un caractère en attente d'être lu, `TTY_READ` contient le code ascii du caractère tapé au clavier si `TTY_STATUS==1`
    100 '''''''''''''''
    101 }}}
    102 1. Le contrôleur de TTY
    103 
     98* Pour écrire un caractère sur l'écran, il faut écrire le code ASCII du caractère dans le registre `TTY_WRITE`
     99* `TTY_STATUS` contient 1 s'il y a au moins un caractère en attente d'être lu, `TTY_READ` contient le code ASCII du caractère tapé au clavier si `TTY_STATUS==1`
     100'''''''''''''''
     101}}}
     1021. Le contrôleur de TTY peut contrôler de 1 à 4 terminaux. Chaque terminal dispose d'un ensemble de 4 registres (on appelle ça une carte de registres, ou en anglais une ``register map``). Ces ensembles de 4 registres sont placés à des adresses contiguës. S'il y a 2 terminaux (`TTY0` et `TTY1`), A quelle adresse est le registre `TTY_READ` de `TTY1` ?
     103{{{#!protected ------------------------------------------------------------------------------------
     104'''''''''''''''
     105* Si les adresses utilisées par `TTY0` commencent à `0xD0200000` alors celles de `TTY1` commencent à l'adresse `0xD0200010` et donc `TTY_READ` est à l'adresse `0xD0200018`.
     106'''''''''''''''
     107}}}
     1081. Que représentent les flèches bleues sur le schéma ? Pourquoi ne vont-elles que dans une seule direction ?
     109{{{#!protected ------------------------------------------------------------------------------------
     110'''''''''''''''
     111* Ces flèches représentent les requêtes d'accès à la mémoire, c'est-à-dire les ''loads'' et les ''stores'' qui sont émis par le MIPS lors de l'exécution des instructions `lw`, `sw`, etc. Les requêtes sont émises par le MIPS et reçues par les composants mémoires ou périphériques.
     112* On ne représente pas les données qui circulent, mais juste les requêtes, pour ne pas alourdir inutilement le schéma. Implicitement, si le MIPS envoie une requête de lecture alors il y aura une donnée qui va revenir, c'est obligatoire, alors on ne la dessine pas, car ce n'est pas intéressant. En revanche, le fait que le MIPS soit le seul composant à émettre des requêtes est une information intéressante.
     113'''''''''''''''
     114}}}
    104115
    105116
     
    107118 
    108119
    109 == A3. Chaine de compilation
     120== A3. Chaîne de compilation
    110121
    111122
     
    167178    - la définition de variable du ldscript. Ce sont essentiellement des adresses dans l'espace d'adressage,
    168179      mais pas seulement, il y a aussi la taille des régions.
    169     - On trouve ensuite la déclaration des régions mémoire.
    170     - 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.
     180    - On trouve ensuite la déclaration des régions mémoires.
     181    - 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.
    171182'''''''''''''''
    172183}}}
     
    183194  - L'adresse de démarrage est `0xBFC00000`.
    184195  - On peut le vérifier dans le fichier `kernel.ld`.
    185     Il y a une définition des régions mémoire dont une région commençant à cette adresse là et c'est dans
     196    Il y a une définition des régions mémoires, dont une région commençant à cette adresse-là, et c'est dans
    186197    cette région que l'on met le code de boot.
    187198'''''''''''''''
     
    225236'''''''''''''''
    226237}}}
    227   - Dans quelle région de la mémoire le code de boot est placé ?
    228 {{{#!protected ------------------------------------------------------------------------------------
    229 '''''''''''''''
    230   - Le code de boot est placée dans la région `boot_region`
     238  - Dans quelle région de la mémoire le code de boot est-il placé ?
     239{{{#!protected ------------------------------------------------------------------------------------
     240'''''''''''''''
     241  - Le code de boot est placé dans la région `boot_region`
    231242'''''''''''''''
    232243}}}
     
    243254{{{#!protected ------------------------------------------------------------------------------------
    244255'''''''''''''''
    245   - C'est quand la boucle d'affichage détecte le `0` terminateur de la chaine de caractères.
     256  - C'est quand la boucle d'affichage détecte le `0` terminateur de la chaîne de caractères.
    246257'''''''''''''''
    247258}}}
     
    289300
    290301- **Questions**\\
    291   ''Les réponse sont dans le cours ou dans les fichiers sources''\\\\
     302  ''Les réponses sont dans le cours ou dans les fichiers sources''\\\\
    292303  - Regarder dans le fichier `hcpu.S`, dans quelle section est désormais le code de boot ?
    293304{{{#!protected ------------------------------------------------------------------------------------
     
    297308}}}
    298309  - Le code de boot ne fait que sauter dans la fonction kinit avec l'instruction `j`,
    299     il n'y a pas de retour, ce n'est donc pas un `jal`, mais pourquoi ne pas avoir utiliser
     310    il n'y a pas de retour, ce n'est donc pas un `jal`, mais pourquoi ne pas avoir utilisé
    300311    `j init` et donc pourquoi passer par un registre ?
    301312{{{#!protected ------------------------------------------------------------------------------------
     
    315326'''''''''''''''
    316327  - C'est une manière de désigner toutes les sections nommées `.*data*` avec `*` = n'importe quoi
    317     présentes dans n'importe quel fichier objets reçus par le compilateur.
     328    présentes dans n'importe quel fichier objets reçu par le compilateur.
    318329'''''''''''''''
    319330}}}
     
    374385
    375386- **Questions**\\
    376   ''Les réponse sont dans le cours ou dans les fichiers sources''\\\\
     387  ''Les réponses sont dans le cours ou dans les fichiers sources''\\\\
    377388  - Question ?
    378389{{{#!protected ------------------------------------------------------------------------------------
     
    409420
    410421- **Questions**\\
    411   ''Les réponse sont dans le cours ou dans les fichiers sources''\\\\
     422  ''Les réponses sont dans le cours ou dans les fichiers sources''\\\\
    412423  - Question ?
    413424{{{#!protected ------------------------------------------------------------------------------------
     
    427438
    428439   Dans l'étape 4, nous accédons au registre de périphérique directement dans la fonction `kinit()`, ce n'est pas très
    429    simple. C'est pourquoi, nous allons ajouter un niveau d'abstraction qui représente un début de pilote de périphérique
     440   simple. C'est pourquoi nous allons ajouter un niveau d'abstraction qui représente un début de pilote de périphérique
    430441   (device driver). Ce pilote, même tout petit constitue une couche logicielle avec une API.
    431442   \\\\
    432443   **Objectifs**
    433    - Savoir comment créér uun début de pilote pour le terminal TTY.
     444   - Savoir comment créer un début de pilote pour le terminal TTY.
    434445   - Savoir comment décrire une API en C
    435446
     
    446457   
    447458- **Questions**\\
    448   ''Les réponse sont dans le cours ou dans les fichiers sources''\\\\
     459  ''Les réponses sont dans le cours ou dans les fichiers sources''\\\\
    449460  - Question ?
    450461{{{#!protected ------------------------------------------------------------------------------------