Version 11 (modified by 4 years ago) (diff) | ,
---|
Questions - Réponses pour la préparation de la session 2 de l'année 2019-2020
A propos du format du sujet
- Où et quand ?
L'examen se déroulera dans l'amphi 34B sur le campus Pierre et Marie Curie le mercredi 1er juillet 2020.
- Est-ce que c'est un sujet "standard" ?
Hormis le fait qu'il n'y a que 3 parties, ce sera un sujet standard. Vous pouvez vous référer aux annales corrigées.- Assembleur
- Cache
- GIET et un peu d'archi (probablement un QCM)
- Documents
Seuls les fascicules sur le GIET et le MIPS (architecture et assembleur) sont autorisés.
Programmation assembleur
- Qui fait le prologue et l’épilogue la fonction appelante ou la fonction appelée ?
C'est la fonction appelée qui a un prologue et un épilogue.
Lorsque fonctionf()
appelle une fonctiong()
, elle se contente de placer les arguments dans les registres$4
à$7
et de faire un saut àg()
par >l'instructionjal g
.Prologue
Lorsqu'on commence à exécuterg
, il faut exécuter un prologue dont voici les étapes :- créer le contexte d'exécution dans la pile pour
g()
avec l'instructionaddiu $29, $29, -X
oùX
est le nombre d'octets pris dans la pile (c'est > >toujours un multiple de 4). CesX
octets vont servir à trois choses :- sauver la valeur des registres persistants que
g()
va utiliser dont$31
. - réserver de la place pour les variables locales de la fonction
g()
- réserver de la place pour les arguments des fonctions que
g()
va appeler.
- sauver la valeur des registres persistants que
- Sauver les registres persistants que
g()
va utiliser dans la place réservée pour eux à l'étape précédente
C'est donc une suite desw $x, d($29)
oùd
est toujours positif et multiple de 4. - Sauver les arguments reçus par
g()
(dans$4
à$7
) à la place réservée parf()
(c'est-à-dire dans le contexte def()
).
Cette étape n'est pas toujours présente, elle n'est utile que sig()
appelle elle-même. des fonctions et qu'elle a donc besoin de changer la valeur des registres$4
à$7
alors qu'elle en a besoin après ses fonctions appelées.
Epilogue
Avant de sortir deg
on doit exécuter l'épilogue qui consiste à :- restaurer l'état des registres persistants sauvés lors du prologue avec une séquence de
lw $x, d($29)
- restaurer l'état du pointeur de pile
addiu $29, $29, X
- créer le contexte d'exécution dans la pile pour
- Quand on est en mode user peut on masquer les interruptions ?
Non, c'est impossible parce que pour masquer les interruptions, il faut :
- soit écrire dans le registre status en utilisant l'instruction mtc0.
Or cette instruction est interdite en mode user, l'utiliser provoque une exception. - soit écrire dans le registre de masque de l'ICU dont l'adresse est "mappée" (placée) au-delà de 0x80000000.
Or y écrire est interdit en mode user, cela provoque une exception.
- soit écrire dans le registre status en utilisant l'instruction mtc0.
Rappel de cours sur les caches
Je vous recommande de revoir les transparents des 2 cours sur les caches (Hiérarchie mémoire et techniques de cache et Caches (suite)).
- ligne de cache et case de cache.
Je vais faire l'hypothèse que vous avez compris ce qu'est une ligne de cache et une case de cache.
Le cache lit des lignes en mémoire et il les copie dans ces cases.
- Numéro de ligne
Les lignes sont des segments d'adresse de 8 ou 16 ou 32 ou 64 octets alignés en mémoire (l'adresse du premier octet est un multiple de sa taille).
Les lignes sont numérotées et pour connaitre dans quelle numéro de ligne se trouve un octet quelconque, il suffit de diviser l'adresse de l'octet par la taille d'une ligne.
- Case de cache et correspondance directe.
Quand le cache lit une ligne en mémoire, il doit la placer dans l'une de ces cases.
Dans un cache à correspondance directe, le numéro de la case choisie ne dépend que du numéro de la ligne.