Changes between Version 163 and Version 164 of Archi-1-TP9
- Timestamp:
- Nov 21, 2021, 4:28:06 PM (3 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Archi-1-TP9
v163 v164 460 460 461 461 compil: 462 $(CC) -o hcpu .o $(CFLAGS) hcpua.S463 @$(OD) -D hcpu .o > hcpu.o.s464 $(LD) -o kernel.x -T kernel.ld hcpu .o462 $(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 465 465 @$(OD) -D kernel.x > kernel.x.s 466 466 … … 710 710 1. Regarder dans le fichier `hcpua.S`, dans quelle section est désormais le code de boot ? 711 711 {{{#!protected ------------------------------------------------------------------------------------ 712 '' '''''''''''''712 '' 713 713 - 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 }}} 716 2. Le code de boot ne fait que sauter à l'adresse `kinit` avec l'instruction `jr`, 717 717 il n'y a pas de retour, ce n'est donc pas un `jal`. Où est défini `kinit` ? 718 718 Comment le code de boot connait-il cette adresse ? 719 719 Pourquoi ne pas avoir utilisé `j init` et donc pourquoi passer par un registre ? 720 720 {{{#!protected ------------------------------------------------------------------------------------ 721 '' '''''''''''''721 '' 722 722 - `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. 724 724 - 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 '' 726 726 }}} 727 727 1. Dans `kernel.ld`, que signifie `*(.*data*)` ? 728 728 {{{#!protected ------------------------------------------------------------------------------------ 729 '' '''''''''''''729 '' 730 730 - 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 l e compilateur.732 '' '''''''''''''731 présentes dans n'importe quel fichier objets reçu par l'éditeur de liens. 732 '' 733 733 }}} 734 734 1. 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]) 735 735 {{{#!protected ------------------------------------------------------------------------------------ 736 '' '''''''''''''736 '' 737 737 - `__kdata_end` est l'adresse du premier octet placé juste après la région data. 738 738 - les 2 «`_`» permettent d'éviter les conflits avec les noms des symboles (fonction, variable, type, etc.) 739 739 présents dans le programme. 740 '' '''''''''''''740 '' 741 741 }}} 742 742 … … 745 745 - Exécutez le programme sur le simulateur. Est-ce différent de l'étape 1 ? 746 746 {{{#!protected ------------------------------------------------------------------------------------ 747 '' '''''''''''''747 '' 748 748 * Non, c'est le même comportement. 749 '' '''''''''''''749 '' 750 750 }}} 751 751 - Modifiez le code, comme pour l'étape 1, afin d'afficher un second message ? 752 752 {{{#!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 '' 756 756 }}} 757 757 … … 785 785 1. Quand faut-il initialiser la pile ? Dans quel fichier est-ce ? Quelle est la valeur du pointeur initial ? 786 786 {{{#!protected ------------------------------------------------------------------------------------ 787 '' '''''''''''''787 '' 788 788 - Il faut initialiser le pointeur avant d'appeler `kinit()` 789 789 - C'est dans le fichier `hcpua.S` 790 790 - `$29` ← `__kdata_end`, c'est-à-dire `0x80400000` 791 '' '''''''''''''791 '' 792 792 }}} 793 793 1. Dans quel fichier le mot clé `volatile` est-il utilisé ? Rappeler son rôle. 794 794 {{{#!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 d oivent 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 '' 798 798 }}} 799 799 … … 802 802 - Exécutez le programme sur le simulateur. Est-ce différent de l'étape 1 ? 803 803 {{{#!protected ------------------------------------------------------------------------------------ 804 '' '''''''''''''804 '' 805 805 * Non, c'est le même comportement :-) 806 '' '''''''''''''806 '' 807 807 }}} 808 808 - 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. 809 809 {{{#!protected ------------------------------------------------------------------------------------ 810 '' '''''''''''''810 '' 811 811 * Dans kinit.o.s, l'adresse de `kinit` est `0` alors que `kernel.x.s` l'adresse est `0x80000000`. 812 812 * Dans kinit.o.s, `kinit` est dans la section `.text` alors que dans `kernel.x.s` `kinit` est dans la section `.ktext`. … … 814 814 * 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. 815 815 * dans `kernel.x.s` `kinit` est placé et mis dans la section `.ktext` comme le fichier `kernel.ld` le demande. 816 '' '''''''''''''816 '' 817 817 }}} 818 818 - Modifiez le code de `kinit.c`, et comme pour l'étape 1, afficher un second message ? 819 819 {{{#!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 '' 823 823 }}} 824 824