Changes between Version 99 and Version 100 of Archi-1-TP9


Ignore:
Timestamp:
Dec 10, 2020, 11:05:32 PM (4 years ago)
Author:
heydeman
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP9

    v99 v100  
    171171'''''''''''''''
    172172}}}
    173 1. Vous avez utilisé les directives `.text` et `.data` pour définir les sections où placer les instructions et les variables globales, mais il existe la possibilité de demander la création de nouvelles sections dans le code objet produit par le compilateur avec la directive `.section name,"flags"`
    174    - `name` est le nom de la nouvelle section on met souvent un `.name` pour montrer que c'est une section et
    175    - `"flags"` informe du contenu `"ax"` pour des instructions, `"ad"` pour des données (ceux que ça intéresse pourront regarder là [https://frama.link/20UzK0FP])
    176  Écrivez le code assembleur créant la section ".mytext" et suivi de l'addition des registres `$5` et `$6` dans `$4`
     1731. Vous avez utilisé les directives `.text` et `.data` pour définir les sections où placer les instructions et les variables globales, mais il existe la possibilité de demander la création d'une nouvelle section dans le code objet produit par le compilateur avec la directive `.section name,"flags"`
     174   - `name` est le nom de la nouvelle section.  On met souvent un `.name` pour montrer que c'est une section et
     175   - `"flags"` informe du contenu : `"ax"` pour des instructions, `"ad"` pour des données (ceux que ça intéresse pourront regarder là [https://frama.link/20UzK0FP])
     176 Écrivez le code assembleur créant la section `".mytext"` et suivi de l'addition des registres `$5` et `$6` dans `$4`
    177177{{{#!protected ------------------------------------------------------------------------------------
    178178'''''''''''''''
     
    207207'''''''''''''''
    208208}}}
    209 1. En regardant, le dessin de l'espace d'adressage du prototype **almo1**, à quelle adresse devra être initialisé le pointeur de pile pour le kernel. Rappelez pourquoi c'est indispensable de le définir avant d'appeler une fonction C et écrivez le code qui fait l'initialisation, en supposant que l'adresse du pointeur porte le nom `__kdata_end`
     2091. En regardant, le dessin de l'espace d'adressage du prototype **almo1**, à quelle adresse devra être initialisé le pointeur de pile pour le kernel. Rappelez pourquoi c'est indispensable de le définir avant d'appeler une fonction C et écrivez le code qui fait l'initialisation, en supposant que l'adresse du pointeur de pile vaut celle que représente le nom `__kdata_end`
    210210{{{#!protected ------------------------------------------------------------------------------------
    211211'''''''''''''''
     
    229229{{{#!protected ------------------------------------------------------------------------------------
    230230'''''''''''''''
    231 1. Déclarer `static` une variable globale ou une fonction en faisant précéder leur définition du mot clé `static` permets de limiter la visibilité de cette variable ou de cette fonction au seul fichier de déclaration. Notez que par défaut les variables et les fonctions du C ne sont pas `static`, il faut le demander explicitement. C'est exactement l'inverse en assembleur où tous les labels sont static et il faut demander avec `.globl` pour le rendre visible.
    232 1. Déclarer `static` une variable locale permet de la rendre persistante, c'est-à-dire qu'elle conserve sa valeur entre deux appels. Cette variable locale n'est pas dans le contexte de la fonction (celui-ci est dans la pile et il est libéré en sortie de fonction). Une variable locale statique est en fait une variable globale dont l'usage est limité à la seule fonction où elle est définie.
     2311. Déclarer `static` une variable globale ou une fonction en faisant précéder leur définition du mot clé `static` permet de limiter la visibilité de cette variable ou de cette fonction au seul fichier de déclaration. Notez que par défaut les variables et les fonctions du C ne sont pas `static`, il faut le demander explicitement. C'est exactement l'inverse en assembleur où tout label est `static` et il faut demander avec la directive `.globl` de le rendre visible.
     2321. Déclarer `static` une variable locale permet de la rendre persistante, c'est-à-dire qu'elle conserve sa valeur entre deux appels. Cette variable locale n'est pas dans le contexte de la fonction (celui-ci est dans la pile et il est libéré en sortie de fonction). Une variable locale `static` est en fait allouée comme une variable globale mais son usage est limité à la seule fonction où elle est définie.
    233233'''''''''''''''
    234234}}}
     
    237237'''''''''''''''
    238238* Les déclarations `extern` permettent d'informer que le compilateur qu'une variable ou qu'une fonction définie ailleurs existe. Le compilateur est ainsi informé du type de la variable ou du prototype des fonctions, il sait donc comment les utiliser. En C par défaut les variables et les fonctions
    239 * Il n'y a pas de déclaration extern en assembleur par ce n'est pas un langage typé. Pour l'assembleur, un label c'est juste un nombre.
    240 '''''''''''''''
    241 }}}
    242 1. Comment déclarer un tableau de structures en variable globale ? La structure est nommée `test_s` a deux champs `int` nommés `a` et `b`. Le tableau est nommé `tab` a 2 cases.
     239* Il n'y a pas de déclaration `extern` en assembleur par ce n'est pas un langage typé. Pour l'assembleur, un label c'est juste une adresse donc un nombre.
     240'''''''''''''''
     241}}}
     2421. Comment déclarer un tableau de structures en variable globale ? La structure est nommée `test_s`, elle a deux champs `int` nommés `a` et `b`. Le tableau est nommé `tab` a 2 cases.
    243243{{{#!protected ------------------------------------------------------------------------------------
    244244'''''''''''''''
     
    259259'''''''''''''''
    260260}}}
    261 1. Comment définir une macroinstruction du processeur uniquement si elle n'est pas définie ? Écrivez un exemple.
     2611. Comment définir une macro-instruction C uniquement si elle n'est pas déjà définie ? Écrivez un exemple.
    262262{{{#!protected ------------------------------------------------------------------------------------
    263263'''''''''''''''
     
    273273{{{#!protected ------------------------------------------------------------------------------------
    274274'''''''''''''''
    275 * En utilisant ce que nous venons de voir dans la question précédente. Si vous définissez une macro différente au début de chaque fichier `.h` (en utilisant le nom du fichier comme nom de macro pour éviter les collisions  de nom) et que vous nous commencer tester que cette variable n'est pas définie comme condition d'inclusion.
     275* En utilisant ce que nous venons de voir dans la question précédente : il peut définir une macro instruction différente au début de chaque fichier `.h` (en utilisant le nom du fichier comme nom de macro pour éviter les collisions de nom). On peut alors tester l'existence de cette macro comme condition d'inclusion du fichier.
    276276{{{#!c
    277277————————————————————— début du fichier filename.h
     
    311311'''''''''''''''
    312312* `volatile` permet de dire à `gcc` que la variable en mémoire peut changer à tout moment, elle est volatile. Ainsi quand le programme demande de lire une variable `volatile` le compilateur doit toujours aller la lire en mémoire. Il ne doit jamais chercher à optimiser en utilisant un registre afin de réduire le nombre de lecture mémoire (load). De même, quand le programme écrit dans une variable `volatile`, cela doit toujours provoquer une écriture dans la mémoire (store).
    313 * Ainsi, les registres de périphériques doivent toujours être directement lus ou écrits à chaque fois que le programme le demande, parce que c'est justement ces lectures et ces écritures qui commandent le périphérique.
     313* Ainsi, les registres de périphériques doivent toujours être impérativement lus ou écrits à chaque fois que le programme le demande, parce que c'est justement ces lectures et ces écritures qui commandent le périphérique.
    314314'''''''''''''''
    315315}}}
     
    358358}}}
    359359
    360 1. Le fichier commence par la déclaration des variables donnant des informations sur les adresses et les tailles des régions de mémoire. Ces symboles n'ont pas de type et ils sont visibles de tous les programmes c, il faut juste leur donner un type pour le compilateur puisse les exploiter, c'est ce que nous avons fait pour `extern volatile struct tty_s __tty_regs_map[NTTYS]`. En regardant, dans le dessin de la représentation de l'espace d'adressage, complétez les lignes de déclaration des variables pour la région `kdata_region`
     3601. Le fichier commence par la déclaration des variables donnant des informations sur les adresses et les tailles des régions de mémoire. Ces symboles n'ont pas de type et ils sont visibles de tous les programmes C, il faut juste leur donner un type pour que le compilateur puisse les exploiter, c'est ce que nous avons fait pour `extern volatile struct tty_s __tty_regs_map[NTTYS]`. En regardant, dans le dessin de la représentation de l'espace d'adressage, complétez les lignes de déclaration des variables pour la région `kdata_region`
    361361{{{#!protected ------------------------------------------------------------------------------------
    362362'''''''''''''''
     
    367367'''''''''''''''
    368368}}}
    369 1. Le fichier contient ensuite la déclaration des régions qui vont être remplies par les sections trouvées dans les fichiers objets. Complétez les lignes propres à la déclaration de la région `kdata_region`.
     3691. Le fichier contient ensuite la déclaration des régions (dans `MEMORY{...}`) qui vont être remplies par les sections trouvées dans les fichiers objets.  Comment modifiez cette partie (la zone `[... question 2 ...]`) pour ajouter les lignes correspondant à la déclaration de la région `kdata_region` ?
    370370{{{#!protected ------------------------------------------------------------------------------------
    371371'''''''''''''''