Changes between Version 11 and Version 12 of Archi-1-TP10


Ignore:
Timestamp:
Dec 22, 2020, 10:59:31 AM (4 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP10

    v11 v12  
    188188'''''''''''''''
    189189}}}
    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?
     1901. 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.
    197191{{{#!java
    198192  1 SECTIONS
    199193  2 {
    200194  3     .boot : {
    201   4         *(.boot)            /* boot code in boot region */
     195  4         *(.boot)           
    202196  5     } > boot_region
    203197  6     .ktext : {
    204   7         *(.text*)           /* code of any object file (except boot) in kernel code region) */
     198  7         *(.text*)           
    205199  8     } > ktext_region
    206200  9     .kdata : {
    207  10         *(.*data*)          /* initialized global variables */
    208  11         . = ALIGN(4);       /* move the filling pointer to an word aligned address */
    209  12         __bss_origin = .;   /* first byte of uninitialized global variables */
    210  13         *(.*bss*)           /* uninitialized global variables */
    211  14         . = ALIGN(4);       /* move the filling pointer to an word aligned address */
    212  15         __bss_end = .;      /* first byte after the bss section */
     201 10         *(.*data*)         
     202 11         . = ALIGN(4);       
     203 12         __bss_origin = .;   
     204 13         *(.*bss*)           
     205 14         . = ALIGN(4);       
     206 15         __bss_end = .;     
    213207 16     } > kdata_region
    214208 17 }
     
    216210{{{#!protected ------------------------------------------------------------------------------------
    217211'''''''''''''''
    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}}}
     2211. Nous accès aux registres de périphériques?
    222222{{{#!protected ------------------------------------------------------------------------------------
    223223'''''''''''''''