190 | | 1. Comme nous l'avons vu dans la précédente séance, c'est grâce au fichier ldscript (`kernel.ld` et plus tard `user.ld`) que l'on peut mapper (''placer en mémoire'') les sections produites par le compilateur C. |
191 | | {{{#!protected ------------------------------------------------------------------------------------ |
192 | | ''''''''''''''' |
193 | | - |
194 | | ''''''''''''''' |
195 | | }}} |
196 | | 1. En C, vous savez que les variables globales sont toujours initialisées, soit explicitement dans le programme lui-même, soit implicitement à la valeur 0. Les variables globales initialisées sont placées dans la section `.data` (ou plutôt dans l'une des sections data : `.data`, `.sdata`, `.rodata`, etc. Elles sont présentes dans le fichier objet (`.o`) produit pas le compilateur. En revanche, les variables globales non explicitement initialisées ne sont pas présentes dans le fichier objet. effacement des variables globales? |
| 190 | 1. En C, vous savez que les variables globales sont toujours initialisées, soit explicitement dans le programme lui-même, soit implicitement à la valeur `0`. Les variables globales initialisées sont placées dans la section `.data` (ou plutôt dans l'une des sections `data` : `.data`, `.sdata`, `.rodata`, etc.) et elles sont présentes dans le fichier objet (`.o`) produit pas le compilateur. En revanche, les variables globales non explicitement initialisées ne sont pas présentes dans le fichier objet. Ces dernières sont placées dans un segment de la famille `.bss`. C'est grâce au fichier ldscript que nous pouvons mapper l'ensemble des segments en mémoire.\\Pour pouvoir initialiser à `0` les segments `bss` par programme, il nous faut connaître l'adresse de début et de fin en mémoire. Le code ci-dessous est le fichier ldscript du kernel `kernel.ld` (nous avons retier les commentaires pour la circonstance.\\Expliquez ce que font les lignes 11, 12 et 15. |
218 | | - |
219 | | ''''''''''''''' |
220 | | }}} |
221 | | 1. accès aux registres de périphériques? |
| 212 | - La ligne 11 contient `. = ALIGN(4)`, c'est équivalent à la directive `.align 4` de l'assembleur. |
| 213 | cela permet de déplacer le pointeur de remplissage de la section de sortie courante (c'est-à-dire ici `.kdata`) |
| 214 | frontière de 2^4^ octets (une adresse multiple de 16). Cette contrainte est lié au caches que nous ne verrons pas ici. |
| 215 | - La ligne 12 permet de créer la variable de ldscript `__bss_origin` et de l'initialiser à l'adresse courante, |
| 216 | ce sera donc l'adresse de début du la zone `bss`. |
| 217 | - La ligne 15 permet de créer la variable `__bss_end` qui sera l'adresse de fin de la zone `bss` |
| 218 | (en fait c'est la première adresse qui suit juste `bss`. |
| 219 | ''''''''''''''' |
| 220 | }}} |
| 221 | 1. Nous accès aux registres de périphériques? |