Projet C - FAQ Simulateur MIPS

De Ensiwiki
Aller à : navigation, rechercher

Cette page tente de rassembler les questions les plus fréquentes pour le sujet « Simulateur MIPS ». Vous pouvez ajouter vos questions en bas de la page, et éventuellement répondre aux questions de vos collègues, tant que vous le faites en respectant les règles du jeu : ne donnez pas de solutions explicites au sujet, n'échangez pas de code, et en cas de doutes, demandez à vos enseignants !

Encadrants

Voici la liste des encadrants pour le sujet MIPS, auxquels vous pourrez poser vos questions pendant les séances encadrées (permanence E101) :

  • Florent Bouchez-Tichadou
  • Matthieu Chabanas
  • Thomas Dias Alves
  • Julie Dumas
  • Nicolas Kox
  • Duco Van-Amstel

Les séances encadrées auront lieu le vendredi 27 mai matin et du lundi 30 mai matin au mercredi 8 juin matin .

Soutenances

Les soutenances auront lieu le jeudi 9 et le vendredi 10 juin.

Ressources

Fichiers Fournis


Documents

Liens sur quelques documents de référence (cités dans la bibliographie du projet).

FAQ

Utilisation des programmes mips-elf*

Nous utilisons les mêmes binutils pour mips que le cours de CEP. Penser à vérifier que vous avez bien ajouté export PATH=$PATH:/opt/mips-tools-cep/bin dans votre ~/.bashrc.

Si vous souhaitez installer ces outils chez vous, allez visiter la page Installation_des_outils_cross-compilés_pour_MIPS

Alignement de la section .data

mips-elf-ld ne vérifie pas les mêmes contraintes d'alignement pour la section .data que le sujet. En particulier, il ne l'aligne pas sur une page.

Exemple: L'édition de liens du fichier exempleElf.o place cette section en 0x401024, qui n'est pas un multiple de 0x1000.

Cas de l'instruction DIV

mips-elf-as définit en fait une macro qui vérifie que le dénominateur est non nul avant de diviser et génère du coup cette instruction en une dizaine d'instructions!

Exemple:

avant_div:
DIV $4, $4
apres_div:

est assemblé comme:

Disassembly of section .text:

00000000 <avant_div>:
   0:   14800002        bnez    a0,c <avant_div+0xc>
   4:   0084001a        div     zero,a0,a0
   8:   0007000d        break   0x7
   c:   2401ffff        li      at,-1
  10:   14810004        bne     a0,at,24 <avant_div+0x24>
  14:   3c018000        lui     at,0x8000
  18:   14810002        bne     a0,at,24 <avant_div+0x24>
  1c:   00000000        nop
  20:   0006000d        break   0x6
  24:   00002012        mflo    a0
  • Pour éviter que mips-elf-as ne génère cette macro, vous pouvez utiliser une syntaxe alternative: DIV $0, $4, $4. L'instruction DIV est alors simplement codée, conformément à la doc.


Pour ignorer les problèmes de la SDL avec Valgrind

La SDL a des fuites mémoires qui sont problématiques pour utiliser Valgrind. On peut configurer Valgrind pour les supprimer. Par exemple dans un Makefile ajouter :

PROG=./simips

.PHONY: valgrind-init valgrind

valgrind-init:
    @rm -f my.supp sdl.supp
    valgrind --leak-check=full --gen-suppressions=all --log-file=my.supp --show-possibly-lost=yes --show-reachable=yes $(PROG)
    @sed '/==/d' my.supp > sdl.supp

valgrind:
    valgrind --leak-check=full --show-possibly-lost=yes --show-reachable=yes --track-origins=yes --suppressions=sdl.supp $(PROG)
Puis initialiser une fois avec :
 make valgrind-init
Il sera ensuite suffisant d'utiliser :
make valgrind

Cette solution a le désavantage de masquer les fuites de mémoire de votre programme, s'il y en a lorsque vous exécutez "valgrind-init".

Il y a cependant une deuxième possibilité, plus souple: Valgrind est capable d'ignorer les fonctions causant des fuites de mémoire en fonction de leur nom. On peut alors supprimer la règle "valgrind-init" et mettre manuellement dans le fichier .supp ceci:

{
    name
        Memcheck:Leak
        match-leak-kinds: reachable
        ...
        fun:rl_*
        ...
}

Ici, "rl_*" cible toutes les fonctions préfixées par "rl_". Attention, toutes les fonctions de readline ne commencent pas par "rl_". Il faudra donc dupliquer cette règle. Cela fonctionne de la même manière pour la SDL.

Pour les problèmes de fuites mémoire avec les packages fournis

traduit_table_symboles et reloge_symboles renvoient une table des symboles claire dont la libération mémoire incombe à l'utilisateur, ce que la doc aurait dû spécifier.

Problème dans le sujet au niveau de l'exemple donné de SYSCALL

Page 16: La deuxième instruction de la section .text où l'on charge la valeur de l'adresse de la chaine doit se faire avec un LA et non un LI car celui-ci ne charge pas les bits de poids forts de l'adresse.

Bug dans le module relocation

Un bug a été trouvé (Robin a gagné un Carambar!) dans le module fourni relocation.o.

Si la section .text est placée à une adresse élevée (non 0 à partir du 29e bit), la relocation des instructions J et JAL ne fonctionne plus (opcode écrasé). Ceci a été corrigé dans la version suivante du module: Relocation.tgz


Bien entendu, tout ceci n'a pas d'importance si vous avez vous-même réécrit le module (sans erreur, naturellement!)