Accueil Démo Exercices formatifs Travaux pratiques Simulation libre ❯
Sessions sauvegardées
|
TP5: Gestion d'une mémoire paginéeCe travail pratique vaut 5% de la note totale du cours. Comme le stipule le plan de cours, le travail doit être fait individuellement. ObjectifsCe travail pratique vise les objectifs suivants:
PréparationImportant: lisez attentivement tout l'énoncé avant de commencer à travailler! Il contient plusieurs informations qui vous seront très utiles. Ce TP ne contient pas de questions à répondre sur le portail des cours. Le fichier SurvolDans ce TP, vous devrez mettre en place un système d'allocation pour une mémoire paginée. Ce système est très similaire à celui utilisé dans les ordinateurs modernes. Toutefois, dans le contexte de ce TP, nous utiliserons un système contenant beaucoup moins de mémoire que ce que doit gérer votre ordinateur ou votre téléphone intelligent. Ce système possède les caractéristiques suivantes:
Afin de faciliter votre tâche, nous avons déjà découpé le code à produire en plusieurs fonctions, que vous pourrez programmer et tester indépendamment. Vous trouverez plus d'informations sur chacune de ces fonctions dans la section détails ci-bas. Lorsque vous aurez terminé, téléchargez tout d'abord votre fichier Pour toutes questions concernant la procédure de remise ou le travail lui-même, posez vos questions sur Piazza! Détails1. Présentation généraleLe simulateur ne pouvant directement émuler un disque dur, nous utiliserons plusieurs zones dans sa mémoire de données pour simuler un système tel que décrit à la section précédente. Trois zones sont ainsi déclarées dans la mémoire de données:
Afin de faciliter leur visualisation dans l'afficheur mémoire du simulateur, toutes ces sections sont séparées par des espaces vides. MaRAM est l'espace que nous utiliserons pour simuler la RAM de votre système à mémoire paginé. Ainsi, lorsque l'on parlera d'aller lire une donnée à l'adresse 2. Accès à la mémoire paginéeDans un "vrai" système à mémoire paginée, la pagination devrait être transparente aux programmes, c'est-à-dire que toutes les instructions
; Equivalent de LDR Rx, [Ry] MOV R8, Ry BL LoadVirtuel ; Effectue le "LDR". Après, R9 contient la valeur de Rx De la même manière, une écriture en mémoire comme
; Equivalent de STR Rx, [Ry] MOV R8, Ry MOV R9, Rx BL StoreVirtuel ; Effectue le "STR" Les fonctions 3. Les structures de donnéesAfin de remplir la tâche demandée, vous aurez besoin de trois structures de données : la table de pages, la table de pages inverse et les compteurs d'accès. Ces structures correspondent à ce qui a été vu dans le cours sur la gestion de la mémoire. 3.1 La table de pagesLa table de pages est la structure qui fait le lien entre les pages et les trames présentes en RAM. Dans ce TP, vous utilisez une mémoire virtuelle de 20 pages, il y a donc 20 entrées dans cette table. Elle est située à l'adresse ![]() Dans ce cas-ci, la table de page indique que la page Notez que chaque entrée de la table de pages fait 4 octets (32 bits). 3.2 La table de pages inverseLa table de pages inverse met en relation les trames et les pages qu'elles contiennent. Elle peut donc être vue comme l'inverse de la table de pages : au lieu de chercher quelle trame correspond à une page donnée, on cherche quelle page correspond à une trame donnée. Puisque nous utilisons 3 trames en RAM, cette table possède donc 3 entrées. Par exemple, son état pourrait être le suivant : ![]() Dans ce cas-ci, la table indique que la trame 3.3 Les compteurs d'accèsLa dernière structure est un tableau de compteurs d'accès. Chaque trame mémoire possède son propre compteur, si bien que cette table a donc 3 entrées. Chaque entrée indique combien de cycles d'accès mémoire se sont écoulés depuis que cette trame a été accédée. Par exemple, une trame qui vient d'être accédée verra son compteur remis à 0; toutes les autres verront leur compteur incrémenté. Un exemple type de l'état des compteurs est donnée à la figure suivante : ![]() La mise à jour de ces compteurs est faite par la fonction 4. Détail des fonctions à écrireLa mise en place d'un système à mémoire paginée n'est pas simple, aussi la structure du code à écrire a déjà été établie pour vous. Cette structure est présentée à la figure suivante : ![]() Dans ce diagramme, chaque boîte correspond à une fonction. Chaque ligne allant vers la droite correspond à un appel de fonction (
5. Test de votre programmeTester et déboguer un programme assembleur complexe n'est pas simple. Afin de vous aider dans ce travail, nous vous fournissons des tests pré-implémentés. Ceux-ci se situent dans le bloc La vérification de la réussite des tests est faite avec les commandes Si vous rencontrez des erreurs dans les tests, affairez-vous à régler ces erreurs avant de passer aux tests suivants, car plusieurs tests assument que toutes les fonctions précédentes fonctionnent correctement. PondérationTel que mentionné précédemment, le code compte pour 100% de la note de ce TP. Chacune de vos fonctions sera tout d'abord évaluée indépendamment des autres en employant la pondération suivante:
La réussite des tests globaux compte pour 10% de la note totale. RessourcesRemerciementsMerci à Marc-André Gardner pour la création de ce TP! |