Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS Ensimag 1ère année - 2011/12 31 mai 2012 Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 1 / 52 Objectifs de la scéance Présentation succinte des objectifs du projet logiciel en C, et son déroulement général. Simulateur de microprocesseur MIPS • Contexte du projet • Fonctionnalités et intérêt d’un simulateur • L’architecture MIPS Organisation et spécifications du projet pour le sujet MIPS Réponse aux questions éventuelles liées au projet ou au sujet Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 2 / 52 Plan 1 Introduction 2 Déroulement du projet Objectifs Planning/Encadrement Règles du jeu 3 Simulateur de microprocesseur MIPS 4 Travail à réaliser Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 3 / 52 Objectifs du projet logiciel Apprentissage d’un langage de référence : le C Mise en pratique des connaissances acquises dans d’autres modules : compilation, Unix, logiciel de base Premier aperçu des contraintes d’un ”gros” projet logiciel : • Travail en équipe (trinôme): découpage répartition des tâches, mise en commun • Gestion du temps et de la difficulté des différentes étapes • Respect d’un cahier des charges • Importance de la phase de validation (tests, débug, . . . ) Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 4 / 52 Plan 1 Introduction 2 Déroulement du projet Objectifs Planning/Encadrement Règles du jeu 3 Simulateur de microprocesseur MIPS 4 Travail à réaliser Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 5 / 52 Planning/Encadrement Jeudi 31 mai: Amphi de présentation et lancement du projet Du 31 mai au mercredi 13 juin: libre-service encadré • • • • salles machines du 2ème étage 2 encadrants par demi-journée 1 ou 2 demi-journées par jour planning disponible sur ensiwiki Rendu du projet le mercredi 13 juin sur TEIDE Soutenances les jeudi 14 et vendredi 15 juin Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 6 / 52 A quoi sert un encadrant ? Les encadrants sont là pour : • vous aider sur la programmation en C en général • vous aider sur les points techniques du projet • vous conseiller sur l’aspect conception (comment structurer son projet) • vous apporter des conseils sur l’organisation (le travail en équipe n’apporte pas que des avantages !) Les encadrants NE SONT PAS LA pour : • faire le projet à votre place • vous donner les solutions à tous les problèmes • remplacer les logiciels de debug Dans tous les cas, réfléchissez à vos questions avant de les poser et discutez avec vos binômes, souvent la réponse est dans la question, et soyez précis Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 7 / 52 The Dream Team Frédéric Wagner Luc Michel Ludovic Jacquin Loı̈c Petit Frédéric Elisei Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 8 / 52 Plan 1 Introduction 2 Déroulement du projet Objectifs Planning/Encadrement Règles du jeu 3 Simulateur de microprocesseur MIPS 4 Travail à réaliser Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 9 / 52 Petit rappel sur la fraude Il est interdit de copier ou de s’inspirer de fichiers concernant le projet, à l’exception des fichiers fournis par les encadrants. Ceci inclus: • les fichiers des années précédentes • les fichiers d’étudiants n’appartenant pas au trinôme De même, il est interdit de transmettre des fichiers à des étudiants extérieurs au trinôme. Ceci implique que vous protégiez vos fichiers en lecture (contrôle effectué périodiquement). Des informations sur la sécurisation des fichiers sont disponibles sur le Wiki Des outils de détection automatique de triche sont utilisés En cas de fraude avérée, la sanction est le 0 au projet, en plus des sanctions prévues dans le réglement de l’école Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 10 / 52 Evaluation L’évaluation du projet compte pour 80% de la note finale de projet C (le restant étant la note de la semaine de préparation) Votre projet sera évalué lors des soutenances des 14 et 15 juin. Tout le trinôme participe à la soutenance, avec un enseignant. La soutenance se divise en trois parties 1. 10 minutes de présentation: I I I de votre solution des principaux choix de conception des difficultés/facilités rencontrées Ne pas prévoir une démonstration, mais plusieurs qui démontrent les atouts de votre projet final 2. L’examinateur vous soumet un problème à résoudre. Vous avez alors 30 minutes pour apporter une solution à ce problème dans votre code 3. Les 15 dernières minutes sont consacrées à des tests plus avançés, à partir de vos programmes tests et/ou de ceux de l’examinateur Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 11 / 52 Plan 1 Introduction 2 Déroulement du projet 3 Simulateur de microprocesseur MIPS Contexte du projet Description du MIPS Langage d’assemblage Fichier objets relogeables 4 Travail à réaliser Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 12 / 52 Simulateur Principe identique aux simulateurs disponibles pour les jeux vidéos • Émulation logicielle d’une architecture (CPU + RAM + périphériques) • Lancement d’un vrai logiciel sur le faux matériel Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 13 / 52 Simulateur Principe identique aux simulateurs disponibles pour les jeux vidéos • Émulation logicielle d’une architecture (CPU + RAM + périphériques) • Lancement d’un vrai logiciel sur le faux matériel Intérêts • Compréhension du fonctionnement d’une machine • Très intéressant pour la sécurité en informatique • Bonne vision de la partie finale d’une chaine de compilation Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 13 / 52 m1.c compilation gcc -c m1.o preprocessing gcc -E m1.i EDITION DE LIENS fusion ld -t -o progrel.o \ m1.o m2.o m3.o implantation ld progrel.o -o prog progrel.o prog assemblage gcc -c ou as 2 traduction gcc -S m1.s chargement librairies m2.s m2.o image mémoire lib dynamiques m3.c m3.o COMPILATION données exécution résultats Fonctionnalités du simulateur En sortie de l’édition de liens, on peut disposer d’un programme : relogeable (adresses relatives) exécutable (adresses implantées, absolues) Le simulateur permettra : 1. le chargement en mémoire de ce programme • aux adresses prévues, dans le cas d’un exécutable • à des adresses paramétrables, dans le cas relogeable Il faudra alors reloger le programme à ces adresses. 2. le désassemblage du programme chargé, c’est-à-dire l’affichage du code en langage assembleur correspondant 3. l’exécution de la suite des instructions, avec mise à jour de l’état de la machine (registres, mémoire, ...). Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 14 / 52 Intérêt du simulateur ? Reproduire l’objet simulé, ici la machine MIPS • dans sa structure: registres & mémoire similaires au processeur • dans sa capacité à décoder un programme • dans son comportement pendant l’exécution Les mêmes résultats doivent être obtenus que lors de l’exécution sur un MIPS réel, mais pas forcément de la même façon! Un tel logiciel permet par exemple de tester et déboguer des programmes destinés à une machine équipée d’un processeur MIPS, sans avoir réellement d’ordinateur avec cette architecture. Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 15 / 52 Framebuffer Framebuffer • zone mémoire correspondant à la mémoire d’une carte graphique • 320x200, niveaux de gris • adresses fixes, écriture seulement Principe • simulateur : simulation du CPU mais aussi de la mémoire • tout accès mémoire est géré par le simulateur I vérification de l’adresse accédée I gestion spécifique si framebuffer ou RAM Module d’affichage fourni Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 16 / 52 Plan 1 Introduction 2 Déroulement du projet 3 Simulateur de microprocesseur MIPS Contexte du projet Description du MIPS Langage d’assemblage Fichier objets relogeables 4 Travail à réaliser Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 17 / 52 Processeurs MIPS Gamme de micro-contrôleurs légers • processeur • mémoire, ports, périphériques, etc. Stations de travail (Silicon Graphics, . . . ) Systèmes embarqués légers • imprimantes, modems • consoles de jeux! Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 18 / 52 Processeurs MIPS : architecture MIPS : Microprocesseur without Interlocked Pipeline Stages • Pipeline d’exécution : lecture, décodage, exécution, registres, mémoire • Une instruction terminée à chaque cycle d’horloge Processeur de type RISC: Reduced Instruction Set Computer • Jeu d’instructions réduit • Syntaxe des instructions régulière • Codage régulier, toujours sur 32 bits Load/Store architecture • Mémoire accédée seulement pas les instructions de lecture/écriture • Pour toutes les autres: opérandes dans des registres ou immédiats Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 19 / 52 Processeurs MIPS : architecture MIPS : Microprocesseur without Interlocked Pipeline Stages • Pipeline d’exécution : lecture, décodage, exécution, registres, mémoire • Une instruction terminée à chaque cycle d’horloge Processeur de type RISC: Reduced Instruction Set Computer • Jeu d’instructions réduit • Syntaxe des instructions régulière • Codage régulier, toujours sur 32 bits Load/Store architecture • Mémoire accédée seulement pas les instructions de lecture/écriture • Pour toutes les autres: opérandes dans des registres ou immédiats L’anti-Pentium?? Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 19 / 52 Processeurs MIPS : mémoire Adressage 32 bits ↔ tableau de 4 Go Big Endian : octet de poids fort à l’adresse la plus basse 0x12345678 à l’adresse mémoire 0x4 0x00000004 ↓ 0x00000007 big endian ... 0x01 0x23 0x45 0x67 ... little endian ... 0x67 0x45 0x23 0x01 ... Mémoire alignée • Tous les mots de 32 bits (en particulier les instructions) sont à des adresses multiples de 4 • Seuls les octets peuvent être placés n’importe où en mémoire Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 20 / 52 Processeurs MIPS : registres de 32 bits Que des registres de 32 bits! Trente deux Registres d’usage général: $0 à $31 General Purpose Registers Registre $0 $1 $2, $3 $4-$7 $8-$15 $16-$23 $24, $25 $26, $27 $28 $29 $30 $31 Mnemonic $zero $at $v0, $v1 $a0-$a3 $t0-$t7 $s0-$s7 $t8, $t9 $k0, $k1 $gp $sp $fp $ra Usage (réservé ou conventionnel) Toujours nul (relié à la masse) Assembler temporary (réservé!) Valeurs retournées par une sous-routine Arguments d’une sous-routine Registres temporaires Registres temporaires, préservés par les sous-routines Deux temporaires de plus kernel Global pointer Stack pointer Frame pointer Return address Trois registres spécialisés • $PC : Program Compter • $HI, $LO : résultats sur 64 bits (MULT, DIV) Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 21 / 52 Processeurs MIPS : modes d’adressage Seulement cinq modes d’adressage des opérandes Registre direct : ADD $2, $3, $4 Immédiat : ADDI $2, $3, 0x12C Indirect avec base et déplacement : LW $2, -200($10) Relatif : B 0xF3 Absolu aligné dans une région de 256 Mo : J 0xABC3 Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 22 / 52 Processeurs MIPS : instructions Instructions dans le projet : sous-ensemble de celles du MIPS Arithmétiques • ADD $2, $3, $4 • ADDI $2, $3, 0xA1C • MULT $2, $3 Logiques • AND $2, $3, $4 Lecture / écriture mémoire • LB $2, 0xAB4($10) Load Byte • SW $2, -100($10) Store Word Instruction de contrôle • BEQ $2, $3, 0x1000 Branch on Equals • JAL 0xABCD0 Jump And Link • JR $31 Jump Register ... Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 23 / 52 Processeurs MIPS : instructions Syntaxe toujours régulière Généralement un seul mode d’adressage possible par opérande En tout et pour tout, trois formats de codage binaire: • R-instruction rd, rs, rt • I-instruction rd, rs, immediate • J-instruction instr index Format d’une instruction de type I 31 26 25 opcode 6 21 20 rs 5 16 15 rt 5 0 immediate 16 Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 24 / 52 Plan 1 Introduction 2 Déroulement du projet 3 Simulateur de microprocesseur MIPS Contexte du projet Description du MIPS Langage d’assemblage Fichier objets relogeables 4 Travail à réaliser Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 25 / 52 Langage d’assemblage du MIPS Langage produit par les compilateurs des langages de haut niveau (Ada, Java, C), . . . ou écrit à la main! Intermédiaire entre un langage de haut niveau et le langage de la machine au format binaire Quel langage d’assemblage? • cours de Logiciel de base: langage as, pour le Pentium • ici: sous ensemble de as, donc beaucoup de points identiques: directives, commentaires. . . • avec bien sûr les instructions du MIPS! Types d’informations : • • • • commentaires étiquettes instructions machine directives d’assemblage Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 26 / 52 Langage d’assemblage Commentaires # Sur une ligne /* Sur plusieurs lignes */ Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 27 / 52 Langage d’assemblage Commentaires Etiquettes # Sur une ligne /* Sur plusieurs lignes */ Label1: Label3: Label2: ADDI $2, $3, 0xC8 Les 3 symboles repèrent l’adresse en mémoire de l’instruction ADDI $2, $3, 0xC8 Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 27 / 52 Langage d’assemblage Commentaires Etiquettes # Sur une ligne /* Sur plusieurs lignes */ Label1: Label3: Label2: ADDI $2, $3, 0xC8 Les 3 symboles repèrent l’adresse en mémoire de l’instruction ADDI $2, $3, 0xC8 Littéraux OxFdCba98 # nombre hexadécimal 123456789 # nombre décimal hexadécimaux interprétés comme non-signés décimaux interprétés comme signés en complément à 2 Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 27 / 52 Langage d’assemblage : directives Sectionnement 3 mots-clés pour 2 zones mémoire : .text : zone programme .data : données initialisées de la zone données .bss : données non initialisées de la zone données Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 28 / 52 Langage d’assemblage : directives Sectionnement 3 mots-clés pour 2 zones mémoire : .text : zone programme .data : données initialisées de la zone données .bss : données non initialisées de la zone données Définition de données Données non initialisées : .skip <taille> Données initialisées : .byte <valeur sur 8 bits> .word <valeur sur 32 bits> Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 28 / 52 Langage d’assemblage : directives Autres Sectionnement 3 mots-clés pour 2 zones mémoire : .text : zone programme .data : données initialisées de la zone données .bss : données non initialisées de la zone données Exportation de nom d’étiquette : .globl <nom> Options avancées pour as : .set noreorder Définition de données Données non initialisées : .skip <taille> Données initialisées : .byte <valeur sur 8 bits> .word <valeur sur 32 bits> Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 28 / 52 Langage d’assemblage : instructions Instructions machine operation [op1 [,op2 [,op3]]] Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 29 / 52 Langage d’assemblage : instructions Instructions machine operation [op1 [,op2 [,op3]]] Nom de l’opération Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 29 / 52 Langage d’assemblage : instructions Instructions machine operation [op1 [,op2 [,op3]]] Nom de l’opération 0, 1, 2 ou 3 opérandes. Une destination, puis la ou les sources Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 29 / 52 Langage d’assemblage : instructions Instructions machine operation [op1 [,op2 [,op3]]] Nom de l’opération 0, 1, 2 ou 3 opérandes. Une destination, puis la ou les sources Syntaxe des opérandes suivant le mode d’adressage : • • • • nom d’un registre : $29, $sp, . . . valeur immédiate : 0xC8, 1234 indirect avec base et déplacement : -200($17) etc., voir description des modes d’adressage Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 29 / 52 Langage d’assemblage : pseudos-instructions Uniquement définies dans le langage d’assemblage Macro-instructions, équivalentes à une ou plusieurs instructions machine Opération courantes: • MOVE rt, rs ↔ ADDU rt, rs, $zero • LI rt, immediate32 ↔ LUI rt, hi(immediate32) ORI rt, rt, lo(immediate32) • ... Modes d’adressage différents, en particulier des symboles: • BEQ rt, rs, adr de branch • LW rt, label ↔ LUI $1, addendHI16 LW rt, addendLO16($1) • ... Avec des symboles, le codage binaire est généralement relatif et accompagné d’informations de relocation → Notion de fichier binaire relogeable. Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 30 / 52 Langage d’assemblage : exemple miam.s . s e t noreorder . text LB $t0 , lunchtime ADDI $t1 , $zero , 8 boucle : BEQ $t0 , $t1 , byebye NOP ADDI $t1 , $t1 , 1 B boucle NOP byebye : JAL v i t e v i t e a u r u NOP . data lunchtime : . byte 12 Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 31 / 52 Plan 1 Introduction 2 Déroulement du projet 3 Simulateur de microprocesseur MIPS Contexte du projet Description du MIPS Langage d’assemblage Fichier objets relogeables 4 Travail à réaliser Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 32 / 52 Principe de la relocation Pour coder un fichier assembleur, il suffit de coder l’ensemble des instructions et déclarations de données. Code simple, absolu . text ADDI $3 , $0 , 12345 SW $3 , 0x100 ( $17 ) Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 33 / 52 Principe de la relocation Pour coder un fichier assembleur, il suffit de coder l’ensemble des instructions et déclarations de données. Que se passe-t-il lorsque des symboles sont utilisés? Code simple, absolu . text ADDI $3 , $0 , 12345 SW $3 , 0x100 ( $17 ) En utilisant des symboles . text ADDI $3 , $0 , 12345 SW $3 , X . data . word 0xABC X : . word 0x12345 Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 33 / 52 Principe de la relocation Pour coder un fichier assembleur, il suffit de coder l’ensemble des instructions et déclarations de données. Que se passe-t-il lorsque des symboles sont utilisés? les adresses des symboles ne sont connues que relativement au début des sections Code simple, absolu . text ADDI $3 , $0 , 12345 SW $3 , 0x100 ( $17 ) En utilisant des symboles . text ADDI $3 , $0 , 12345 SW $3 , X . data . word 0xABC X : . word 0x12345 Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 33 / 52 Principe de la relocation Pour coder un fichier assembleur, il suffit de coder l’ensemble des instructions et déclarations de données. Que se passe-t-il lorsque des symboles sont utilisés? les adresses des symboles ne sont connues que relativement au début des sections ici, X est 4 octets après le début de la section .data Code simple, absolu . text ADDI $3 , $0 , 12345 SW $3 , 0x100 ( $17 ) En utilisant des symboles . text ADDI $3 , $0 , 12345 SW $3 , X . data . word 0xABC X : . word 0x12345 Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 33 / 52 Principe de la relocation Pour coder un fichier assembleur, il suffit de coder l’ensemble des instructions et déclarations de données. Que se passe-t-il lorsque des symboles sont utilisés? les adresses des symboles ne sont connues que relativement au début des sections ici, X est 4 octets après le début de la section .data On ne peut coder que de manière “non-définitive”. Il faudra reloger le fichier binaire, à l’édition de liens ou au chargement Code simple, absolu . text ADDI $3 , $0 , 12345 SW $3 , 0x100 ( $17 ) En utilisant des symboles . text ADDI $3 , $0 , 12345 SW $3 , X . data . word 0xABC X : . word 0x12345 Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 33 / 52 Informations de relocation Les informations disponibles sont : • • • • l’adresse du code à reloger (ici .text + 4) l’adresse du symbole, s’il est local (.data + 4) ... ou juste son nom, s’il est global! l’utilisation du symbole (opérande, ...), définissant un mode de relocation En utilisant des symboles . text ADDI $3 , $0 , 12345 SW $3 , X . data . word 0xABC X : . word 0x12345 Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 34 / 52 Informations de relocation Les informations disponibles sont : • • • • l’adresse du code à reloger (ici .text + 4) l’adresse du symbole, s’il est local (.data + 4) ... ou juste son nom, s’il est global! l’utilisation du symbole (opérande, ...), définissant un mode de relocation Elles seront codées entre : • l’espace temporaire addend dans le codage binaire, qu’on ne sait pas coder de manière absolue (ici, 16 bits dans le SW) • une table de relocation, associée à la zone contenant le code à reloger (ici .rel.text) En utilisant des symboles . text ADDI $3 , $0 , 12345 SW $3 , X . data . word 0xABC X : . word 0x12345 Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 34 / 52 Informations de relocation Les informations disponibles sont : • • • • l’adresse du code à reloger (ici .text + 4) l’adresse du symbole, s’il est local (.data + 4) ... ou juste son nom, s’il est global! l’utilisation du symbole (opérande, ...), définissant un mode de relocation Elles seront codées entre : • l’espace temporaire addend dans le codage binaire, qu’on ne sait pas coder de manière absolue (ici, 16 bits dans le SW) • une table de relocation, associée à la zone contenant le code à reloger (ici .rel.text) En utilisant des symboles . text ADDI $3 , $0 , 12345 SW $3 , X . data . word 0xABC X : . word 0x12345 Table de relocation .rel.text Offset 00000004 00000008 Info Type 00000205 R MIPS HI16 00000206 R MIPS LO16 Sym . Value 00000000 00000000 Sym . Name . data . data Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 34 / 52 Format de fichier ELF ELF: Executable and Linkable Format Format de fichiers objets et exécutables relogeables, commun à de nombreux OS (Linux, MacOs, ...) Ensemble de sections (éventuellement vides) • • • • • • • Entête Table des entêtes de sections Table des noms de sections (“.text”, “.data”, “.rel.text”, ...) Table des chaı̂nes (noms des symboles) Table des symboles (informations sur les symboles) Section de données (.text, .data, .bss) Tables de relocations (.rel.text, .rel.data) Librairies C standard (libelf, gelf) pour la lecture/écriture d’un fichier ELF Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 35 / 52 Format de fichier ELF entête du fichier e_shoff e_shstrndx table des entêtes de sections entête sh_offset de section sh_name section ELF table des noms de sections Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 36 / 52 Exemple d’assemblage mips-as miam.s -o miam.o Fichier d’entrée : miam.s . s e t noreorder . text LB $t0 , lunchtime ADDI $t1 , $zero , 8 boucle : BEQ $t0 , $t1 , byebye NOP ADDI $t1 , $t1 , 1 B boucle NOP byebye : JAL v i t e v i t e a u r u NOP . data lunchtime : . byte 12 Fichier de sortie : miam.o 00111000000100001000000100011. . . les adresses sont relatives ou non-déterminées miam.o est un fichier objet binaire relogeable au format ELF. Ce n’est pas un fichier exécutable. Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 37 / 52 Plan 1 Introduction 2 Déroulement du projet 3 Simulateur de microprocesseur MIPS 4 Travail à réaliser Spécifications du simulateur Modules fournis Cahier des charges Conseils Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 38 / 52 Interface Homme-Machine IHM très simple, de type shell (lignes de commandes) Fonctions du simulateur: 15 commandes paramétrées • • • • • • • chargement d’un fichier objet binaire relocation des adresses désassemblage simulation de l’exécution des instructions affichage & modification de l’état de la machine screenshot ... E n t r e r une commande: dreg $8 $8 : 0x00000000 E n t r e r une commande: run E n t r e r une commande: dreg $8 $8 : 0x00010ABC E n t r e r une commande: Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 39 / 52 Chargement d’un programme load <fichier>: Chargement en mémoire d’un fichier binaire • Représentation interne de la mémoire? • “recopie” du code des instructions et des données • Relocation éventuelle! E n t r e r une commande: load exempleElf Chargement de exempleElf . . . Le f i c h i e r e s t EXECUTABLE Section . t e x t => 36 octets implantes a l ’ adresse 0x00400018 Section . data => 12 octets implantes a l ’ adresse 0x0040103C Section . bss => 9 octets implantes a l ’ adresse 0x00401048 E n t r e r une commande: load exempleElf . o Chargement de exempleElf . e l f . . . Le f i c h i e r e s t RELOGEABLE Adresse d’ implantation de l a section . t e x t ? (0 x00400000 ) Adresse d’ implantation de l a section . data? (0 x00401000 ) Section . t e x t => 36 octets implantes a l ’ adresse 0x00400000 Section . data => 12 octets implantes a l ’ adresse 0x00401000 Section . bss => 9 octets implantes a l ’ adresse 0x0040100C Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 40 / 52 Désassemblage dasm : affiche le programme en assembleur correspondant code binaire chargé E n t r e r une commande: dasm ====> Section . t e x t : 00400018: 20033039 0040001C: 0C10000B 00400020: 00000000 00400024: 10000005 00400028: 00000000 0040002C: 3C010040 00400030: AC231044 00400034: 03E00008 00400038: 00000000 ====> Section . data : 0040103C: AB000000 00401040: 00401044 00401044: 00000000 ====> Section . bss : 00401048: 00000000 0040104C: 00000000 00401050: 00000000 E n t r e r une commande: ADDI $v1 , $zero , 0x3039 JAL 0x0040002C SLL $zero , $zero , 0x00 BEQ $zero , $zero , 0x0040003C SLL $zero , $zero , 0x00 L U I $at , 0x0040 SW $v1 , 0x1044 ( $at ) JR $ra SLL $zero , $zero , 0x00 Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 41 / 52 État de la machine dreg, sreg: affichage/modification des valeurs des registres dmem, smem: affichage/modification des valeurs en mémoire clear, help, quit Entrer $zero : $a0 : $t0 : $t4 : $s0 : $s4 : $t8 : $gp : $hi : une commande: dreg 00000000 $at : 00000000 000004DC $a1 : 000004D1 00000000 $t1 : 00000000 FFFF89A3 $t5 : FFFF1346 00000000 $s1 : 00000000 00000000 $s5 : 0000000A 00000000 $t9 : 00000000 00000000 $sp : 004 FFFFF 00000000 $lo : 00000000 $v0 : $a2 : $t2 : $t6 : $s2 : $s6 : $k0 : $fp : $pc : 00000000 FFFF84D1 000009AE 00000000 00000000 FFFFFFF6 00000000 00000000 00400060 $v1 : $a3 : $t3 : $t7 : $s3 : $s7 : $k1 : $ra : 000004D2 FFFFFFFD FFFF89A3 00000000 00000000 FFFF7FFF 00000000 00000000 Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 42 / 52 Exécution run: exécute les instructions jusqu’à la fin / point d’arrêt step, stepi : exécution pas à pas (ligne à ligne ou exacte) • Mise à jour registre PC (instruction suivante) • Effectue de travail de l’instruction courante (mise à jour registres, mémoire) addbp, rmbp, dp : ajoute, enlève affiche les points d’arrêts dans le code E n t r e r une commande: Execution en E n t r e r une commande: Execution en DELAY SLOT : step 00400018: ADDIU 0 1 = 1 step 0040001C: BEQ 0 0 1c => branchement en 40003c Execution en 00400020: SLL 0 0 = 0 Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 43 / 52 Plan 1 Introduction 2 Déroulement du projet 3 Simulateur de microprocesseur MIPS 4 Travail à réaliser Spécifications du simulateur Modules fournis Cahier des charges Conseils Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 44 / 52 Modules fournis 1. Deux éléments de squelette pour aider à démarrer le projet : shell minimaliste, qui ne gère que quelques commandes mais vous permettra de démarrer facilement syntaxeMIPS une description de la syntaxe des registres la syntaxe n’est là qu’à titre d’exemple: libre à vous de ne pas vous en servir! le code du shell n’est pas fourni (seulement shell.h + un fichier objet compilé), vous n’avez accès qu’aux fonctions appelées par les commandes reconnues vous devrez de toutes façons écrire votre propre module de shell pour avancer dans le projet! Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 45 / 52 Modules fournis 2. Trois modules fondamentaux : elfReader permet d’extraire les données d’un fichier au format ELF: code binaire des sections .text et .data, table des symboles, table des chaı̂nes, tables de relocations, ... relocation permet de reloger les symboles et sections aux adresses indiquées framebuffer permet de gérer simplement l’affichage graphique disponibles: les fichiers .h, les fichiers objets .o, l’API des modules dans un premier temps, vous devrez utiliser ces modules Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 46 / 52 Main Page File List Data Structures Files Globals re location.h File Re fe re nce Module de relocation des données extraites d'un f ichier ELF. More... Go to the source code of this f ile. Data Structures Date: printemps 2010 Define Docum entation #define _RELOCATION_ 1 Symbole Structure représentant un sy mbole dans un f ormat "clair". More... Defines #def ine Version: 1.1 Def inition in f ile relocation.h. #include "elfReader.h" struct Author: [email protected] r Def inition at line 38 of f ile relocation.h. Function Docum entation _RELOCATION_ 1 Functions void relogeSection ( uint32_t uint8_t * v oid v oid scnAdr, scnData, Elf32_Rel * relData, v oid traduitTableSymboles (Elf 32_Sy m *sy mtab, size_t sy mtabSize, char *strtab, Symbole **tableSy mboles, size_t *nbSy mboles) Traduit une table des sy mboles au f ormat ELF en f ormat "clair". size_t relSize, Symbole * tableSymboles relogeSymboles (Elf 32_Sy m *sy mtab, size_t sy mtabSize, char *strtab, uint32_t adrText, uint32_t adrData, uint32_t adrBss, Symbole **tableSy mboles, size_t *nbSy mboles) Reloge les sy mboles d'une table ELF. Reloge une section d'instruction ou de données. relogeSection (uint32_t scnAdr, uint8_t *scnData, Elf 32_Rel *relData, size_t relSize, Symbole *tableSy mboles) Reloge une section d'instruction ou de données. Reloge une section à partir de ses données initiales, de sa table de relocation associée, et d'une table de sy mboles déjà relogée. Detailed Description Module de relocation des données extraites d'un f ichier ELF. Ensimag 2010, première année. Introduction Les données contenues dans un f ichier ELF peuv ent être accompagnées d'inf ormations permettant de reloger les sy mboles et les sections d'instructions (.text) et de données (.data, .bss) à des adresses mémoires spécif iques. Ce module f ournit un ensemble de f onctions permettant: ) L'adresse scnAdr doit naturellement correspondre à celle ay ant été utilisé pour reloger les sy mboles av ec la f onction relogeSymboles. Parameters: [in] [in,out] [in] [in] [out] scnAdr scnData relData relSize tableSymboles l'adresse où reloger la section les octets de la section, av ant puis après relogement la table de relocation associée à la section le nombre d'entrées dans la table de relocation la table des sy mboles relogée void relogeSymboles ( Elf32_Sym * symtab, size_t symtabSize, char * strtab, uint32_t adrText, uint32_t adrData, Les données en entrée de ces f onctions sont les inf ormations brutes issues du f ichier ELF, lues à l'aide du module elfReader. uint32_t adrBss, Symbole ** tableSymboles, Note: size_t * nbSymboles 1. de récuperer les sy mboles dans un f ormat "clair" (nom, adresse) 2. d'extraire les sy mboles (absolus) d'un f ichier ELF executable 3. de reloger les sy mboles et les sections d'un f ichier ELF relogeable Outre l'API, un f ichier objet binaire correspondant à ce module v ous est f ourni. Vous pouv ez ainsi charger des donnees relogées dans v otre simulateur. Il v ous rev ient ensuite de remplacer le f ichier objet f ourni pas v otre propre implémentation de ce module! Compilation Ce module utilise elfReader et la librairie libelf. Voir la documentation de elfReader.h. ) Reloge les sy mboles d'une table ELF. Les adresses des sy mboles sont relogées à partir des adresses de section déf inies en paramètres. Puis, une table de sy mboles identique à celle générée par traduitTableSymboles est construite. Plan 1 Introduction 2 Déroulement du projet 3 Simulateur de microprocesseur MIPS 4 Travail à réaliser Spécifications du simulateur Modules fournis Cahier des charges Conseils Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 47 / 52 Cahier des charges 1. Objectifs minimums: représentation de la machine MIPS (mémoire, registres...) intégralité des fonctionnalités: chargement, désassemblage, exécution, etc. simulateur validé! Cette implantation minimale devra s’appuyer sur les modules fournis pour la lecture d’un fichier ELF et la relocation. 2. Extensions du projet: Réécriture des modules fournis ELF Amélioration du shell (ergonomie, historique, complétion...) Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 48 / 52 Plan 1 Introduction 2 Déroulement du projet 3 Simulateur de microprocesseur MIPS 4 Travail à réaliser Spécifications du simulateur Modules fournis Cahier des charges Conseils Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 49 / 52 Conseils (1) Familiarisez-vous avec l’assembleur MIPS et le format ELF avant de commencer le projet Plusieurs outils disponibles (cf. Kiosk/Ensiwiki): • mips-as et mips-gcc : as et gcc cross-compilés pour une cible MIPS. • mips-objdump, mips-readelf: permettent d’étudier le contenu d’un fichier objet relogeable au format ELF • mips-gdb : simulation d’un programme à partir d’un exécutable ELF. En gros votre projet? Créez une base de tests écrits en langage assembleur Utilisez les outils ci-dessus pour • comprendre le codage et les informations de relocation • comparer le désassemblage et la relocation de votre simulateur avec ceux des binutils! Avancé: • créez des tests en langage C (voir wiki) • comparez votre exécution avec celle de mips-gdb! Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 50 / 52 Conseils (2) Passez du temps à réfléchir à la conception de votre programme et à votre organisation avant de commencer à coder répartissez-vous bien les tâches inter-agissez Mieux vaut faire une petite partie du début à la fin que de tout commencer et que rien ne fonctionne ne testez pas tout à la fin mais au fur et à mesure Pensez à gérer les erreurs qui peuvent se produire, même celles qui ne devraient pas se produire (programmation défensive) Utilisez gdb, ddd, valgrind et/ou faites des traces dans votre programme pour déboguer facilement Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 51 / 52 The End Bon courage & Enjoy! Projet Logiciel en C - Sujet 1 : Simulateur de microprocesseur MIPS - | 52 / 52