MIPS User Mode Application Quiz
45 Questions
3 Views

Choose a study mode

Play Quiz
Study Flashcards
Spaced Repetition
Chat to Lesson

Podcast

Play an AI-generated podcast conversation about this lesson

Questions and Answers

Quel est le rôle principal du gestionnaire de syscall?

  • Optimiser le registre $2 pour un meilleur rendement.
  • Gérer uniquement les erreurs lors des appels systèmes.
  • Trouver et appeler une fonction de service demandée en C. (correct)
  • Exécuter directement le code C sans intermédiaire.
  • Que doivent contenir les registres $4 à $7 lors d'un appel de fonction?

  • Les adresses des variables locales de la fonction.
  • Les arguments de la fonction à appeler. (correct)
  • Des valeurs par défaut à utiliser dans les calculs.
  • Le numéro du service et les réponses des fonctions.
  • Quel est l'emplacement du pointeur de pile pour un appel de syscall?

  • Vers la première case réservée pour le deuxième argument.
  • Sur la dernière case de la pile, après les arguments.
  • Pointant au début de la mémoire allouée pour la fonction.
  • Pointant vers une zone vide de 4 entiers suivis du numéro de service. (correct)
  • Pourquoi le gestionnaire de syscall ajoute-t-il un cinquième argument?

    <p>Pour gérer plusieurs syscalls avec une fonction unique. (A)</p> Signup and view all the answers

    Quel type d'instruction est utilisé pour appeler une fonction et passer le contrôle?

    <p>jal (C)</p> Signup and view all the answers

    Quel est le rôle principal de la fonction kinit() dans l'exécution d'une application utilisateur?

    <p>Initialiser la pile d'exécution du noyau (A)</p> Signup and view all the answers

    À quel moment s'arrête l'exécution d'une application utilisateur simple dans le MIPS?

    <p>Lorsque la fonction exit() est exécutée (A)</p> Signup and view all the answers

    Quelles structures de données le noyau initialise-t-il lors du démarrage de l'application?

    <p>Les variables globales non initialisées (B)</p> Signup and view all the answers

    Quelle fonction est le point d'entrée pour la gestion des services dans le noyau?

    <p>kentry (B)</p> Signup and view all the answers

    Quel est l'objectif principal du schéma présenté dans le cours?

    <p>Expliquer les interactions entre le code boot, le noyau et les applications (D)</p> Signup and view all the answers

    Quelle fonction est initialisée par le noyau après l'appel à kinit()?

    <p>_start() (A)</p> Signup and view all the answers

    Que fait la fonction _start() dans le processus d'exécution d'une application?

    <p>Elle initialise les variables globales (B)</p> Signup and view all the answers

    Quel aspect n'est pas généralement géré par la fonction syscall dans le noyau?

    <p>Interruption du programme (D)</p> Signup and view all the answers

    Quel est le rôle principal d'un Makefile?

    <p>Décrire le processus de construction d'un fichier cible à partir de fichiers source. (C)</p> Signup and view all the answers

    Quelle est la caractéristique des cibles intermédiaires dans un Makefile?

    <p>Elles se basent sur des fichiers sources spécifiques. (A)</p> Signup and view all the answers

    Que produisent les règles dans un Makefile lorsqu'elles sont exécutées?

    <p>Un arbre de dépendances pour les fichiers. (D)</p> Signup and view all the answers

    Que permet un Makefile en termes de modification de fichiers sources?

    <p>La reconstruction partielle du fichier cible lorsque quelques fichiers sources changent. (B)</p> Signup and view all the answers

    Quelle commande est utilisée pour générer la cible finale kernel.x dans un Makefile?

    <p>$(LD) -o $@ -T $^ (B)</p> Signup and view all the answers

    Quels fichiers sont presque toujours considérés comme des cibles intermédiaires?

    <p>Fichiers objets (.o). (D)</p> Signup and view all the answers

    À quoi servent les variables automatiques dans un Makefile?

    <p>Elles facilitent la référence aux fichiers dans des règles sans avoir à les nommer explicitement. (C)</p> Signup and view all the answers

    Quel type d'exécutable ne sera pas produit dans la simulation du logiciel décrite?

    <p>Exécutable de démonstration. (D)</p> Signup and view all the answers

    Quelle condition permet à l'adresse X d'être accessible dans l'espace d'adressage MIPS?

    <p>X doit être inférieur à 0x80000000. (D)</p> Signup and view all the answers

    Quel registre du coprocesseur 0 contient l'adresse de l'instruction ayant provoqué un appel au noyau?

    <p>c0_cause (D)</p> Signup and view all the answers

    Quelle est la conséquence de référencer le registre $14 sans préciser s'il appartient au GPR ou au coprocesseur 0?

    <p>On risque de confondre son usage et sa valeur. (D)</p> Signup and view all the answers

    Quel registre du coprocesseur 0 contient le nombre de cycles depuis le démarrage du MIPS?

    <p>c0_count (A)</p> Signup and view all the answers

    Quel est le rôle principal du registre c0_sr?

    <p>Il contient le mode d'exécution et le bit d'autorisation des interruptions. (B)</p> Signup and view all the answers

    Quelles instructions sont utilisées pour manipuler les registres du coprocesseur 0?

    <p>mtc0 et mfc0 (A)</p> Signup and view all the answers

    Quel registre c0_epc est désigné par quel numéro?

    <p>$14 (B)</p> Signup and view all the answers

    Quel registre contient une adresse mal formée due à un accès non aligné?

    <p>c0_bar (C)</p> Signup and view all the answers

    Quelle est l'adresse en mémoire de __tty_regs_map.read si NTTYS est égal à 2?

    <p>0xd0200018 (A)</p> Signup and view all the answers

    Quel est le rôle du mot clé 'extern' dans le contexte de C?

    <p>Il informe que la variable est définie ailleurs. (A)</p> Signup and view all the answers

    Quel est le type de __tty_regs_map selon la déclaration donnée?

    <p>volatile struct tty_s (C)</p> Signup and view all the answers

    À quoi sert le mot clé 'volatile' en C?

    <p>À indiquer que la variable peut changer de valeur à tout moment. (D)</p> Signup and view all the answers

    Quelle est la taille de chaque structure dans le tableau __tty_regs_map?

    <p>16 octets (A)</p> Signup and view all the answers

    Quel élément est situé à l'adresse 0xd0200000 selon la définition de __tty_regs_map?

    <p>Le champ write de la première structure. (D)</p> Signup and view all the answers

    Quel est le contenu exact de la ligne 15 dans le code fourni?

    <p>int status; // adresse d'état du tty (D)</p> Signup and view all the answers

    Quel type de variable est __tty_regs_map déclaré comme étant dans le fichier harch.c?

    <p>Un tableau de structures. (C)</p> Signup and view all the answers

    Quelle instruction permet de copier la valeur du registre c0_epc dans le registre général $8 ?

    <p>mfc0 $8, $14 (A)</p> Signup and view all the answers

    Quelle instruction doit être exécutée pour écrire la nouvelle valeur de c0_epc après l'avoir augmentée de 4 ?

    <p>mtc0 $8, $14 (D)</p> Signup and view all the answers

    Quel est le rôle du bit 0 du registre status (c0_sr) ?

    <p>Masquer les interruptions (A)</p> Signup and view all the answers

    Que signifie le code 4 dans le champ XCODE du registre cause (c0_cause) ?

    <p>Interruption du matériel (D)</p> Signup and view all the answers

    Dans quelle plage de bits se trouve le code de la cause d'entrée dans le noyau dans le registre cause ?

    <p>Bits 2 à 5 (A)</p> Signup and view all the answers

    Quelle instruction doit être utilisée pour augmenter c0_epc de 4 ?

    <p>addiu $8, $8, 4 (A)</p> Signup and view all the answers

    Quel est le rôle du bit 4 de l'octet 0 du registre status ?

    <p>Indiquer si le système est en mode utilisateur (A)</p> Signup and view all the answers

    Quel est l'effet de l'instruction 'mtc0 $GPR, $C0' ?

    <p>Déplacer une valeur d'un registre général vers un registre de coprocesseur (D)</p> Signup and view all the answers

    Flashcards

    Mode noyau

    Le mode d'exécution du système où l'accès aux ressources du système est autorisé, notamment pour les opérations critiques comme la gestion de la mémoire, l'accès aux périphériques et l'exécution de code privilégié.

    Mode utilisateur

    Le mode d'exécution du système où les applications s'exécutent sans avoir accès direct au matériel ni aux opérations critiques du système.

    Fonction _start()

    La fonction principale qui sert de point d'entrée pour l'exécution de l'application utilisateur. Elle est appelée par le noyau après l'initialisation de l'application. Elle peut initialiser les variables globales non initialisées, puis appeler la fonction main().

    Fonction kentry()

    Le point d'entrée du noyau pour la gestion des services. Il permet aux applications utilisateur de demander des services système en effectuant des appels système.

    Signup and view all the flashcards

    Gestionnaire d'appel système

    Un système de gestion des appels système qui permet aux applications utilisateur de faire des appels système au noyau pour obtenir des services système.

    Signup and view all the flashcards

    Fonction kinit()

    Une fonction système qui initialise les structures de données internes du noyau, notamment les variables globales non initialisées, et prépare le système pour l'exécution des applications utilisateur. Elle est appelée par le code de démarrage.

    Signup and view all the flashcards

    Routine app_load()

    Une routine qui charge l'application utilisateur en mémoire et prépare l'exécution de sa fonction _start().

    Signup and view all the flashcards

    Fonction exit()

    Une fonction de la bibliothèque standard qui permet de terminer l'exécution d'un programme et de renvoyer un code de sortie au système d'exploitation.

    Signup and view all the flashcards

    Rôle du registre $2

    Le registre $2 est utilisé pour stocker l'adresse de la fonction C que le gestionnaire de syscall doit appeler.

    Signup and view all the flashcards

    Rôle des registres $4 à $7

    Les registres $4 à $7 sont utilisés pour transmettre les arguments à la fonction C.

    Signup and view all the flashcards

    Position du pointeur de pile lors d'un appel de fonction

    Le pointeur de pile pointe vers l'espace réservé au premier argument de la fonction, les cases suivantes étant réservées aux arguments suivants.

    Signup and view all the flashcards

    Instruction pour appeler une fonction C

    L'instruction jal est utilisée pour sauter à l'adresse de la fonction C stockée dans le registre $2.

    Signup and view all the flashcards

    Cinquième argument pour les syscalls

    Le gestionnaire de syscall ajoute le numéro de service comme cinquième argument à la fonction C. Cela permet de gérer plusieurs services avec une seule fonction en utilisant un switch/case.

    Signup and view all the flashcards

    Adressage mappé

    Une adresse X est mappée dans l'espace d'adressage si elle se trouve dans un segment d'adresses utilisables par le MIPS. Le MIPS peut alors lire et écrire à cette adresse, car il y a une case mémoire correspondante. Les adresses inférieures à 0x80000000 sont toujours accessibles, tandis que celles supérieures ou égales nécessitent le mode kernel.

    Signup and view all the flashcards

    Registres GPR et coprocesseur 0

    Les registres à usage général (GPR) sont dédiés aux calculs et sont numérotés de $0 à $31. Le coprocesseur 0 offre un autre ensemble de registres pour le système d'exploitation.

    Signup and view all the flashcards

    Registre c0_sr

    Le registre c0_sr stocke le mode d'exécution du MIPS et l'état des interruptions. Il est situé à l'adresse $12 du coprocesseur 0.

    Signup and view all the flashcards

    Registre c0_cause

    Le registre c0_cause est situé à l'adresse $13 du coprocesseur 0. Il contient la raison de l'appel au noyau, comme une interruption ou une exception.

    Signup and view all the flashcards

    Registre c0_epc

    Le registre c0_epc, situé à l'adresse $14 du coprocesseur 0, stocke l'adresse de la prochaine instruction à exécuter après le retour du noyau.

    Signup and view all the flashcards

    Registre c0_bar

    Le registre c0_bar, situé à $8 du coprocesseur 0, stocke l'adresse incorrecte lors d'un accès non aligné en mémoire.

    Signup and view all the flashcards

    Registre c0_count

    Le registre c0_count, situé à $9 du coprocesseur 0, compte le nombre de cycles depuis le démarrage du MIPS.

    Signup and view all the flashcards

    Instructions mtc0 et mfc0

    Les instructions mtc0 et mfc0 permettent de manipuler les registres du coprocesseur 0. mtc0 copie une valeur d'un registre GPR vers un registre du coprocesseur 0, tandis que mfc0 fait l'inverse.

    Signup and view all the flashcards

    Instructions mtc0 et mfc0

    Les instructions mtc0 et mfc0 servent à déplacer des données entre un registre GPR et un registre du coprocesseur 0. mtc0 $GPR, $C0 copie la valeur du registre GPR dans le registre $C0 du COPRO_0. mfc0 $GPR, $C0 copie la valeur du registre $C0 du COPRO_0 dans le registre GPR .

    Signup and view all the flashcards

    Modification des registres du coprocesseur 0

    Les registres du coprocesseur 0, comme c0_epc, ne peuvent pas être manipulés par des instructions arithmétiques courantes. Pour modifier un registre du coprocesseur 0, on doit utiliser les instructions mtc0 et mfc0 pour copier sa valeur vers un registre GPR, la modifier, puis copier la nouvelle valeur dans le registre du coprocesseur 0.

    Signup and view all the flashcards

    Bit 0 du registre c0_sr (IE)

    Le bit 0 du registre c0_sr (status) contrôle l'état des interruptions. 0 signifie que les interruptions sont masquées, et 1 signifie qu'elles sont autorisées si les bits EXL et ERL sont à 0.

    Signup and view all the flashcards

    Bit 1 du registre c0_sr (EXL)

    Le bit 1 du registre c0_sr (status) indique le niveau d'exception. 1 indique un niveau d'exception pour le mode kernel, ce qui signifie que les interruptions sont masquées. Si c'est 0, le MIPS est en mode kernel et les interruptions sont autorisées selon les valeurs des bits EXL et ERL.

    Signup and view all the flashcards

    Bit 4 du registre c0_sr (UM)

    Le bit 4 du registre c0_sr (status) indique le mode d'exécution. 1 signifie que le MIPS est en mode utilisateur. En mode utilisateur, les interruptions ne sont autorisées que si les bits EXL et ERL sont à 0.

    Signup and view all the flashcards

    Codes 0 et 8 dans c0_cause

    Le code 0 dans le registre c0_cause indique une interruption hardware, tandis que le code 8 indique un appel système. Ce code est stocké dans le champ XCODE du registre c0_cause.

    Signup and view all the flashcards

    Zone BSS

    La zone BSS (Block Started by Symbol) est une zone mémoire non initialisée dans un programme. Elle est déclarée dans le fichier ldscript à l'aide des variables __bss_origin (début) et __bss_end (fin).

    Signup and view all the flashcards

    Mot-clé extern

    Le mot-clé extern indique au compilateur qu'une variable est définie dans un autre fichier et qu'il ne faut pas la déclarer à nouveau. On peut ainsi accéder à la variable depuis un autre fichier sans avoir à la redéfinir.

    Signup and view all the flashcards

    Mot-clé volatile

    Le mot-clé volatile informe le compilateur qu'une variable peut être modifiée de façon imprévisible par un agent externe (par exemple un programme d'interruption). Le compilateur ne peut pas optimiser son accès mémoire en l'enregistrant dans un registre, car la valeur pourrait changer à tout moment.

    Signup and view all the flashcards

    Code en langage assembleur

    Les instructions du code de démarrage de l'ordinateur (boot) et l'entrée dans le noyau (kentry) après l'exécution d'un appel système (syscall) sont souvent écrites en langage assembleur. Ceci est nécessaire car ces opérations requièrent un contrôle précis sur le matériel et ne peuvent pas être facilement réalisées en langage C.

    Signup and view all the flashcards

    Variable __tty_regs_map

    La variable __tty_regs_map est un tableau de structures tty_s. Chaque structure représente les registres d'un terminal (TTY). La déclaration extern volatile struct tty_s __tty_regs_map[NTTYS]; dans le fichier harch.c indique que le tableau existe dans un autre fichier (le fichier ldscript kernel.ld) et que les registres peuvent être modifiés de façon imprévisible. Donc le compilateur doit accéder au registre en mémoire à chaque fois qu'il est utilisé.

    Signup and view all the flashcards

    Adresse du registre __tty_regs_map.read

    Lors de la lecture d'un registre de terminal __tty_regs_map.read, l'adresse physique correspond à l'adresse de base du tableau __tty_regs_map plus l'offset qui correspond à la position du champ read dans la structure tty_s. Dans ce cas, l'adresse est 0xd0200000 + 0x18 = 0xd0200018.

    Signup and view all the flashcards

    Structure tty_s

    La structure tty_s est un type de données composé de 4 entiers qui représentent les registres d'un terminal (TTY) : write, status, read, unused. La structure est définie dans le fichier harch.c et utilisée pour manipuler les registres du terminal depuis le code C.

    Signup and view all the flashcards

    Qu'est-ce qu'un Makefile ?

    Le rôle d'un Makefile est de décrire comment assembler un fichier cible à partir de fichiers source en utilisant des commandes du shell. Il permet également de reconstruire partiellement le fichier cible si les fichiers source changent.

    Signup and view all the flashcards

    Cibles finales et intermédiaires dans un Makefile (Exemple)

    La cible finale est le fichier résultant de la compilation et de la liaison de tous les fichiers source. Dans l'exemple, c'est l'exécutable kernel.x. Les cibles intermédiaires sont des fichiers créés temporairement lors du processus de compilation, comme les fichiers objet .o.

    Signup and view all the flashcards

    Variables automatiques de make

    Les variables automatiques de make sont des variables prédéfinies qui contiennent des informations sur les fichiers source et les cibles. Par exemple, $^ représente tous les fichiers source dépendants d'une règle, $@ représente la cible de la règle.

    Signup and view all the flashcards

    Sources dans un Makefile (Exemple)

    Les sources sont les fichiers source utilisés pour construire la cible finale. Dans l'exemple, les sources sont hcpua.S, hcpu.h.

    Signup and view all the flashcards

    Règle Makefile pour kernel.x

    La règle kernel.x : kernel.ld obj/hcpua.o obj/kinit.o obj/klibc.o obj/harch.o indique que le fichier kernel.x dépend de kernel.ld et des fichiers objet .o. La commande $(LD) -o $@ -T $^ utilise le lien $(LD) pour assembler les fichiers objet et créer kernel.x. La commande $(OD) -D $@ > [email protected] utilise un décompilateur $(OD) pour générer un fichier assembleur .s à partir de l'exécutable kernel.x.

    Signup and view all the flashcards

    Règle Makefile pour obj/hcpua.o

    La règle obj/hcpua.o : hcpua.S hcpu.h indique que le fichier objet obj/hcpua.o dépend de hcpua.S et hcpu.h. La commande $(CC) -o $@ $(CFLAGS) $< compile le fichier source hcpua.S en utilisant le compilateur $(CC), les options de compilation $(CFLAGS) et créé le fichier objet. La commande $(OD) -D $@ > [email protected] utilise un décompilateur $(OD) pour générer un fichier assembleur .s à partir du fichier objet obj/hcpua.o.

    Signup and view all the flashcards

    Study Notes

    Application simple en mode utilisateur

    • Le schéma illustre l'exécution d'une application simple dans MIPS, du démarrage du SoC à l'appel de exit().
    • L'objectif est de comprendre les interactions entre le code de démarrage, le noyau, l'application et les bibliothèques.

    Modes d'exécution MIPS

    • Le MIPS propose deux modes d'exécution : kernel et user.
    • Le noyau fonctionne en mode kernel.
    • L'application fonctionne en mode user.

    Espace d'adressage MIPS

    • L'espace d'adressage MIPS est l'ensemble des adresses que le processeur peut atteindre (232 adresses d'octets).
    • Une adresse X est mappée dans l'espace d'adressage si le MIPS peut lire ou écrire à cette adresse.
    • Une adresse supérieure à 0x80000000 n'est accessible qu'en mode kernel.

    Registres du coprocesseur 0

    • Les registres du coprocesseur 0 sont utilisés par le système d'exploitation.
    • c0_sr (registre $12) : contient le mode d'exécution et les autorisations d'interruptions.
    • c0_cause (registre $13) : contient la cause de l'appel au noyau.
    • c0_epc (registre $14) : contient l'adresse de l'instruction qui a provoqué l'appel au noyau ou l'adresse de l'instruction suivante.
    • D'autres registres existent (c0_bar, c0_count, c0_procid).

    Instructions mtc0 et mfc0

    • mtc0 : déplace une valeur d'un registre général vers un registre du coprocesseur 0.
    • mfc0 : déplace une valeur d'un registre du coprocesseur 0 vers un registre général.
    • Seules ces instructions sont utilisables pour manipuler les registres du coprocesseur 0.

    Registre Status (c0_sr)

    • Bits importants :
      • Bit 0 (IE) : Active/désactive les interruptions.
      • Bit 1 (EXL) : Indique si le MIPS est en mode exception.
      • Bits 4 (UM) : Indique si le MIPS est en mode utilisateur.

    Registre Cause (c0_cause)

    • Le champ XCODE contient le code de la cause d'entrée dans le noyau.
    • Codes importants :
      • Code 0 : interruption.
      • Code 8 : syscall.

    Registre EPC (c0_epc)

    • Contient l'adresse de l'instruction qui a déclenché une exception ou un appel système.

    Instructions en mode kernel

    • mtc0, mfc0, eret : sont les trois instructions utilisables en mode kernel.

    Adresse d'entrée noyau

    • Au démarrage, le code de démarrage saute à l'adresse de la fonction kinit().
    • Après le démarrage, l'adresse d'entrée noyau est 0x80000180.

    Passage noyau-application

    • syscall : l'instruction pour demander un service au noyau.
    • eret : l'instruction pour revenir à l'application depuis le noyau.

    Initialisation application

    • La fonction _start initialise les variables globales non initialisées, puis appelle main().
    • Au retour de main(), _start réalise l'appel système exit().

    Placement en mémoire

    • L'éditeur de liens place les fonctions et variables en mémoire.
    • Les fichiers idscript (par exemple kernel.ld ou user.ld) contrôlent le placement.

    Passage noyau-application

    • L'adresse de _start est déterminée par les fichiers idscript.
    • Le noyau peut accéder à l'adresse de _start grâce au idscript.

    Registres $26 et $27

    • Registres généraux (GPR) temporaires utilisés par le noyau.
    • L'utilisateur perd leur valeur si le noyau les modifie.

    Gestionnaire de syscall

    • Le noyau utilise le vecteur de syscall pour gérer les appels.
    • La fonction syscall collecte les arguments et appelle la fonction correspondante.

    Studying That Suits You

    Use AI to generate personalized quizzes and flashcards to suit your learning preferences.

    Quiz Team

    Related Documents

    Description

    Ce quiz aborde les concepts fondamentaux liés à l'exécution d'applications simples en MIPS, en explorant le fonctionnement des modes d'exécution et l'espace d'adressage. Il teste également votre compréhension des registres du coprocesseur 0 et des interactions entre les différents composants du système. Préparez-vous à plonger dans l'univers de l'architecture MIPS !

    More Like This

    MIPS Registers Naming Quiz
    8 questions
    MIPS Architecture Features Quiz
    10 questions
    Chapitre III: Architecture Mono-cycle ISA MIPS
    15 questions
    Use Quizgecko on...
    Browser
    Browser