Changes between Version 163 and Version 164 of Archi-1-TP9


Ignore:
Timestamp:
Nov 21, 2021, 4:28:06 PM (3 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP9

    v163 v164  
    460460
    461461compil:
    462     $(CC) -o hcpu.o $(CFLAGS) hcpua.S
    463     @$(OD) -D hcpu.o > hcpu.o.s
    464     $(LD) -o kernel.x -T kernel.ld hcpu.o
     462    $(CC) -o hcpua.o $(CFLAGS) hcpua.S
     463    @$(OD) -D hcpua.o > hcpua.o.s
     464    $(LD) -o kernel.x -T kernel.ld hcpua.o
    465465    @$(OD) -D kernel.x > kernel.x.s
    466466
     
    7107101. Regarder dans le fichier `hcpua.S`, dans quelle section est désormais le code de boot ?
    711711{{{#!protected ------------------------------------------------------------------------------------
    712 '''''''''''''''
     712''
    713713- Il a été placé dans la section de `.boot`
    714 '''''''''''''''
    715 }}}
    716 2. Le code de boot ne fait que sauter à l'adresse `kinit` avec l'instruction `j`,
     714''
     715}}}
     7162. Le code de boot ne fait que sauter à l'adresse `kinit` avec l'instruction `jr`,
    717717   il n'y a pas de retour, ce n'est donc pas un `jal`. Où est défini `kinit` ?
    718718   Comment le code de boot connait-il cette adresse ?
    719719   Pourquoi ne pas avoir utilisé `j init` et donc pourquoi passer par un registre ?
    720720{{{#!protected ------------------------------------------------------------------------------------
    721 '''''''''''''''
     721''
    722722- `kinit` est défini dans la `kinit.S`.
    723 - `hcpua.S` ne connait pas cette adresse, mais grâce au `.globl kinit`, l'éditeur de lien saura compléter `hcpu.o`, dans l'exécutable.
     723- `hcpua.S` ne connait pas cette adresse, mais grâce au `.globl kinit`, l'éditeur de lien saura compléter `hcpua.o`, dans l'exécutable.
    724724- Le code de boot est en `0xBFC00000`, `kinit` est en `0x80000000`, ces deux adresses ne partagent pas les 4 bits de poids fort, c'est trop loin pour un simple `j`.
    725 '''''''''''''''
     725''
    726726}}}
    7277271. Dans `kernel.ld`, que signifie `*(.*data*)` ?
    728728{{{#!protected ------------------------------------------------------------------------------------
    729 '''''''''''''''
     729''
    730730- C'est une manière de désigner toutes les sections nommées `.*data*` (avec `*` = n'importe quoi)
    731   présentes dans n'importe quel fichier objets reçu par le compilateur.
    732 '''''''''''''''
     731  présentes dans n'importe quel fichier objets reçu par l'éditeur de liens.
     732''
    733733}}}
    7347341. Quelle est la valeur de `__kdata_end` ? Pourquoi mettre 2 «`_`» au début des variables du `ldscript` ? ([https://www.gnu.org/software/libc/manual/html_node/Reserved-Names.html réponse])
    735735{{{#!protected ------------------------------------------------------------------------------------
    736 '''''''''''''''
     736''
    737737- `__kdata_end` est l'adresse du premier octet placé juste après la région data.
    738738- les 2 «`_`» permettent d'éviter les conflits avec les noms des symboles (fonction, variable, type, etc.)
    739739  présents dans le programme.
    740 '''''''''''''''
     740''
    741741}}}
    742742
     
    745745- Exécutez le programme sur le simulateur. Est-ce différent de l'étape 1 ?
    746746{{{#!protected ------------------------------------------------------------------------------------
    747 '''''''''''''''
     747''
    748748* Non, c'est le même comportement.
    749 '''''''''''''''
     749''
    750750}}}
    751751- Modifiez le code, comme pour l'étape 1, afin d'afficher un second message ?
    752752{{{#!protected ------------------------------------------------------------------------------------
    753 '''''''''''''''
    754 * C'est très semblable, voire identique, à l'étape 1, l'idée est d'ouvrir le code...
    755 '''''''''''''''
     753''
     754* C'est très semblable, c'est même identique à l'étape 1, l'idée est d'ouvrir le code...
     755''
    756756}}}
    757757
     
    7857851. Quand faut-il initialiser la pile ? Dans quel fichier est-ce ? Quelle est la valeur du pointeur initial ?
    786786{{{#!protected ------------------------------------------------------------------------------------
    787 '''''''''''''''
     787''
    788788- Il faut initialiser le pointeur avant d'appeler `kinit()`
    789789- C'est dans le fichier `hcpua.S`
    790790- `$29` ← `__kdata_end`, c'est-à-dire `0x80400000`
    791 '''''''''''''''
     791''
    792792}}}
    7937931. Dans quel fichier le mot clé `volatile` est-il utilisé ? Rappeler son rôle.
    794794{{{#!protected ------------------------------------------------------------------------------------
    795 '''''''''''''''
    796 * Il est utilisé dans `kinit.c` pour informer le compilateur que la variable `__tty_regs_map` doit toujours être lue en mémoire et ne peut jamais être "optimisée" dans un registre. Les écritures doivent aussi toujours toutes avoir lieu. Cette variable désigne les registres du contrôleur de terminal. Quand le programme accède en lecture ou écriture à cette variable, il veut accéder au terminal, il faut vraiment qu'il y ait des load/store dans le programme assembleur correspondant au programme source.
    797 '''''''''''''''
     795''
     796* Il est utilisé dans `kinit.c` pour informer le compilateur que la variable `__tty_regs_map` doit toujours être lue en mémoire et ne peut jamais être "optimisée" dans un registre. Les écritures dans la doivent aussi toujours avoir lieu. Cette variable désigne les registres du contrôleur de terminal. Quand le programme accède en lecture ou écriture à cette variable, il veut accéder au terminal, il faut vraiment qu'il y ait des load/store dans le programme assembleur correspondant au programme source.
     797''
    798798}}}
    799799
     
    802802- Exécutez le programme sur le simulateur. Est-ce différent de l'étape 1 ?
    803803{{{#!protected ------------------------------------------------------------------------------------
    804 '''''''''''''''
     804''
    805805* Non, c'est le même comportement :-)
    806 '''''''''''''''
     806''
    807807}}}
    808808- Ouvrez les fichiers `kinit.o.s` et `kernel.x.s`, le premier fichier est le désassemblage de `kinit.o` et le second est le désassemblage de `kernel.x`. Dans ces fichiers, vous avez plusieurs sections. Les sections `.MIPS.abiflags`, `.reginfo` et `.pdr` ne nous sont pas utiles (elles servent au chargeur d'application, elles contiennent des informations sur le contenu du fichier et cela ne nous intéresse pas).\\Notez l'adresse de `kinit` dans les deux fichiers, sont-ce les mêmes ? Sont-elles dans les mêmes sections ? Expliquez pourquoi.
    809809{{{#!protected ------------------------------------------------------------------------------------
    810 '''''''''''''''
     810''
    811811* Dans kinit.o.s, l'adresse de `kinit` est `0` alors que `kernel.x.s` l'adresse est `0x80000000`.
    812812* Dans kinit.o.s, `kinit` est dans la section `.text` alors que dans `kernel.x.s` `kinit` est dans la section `.ktext`.
     
    814814  * dans `kinit.o`, `kinit` n'a pas encore été placé, le compilateur commence toutes ses sections à 0, donc `kinit` est dans la section `.text` et elle commence à 0.
    815815  * dans `kernel.x.s` `kinit` est placé et mis dans la section `.ktext` comme le fichier `kernel.ld` le demande.
    816 '''''''''''''''
     816''
    817817}}}
    818818- Modifiez le code de `kinit.c`, et comme pour l'étape 1, afficher un second message ?
    819819{{{#!protected ------------------------------------------------------------------------------------
    820 '''''''''''''''
    821 * Hormis, qu'il s'agit de code C, il n'y a pas de différence de principe, c'est toujours du copier-coller, l'important c'est d'ouvrir le code
    822 '''''''''''''''
     820''
     821* Hormis, qu'il s'agit de code C, il n'y a pas de différence de principe, c'est toujours du copier-coller, l'important c'est d'ouvrir le code.
     822''
    823823}}}
    824824