Add templates template in the src folder.

This commit is contained in:
statzitz 2024-12-27 13:00:07 +01:00
parent 6aacfe8fe4
commit 475445231e
16 changed files with 139 additions and 432 deletions

9
src/code/example_code.c Normal file
View file

@ -0,0 +1,9 @@
#include <stdio.h>
int main() {
printf("You should have here a src directory, with a logic link to your "
"code.\n");
return 0;
}

BIN
src/img/inp_logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

View file

@ -1,12 +1,12 @@
\documentclass[12pt]{report}
% Metadata
\author{Template author}
\title{Template Title }
\author{Jérémy PRIMARD}
\title{ENSIMAG - MASTER RIE 1 - Système (WMMRSYS) - Programmation (WMMRPROG) }
\date{\date\today}
% Packages
\usepackage[english]{babel}
\usepackage[french]{babel}
\usepackage[T1]{fontenc}
\usepackage{graphicx}
\usepackage{mathptmx}
@ -16,6 +16,34 @@
\usepackage{titlesec}
\usepackage{subfiles}
\usepackage{hyperref} % To change tableofcontents in links.
\usepackage{listings}
\usepackage{xcolor}
\definecolor{codegreen}{rgb}{0,0.6,0}
\definecolor{codegray}{rgb}{0.5,0.5,0.5}
\definecolor{codepurple}{rgb}{0.58,0,0.82}
\definecolor{backcolour}{rgb}{0.95,0.95,0.92}
\lstdefinestyle{mystyle}{
backgroundcolor=\color{backcolour},
commentstyle=\color{codegreen},
keywordstyle=\color{magenta},
numberstyle=\tiny\color{codegray},
stringstyle=\color{codepurple},
basicstyle=\ttfamily\footnotesize,
breakatwhitespace=false,
breaklines=true,
captionpos=b,
keepspaces=true,
numbers=left,
numbersep=5pt,
showspaces=false,
showstringspaces=false,
showtabs=false,
tabsize=2
}
\lstset{style=mystyle}
% Option
\graphicspath{ {img} } % Look into the img folder for all images.
@ -73,9 +101,9 @@
\begin{document}
% Here, add new pages
% Here, add or remove pages
\subfile{parts/titlepage.tex}
%\subfile{parts/noplagiarism_page.tex}
\subfile{parts/noplagiarism_page.tex}
\begin{sloppypar}
@ -89,6 +117,7 @@
\subfile{parts/conclusion.tex}
\subfile{parts/glossary.tex}
\subfile{parts/references.tex}
\subfile{parts/annexes.tex}
\end{sloppypar}

View file

@ -11,18 +11,12 @@
\addcontentsline{toc}{chapter}{Abstract}
\section*{Abstract}
This is where you should put your abstacts.
Each of your keywords should be put in the glossary.
This abstact template was made for my \textbf{botnet} project in TUD, which is a good \textbf{malware} we written in \textbf{rust} with some friends.
%TODO
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque viverra pulvinar dui ut venenatis.
Suspendisse interdum ac tellus nec ultricies. Nullam eu bibendum ipsum. Pellentesque in ipsum vel orci
ullamcorper malesuada in at turpis. Nulla facilisi. Quisque ullamcorper at sem eget porttitor. Ut sed mi fermentum,
fermentum purus in, molestie sem.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque viverra pulvinar dui ut venenatis.
Suspendisse interdum ac tellus nec ultricies. Nullam eu bibendum ipsum. Pellentesque in ipsum vel orci
ullamcorper malesuada in at turpis. Nulla facilisi. Quisque ullamcorper at sem eget porttitor. Ut sed mi fermentum,
fermentum purus in, molestie sem.
\qquad \textit{Keywords}: Botnet, malware, virus, rust, TODO.
\qquad \textit{Keywords}: \textbf{botnet}, \textbf{malware}, \textbf{rust}.
\vspace{10pt}

16
src/parts/annexes.tex Normal file
View file

@ -0,0 +1,16 @@
\documentclass[../main.tex]{subfiles}
\graphicspath{ {../img/} }
% Typist rust
\begin{document}
\chapter*{Annexes}
\addcontentsline{toc}{chapter}{Annexes}
\verb|example_code.c|
\lstinputlisting[language=C]{code/example_code.c}
\end{document}

View file

@ -8,11 +8,7 @@
\chapter*{Conclusion}
\addcontentsline{toc}{chapter}{Conclusion}
La mémoire d'un ordinateur est un sujet très complexe, qu'il serait absurde de vouloir completement exprimer dans un petit raport comme celui-ci.
Cependant, il permet néanmoins de donner une idée de mécanismes de géstion de mémoires et de comment ils s'intègrent dans les différents niveaux de mémoires.
L'organisation de la mémoire vive, ainsi que de la mémoire virtuelle, est elle aussi un sujet primordiale pour la mémoire.
Au moins, ce document à été en mesure de donner un apperçu conséquent de la gestion mémoire, même si il n'est pas entré dans les détails.
Never forget the last part, I mean... The conclusion.
\vspace{10pt}

View file

@ -11,9 +11,9 @@
\begin{itemize}
% Examples.
\item \textbf{Botnet:} A type of malware which takes control of numerous machines to lauch somes attacks. Althought it's usually used to lauch denial of services attacks, it can also be used to crack password or even mine cryptocurrency.
\item \textbf{Example 1:} A typical example of an entry in the glossary.
\item \textbf{Other example:} Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque viverra pulvinar dui ut venenatis.
\item \textbf{Example 2:} An example 2 is the same as an example 1, the only difference is that there is a need for a second one.

View file

@ -8,14 +8,6 @@
\chapter*{Introduction}
Dans un monde de plus en plus informatisé, une personne souhaitant pouvoir réaliser un système complexe informatique optimisé, surtout au niveau OS, est obligé de se pencher sur le fonctionnement de la mémoire.
Tout les programes, quels qu'ils soient doivent être stockés en mémoire pour pouvoir être éxecutés.
Il est ainsi intéressant de savoir tout dabord d'un point de vue physique les différents niveaux de mémoire.
Ensuite, il devient nécessaire de comprendre comment la mémoire est passée d'un niveau à un autre, puis enfin, comment elle est organisé au sein d'un même niveau.
Ce raport n'inclueras cependant pas le fonctionement de la mémoire entre différents ordinateurs, mais se focalisera uniquement sur le fonctionnement de la mémoire à l'interieur d'un même ordinateur.
De plus, ce document ne parlera pas des mémoires spéciales tel que celle du BIOS, et il est important de rapeler que puisque le fonctionnement du processeur n'est pas le sujet de ce rapport, la gestion de la mémoire au sein du processeur ne sera pas abordé.
Don't forget to put your introduction here
\end{document}

View file

@ -19,6 +19,8 @@
\vspace{3.5cm}
This is the example of TUD no plagiarism page.
You don't always need to put it, and sometime you will even need to replace it by your own.
I herby certify that this material, which I now submit for assessment on the programme of study leading to the award of Degree of \textbf{Bachelor of Science in Computing in Digital Forensics \& Cyber Security} in Technological University Dublin, is entirely my own work except where otherwise stated, and has not been submitted for assessment for an academic purpose at this or any other academic institution other than in partial fulfilment of the requirements of that stated above.
@ -27,16 +29,12 @@
\vspace{1cm}
Dated: 04/15/2023
Dated: 12/27/2024
\begin{flushright}
Abigail ECCLESTON
Jérémy PRIMARD
Tytus KOPERA
\end{flushright}

View file

@ -5,130 +5,66 @@
\begin{document}
\chapter{Les différents niveaux de mémoire physiques.}
\chapter{Part 1}
Commençons notre annalyse du fonctionement de la mémoire par expliquer physiquement les différents types de mémoire, ainsi que les raisons de leur éxistances.
A part usually have a brief introcution
\vspace{10pt}
\section{Section 1}
The a long text according to the first section and even some images inside
\includegraphics[width=450pt]{processus_representation.drawio.png}
And even some subsections.
\vspace{10pt}
\subsection{Sub section 1}
Between text and sections/subsections, never forcet the vspace of 10pt or else you will have some problems.
\vspace{10pt}
\subsection{Sub section 2}
You can have multiples subsections, and even some centered images inside.
\begin{center}
\includegraphics[width=250pt]{physical_memory_global_view.drawio.png}
\begin{center}
\includegraphics[width=150pt]{inp_logo.png}
\end{center}
And even if you need it, some lists.
\begin{itemize}
\item The first item of the list
\item The second item of the list
\end{itemize}
\vspace{10pt}
\section{Section 2}
There can even be a second section in a part.
\vspace{10pt}
\section{Section 3}
There can be even a third section in a part.
Tout dabord, la première chose que l'on pense concernant la mémoire d'un ordinateur, c'est à son disque physique.
\vspace{10pt}
\section{Le disque physique}
Le disque physique est la ou réside les données quand elles ne sont pas chargés dans la mémoire centrale.
De par cette définition, c'est aussi la où réside les données lorsque l'ordinateur est éteint ou hors tensions.
Cette mémoire est considéré comme étant la moins chère des différents types de mémoires, étant donné que l'on peut facilement trouver des disques de plusieurs TiB sur le marché.
Elle possède néanmoins le désavantage d'être aussi considéré comme étant la mémoire la plus lente de toutes si on omets la mémoire partagé par un réseau tel que nfs, que nous n'aborderons pas dans ce document.
Nous expliquerons plus loin dans ce document (I.4) les différentes raison de cette affirmation.
Passons maintenant à décrire la mémoire vive.
\vspace{10pt}
\section{La mémoire vive}
La mémoire vive, aussi appelé mémoire volatile ou encore manière général RAM ou encore DRAM, comme Dynamic Random Access Memory, qui n'est pas à confondre avec la SRAM comme Static Random Access Memory, qui compose le BIOS.
C'est une mémoire que l'on considère comme couteuse, qui se compte en GiB sur un ordinateur moderne.
Elle contient toute la mémoire active lors du fonctionnement d'un ordinateur, par example le kernel, l'init system, le server x, plus généralement, touts les processus actif, associés aux données qu'ils utilisent.
Lors de l'arret de l'ordinateur, toute les données contenues dedans sont perdu si elle ne sont pas transféré sur le disque physique.
Passons désormais à la mémoire la plus complexe, celle contenu dans le processeur.
\vspace{10pt}
\section{La mémoire CPU.}
Premièrement, il est important de rappeller qu'il y à différents niveaux de mémoire au niveau du processeur.
Tout dabord, celle que tout le monde connais, les registres.
\vspace{10pt}
\subsection{les registres}
Quand on pense à la mémoire contenu à l'intérieur du processeur, on pense tout dabord aux registres.
Il s'agit de la mémoire la plus essentielle d'un ordinateur.
Il n'y as seulement quelques registres dans un processeur, chaqu'un possède une taille se comptant en bit, par example 32 bits ou 64 bits.
C'est dedans que sont stockés les données que le processseur travaille actuellement dessus.
C'est la plus rapide des mémoires, cependant du fait de sa nature extrèmement petite, elle doit se faire épauler par différent niveaux de caches.
\vspace{10pt}
\subsection{le cache processeur.}
Le cache processeur est une mémoire elle aussi très couteuse essentiel au bon fonctionnement d'un ordinateur.
Les différents niveaux de caches, només L1, L2, ou encore L3, parfois même L4.
L1 étant le niveaux de cache le plus rapide, et L3, L4 quand il existe, le plus lent.
Il est cependant intéressant de noté que même si L1 est le plus rapide, c'est aussi le plus petit, et L3/L4 le plus grand.
la taille des cache se comptes en KiB, voir pour les PC les plus modernes en MiB.
Par example pour donner un indice de leur tailles sur un pc moderne, le L1 de mon PC fait 256KiB, le L2 fait 8MiB, et le L3 16MiB.
Il peut aussi y avoir plusieurs caches d'un même niveau à l'intérieur d'un processeur, par example un réservé aux instructions et un réservés aux données.
Maintenant que nous avons introduit les différents niveaux de mémoire physique, passons à expliquer leur différents côuts.
\vspace{10pt}
\section{Explication du cout de la mémoire.}
La mémoire à un coût.
Financier, mais pas que.
Ici nous allons parler plutôt du coût en place et en distance.
En effet, plus la mémoire se situe éloigné du processeur, et plus elle est longue à accéder, en particulier pour le disque physique qui à besoin d'aller lire la mémoire sur son support.
D'un autre côté, plus on en met proche du processeur, et moins il n'y à de place pour mettre des instructions.
C'est pour cette raison qu'il à été choisis de faire plusieurs niveaux de mémoires. Les niveaux en haut, comme les registres ou le cache processeur, permettent au processeur de pouvoir toujours avoir des instruction à executer pendant que les données transitent entre les différents niveaux.
D'un autre côté, les niveaux bas comme la mémoire vive ou le disque physique, se situent à des endroits ou il y à beaucoup d'espaces.
Les problème de la mémoire vive sont à la fois qu'une fois que l'ordinateur est hors tension elle disparait, et qu'elle coûte beaucoup plus chère à l'unitée en € que le disque physique qui lui, garde sa mémoire même après que l'ordinateur soit éteint.
Son problème à lui au disque physique, est qu'il prends tellement longtemps à lire ou à écrire des données, ajoutons y qu'il se situe supper loin du processeur, cela le rend innaptes à être utilisé pour stocker de la mémoire activement utilisé par l'ordinateur.
Voyons désormais comment la mémoire est passé d'un niveau à un autre.
Le fonctionnement du processeur étant à la fois extrèmement compliqué et pas du ressort de ce document, nous allons tout particulièrement nous intéresser au passage de la mémoire entre la mémoire disque et la mémoire vive.
\vspace{10pt}
\section{Passage d'un niveau de mémoire à un autre.}
Pour pourvoir expliquer le passage de la mémoire entre le niveau du disque et de la RAM, nous allons commencer par décrire comment la mémoire est stockée dans le disque.
Un disque physique est composé de secteurs.
Un ordinateur, quand il demande des données au disque, est obligé de demander un secteur entier.
La taille d'un secteur dépend entièrement du matériel, cependant, de nos jours, il est souvant fixé à 4KiB.
\includegraphics[width=450pt]{physical_disk_representation.drawio.png}
La RAM, elle, cependant, est beaucoup plus flexible concernant son maniment.
Chaque octet à une addresse, ce qui permet de facilement manier les données.
\includegraphics[width=450pt]{physical_DRAM_representation.drawio.png}
La solution trouvé pour permettre le transfert de la mémoire entre la mémoire physique et la mémoire vive, est de tout dabord, réserver une partie de la mémoire pour être sur de ne rien écraser.
\includegraphics[width=450pt]{physical_DRAM_representation_space_locked.drawio.png}
Puis, demander un secteur au disque, pour l'illustration, prenons le secteur 2.
\includegraphics[width=450pt]{physical_disk_representation_sector_2.drawio.png}
Le disque accepte volontièrement de nous le passer.
Il ne reste plus qu'as écrire ce secteur dans la mémoire à l'emplacement que nous avons réservé pour que le secteur soit chargé en mémoire.
\includegraphics[width=450pt]{physical_DRAM_representation_sector_2_loaded.drawio.png}
De part cette explication, nous pouvons en déduire deux choses.
Premièrement, pour charger tout le disque en mémoire vive, encore faut-il en avoir assez, il suffirait que l'on recopie chaque secteur du disque dans la RAM.
Deuxièmement, pour changer une donnée sur le disque, il suffit de charger un secteur en mémoire vive, changer la donnée, puis renvoyer le secteur modifié au disque pour qu'il écrase l'ancien secteur.
Ce mécanisme de navette etant très lent, c'est pour ca que les mécanismes de géstion modèrne de la mémoire font en sorte de le limiter le plus possible, en notament une fois que l'on as chargé un secteur, le garder en mémoire le plus longtemps que possible, même lorsque que l'on as fini de s'en servir pour que si il vient à être redemandé, il soit immédiatement accéssible.
Ce mécanisme de garder en mémoire un secteur est même étendue dans les ordinateurs modernes.
Etant donné que souvant quand on demandes un secteur, il vas aussi être nécessaire de charger les secteurs environnant, automatiquement, le fait de demander un secteur fait charger en mémoire vive les secteurs environnants.
Maintenant que nous avons longuement parlé de la mémoire à un niveau physique, notament les différents niveaux de mémoires ainsi que du transfert de la mémoire entre le niveau disque physique et la mémoire vive, passons à expliquer comment s'organise la mémoire au sein d'un même niveau.
\end{document}

View file

@ -5,193 +5,9 @@
\begin{document}
\chapter{Organisation de la mémoire au sein d'un même niveau physique}
\chapter{Part 2}
Sur un ordinateur, tout n'est pas un seul et même block.
Il y à des données, et des instructions, puis il y à différents programes stockés en mémoire, et quand les programes sont éxecutés, ils deviennent des processus, qui eux aussis font leur modifications sur les données du système.
Pour organiser tout ca, la notion de fichier et de système de fichiers sont apparus.
Un système de fichier organise les fichiers dans la mémoire.
Au début, ce concept est apparu pour organiser les fichiers sur un disque physique, puis avec le temps, pour simplifer le passage de la mémoire au disque, le vfs, virtual filesystem est apparu.
Il permet d'armoniser l'interface avec tout les systèmes de fichiers, autemps les systèmes de fichiers physique (sur le disque) que les systèmes de fichiers dans la mémoire vive (RAM).
Nous avons réaliser un rapport expliquant le fonctionnement des systèmes de fichiers que je vous invite à lire.
Cependant ce qui reste à retenir, c'est que dans les faits, la mémoire dans les disques physique est organisé grace aux systèmes de fichiers ainsi que les pilotes qui permettent au système de les lire.
Dans la mémoire vive, cependant, cela est différent.
Bien évidemment, il y à toujours toute la mémoire utilisée par le vfs pour stocker les fichiers utilisés ou qui pourraient l'être, mais il y à aussi et surtout la mémoire utilisé par les processus.
Dans ce rapport, nous allons tout particulièrement nous intéresser à la gestion de la mémoire dans la RAM concernant les processus.
Nous rappelons qu'un processus est un programme chargé et exécuté en mémoire par le processeur, il possède une pile, des données, ainsi que des instructions.
Nous appelerons mémoire virtuel, les principes utilisés pour permettres aux processus d'utiliser des addresses virtuelles, plutôt que des addresses physiques.
\includegraphics[width=450pt]{processus_representation.drawio.png}
Il est intéressant à noter que la pile, les instructions ou encore les données ne sont pas obligés d'être contigues.
On dit que ce sont des segments de données, et peuvent se trouver nimporte ou dans la RAM, éventuellement même sur le disque, c'est ce que l'on appelle le swap, nous en reparlerons dans la partie concernant la mémoire virtuelle.
Cette gestion de la mémoire par segments, est ce que l'on appelle la gestion de la mémoire segmenté, et ce sera aussi notre première section dans cette partie sur l'organisation de la mémoire.
\vspace{10pt}
\section{La gestion de la mémoire segmentée}
\subsection{Principes}
Un segment est enchainement contigüe de donnée.
La simplification d'un processus définie plus haut en 3 segments en est un example, cependant, dans la réalitée, un processus peut-être découpé en beaucoup plus de segments.
Par example les instructions peuvent être en plusieurs segements, certains contiendrons des instructions partagées entre plusieurs processus et d'autres des instructions réservés à ce processus.
Les données comme la pile peuvent elles aussi être contenu entre plusieurs segements.
Sous linux, il suffit de regarder ce qui se trouve dans /proc/<PID>/maps pour pouvoir voir tout les segments associées aux processus.
Ce qui est important à noter c'est que dans la ram, les segments ne se suivent pas forcéments.
\includegraphics[width=450pt]{physical_DRAM_representation_with_process.drawio.png}
Cependant, cela lève la question, comment le gestionnaire de la mémoire s'y retrouve pour savoir que pour un processus, à quel endroit se situe les segments de données, à quel endroit se situe les instructions, etc... dans la RAM.
Nous verrons donc le principe de traduction d'addresses pour la mémoire segemntée.
\vspace{10pt}
\subsection{Traduction d'addresses}
Pour garder une trace d'ou se situes en mémoire les processus, le système garde une table des segments par processus.
Dans cette table, chaque segments est désigné par un numéro, une addresse, une table et des droits.
Voici un example.
\includegraphics[width=450pt]{physical_DRAM_representation_segmentation_table_process.drawio.png}
Dans cette methode de gestion de la mémoire, chaque addresse virtuel possède un numéro de segment, ainsi que un emplacement dans le segment.
\includegraphics[width=450pt]{physical_DRAM_representation_segmentation_virt_address_process.drawio.png}
Le MMU (Memory Management Unit), un composant matériel dédié pour s'occuper de la mémoire, est chargé de réaliser la traduction d'addresse.
Il commence par regarder dans la table.
Est-ce que le segment y se trouve ?
Si non, retourner une interruption pour signaler le défault de segment.
Est-ce que les droits sur le segment sont bon ?
Si non, retourner une interruption pour signaler la violation des droits du segments
Est-ce que le offset ne dépasse pas du segment ?
Si oui, retourner une interruption pour signaler le débordement.
Seulement si tout ces test passent, le traduction est réalisée.
La traduction se déroule ainsi.
On cherche à obtenir la traduction d'une l'addresse virtuelle.
On vas donc regarder dans la table des segments l'addresse du début du segment.
Puis, on vas ajoutter à cette addresse du début du segment l'offet, et voilà, nous avons l'addresse mémoire phisique.
\includegraphics[width=450pt]{physical_DRAM_representation_segmentation_translation_process.drawio.png}
Dans la réalitée, les choses se passent un peu différement de comme décrit si dessus.
Plutôt que de garder la trace du numéro de segment, la table des segments garde la trace de si le segment est en mémoire vive ou pas.
Dans le cas ou il n'est pas dans la mémoire vive, cela signifie qu'il se trouve dans le swap, et qu'il faut dabord aller le chercher pour le ramener dans la mémoire vive avant de pouvoir l'utiliser.
C'est long, donc, grace à une interruption système, le processus est mis en attente pour qu'un autre puisse être exécuté pendant ce temps.
L'avantage de la gestion de la mémoire grace à de la segmentation, est que nous pouvons désormais protéger et partager les différents segments qui composent la mémoire.
Cependant, cette gestion de la mémoire à une grosse limitation.
Les segments ne peuvent pas être découpés, ce qui génére beaucoup de mémoire perdu à cause de l'espace disponible entre les segments (fragmentation).
Cependant, à notre avantage, il existe un autre mécanisme pour gérer la mémoire; la mémoire paginée.
\vspace{10pt}
\section{La gestion de la mémoire paginée}
\subsection{Principes}
Le principe fondamental de la mémoire paginée est la page.
En effet, une page est un bloc de taille fixe de la mémoire virtuelle.
Elle divise ainsi l'espace de mémoire du processus, ce qui signifie que le processus est ainsi divisé en pages.
Il est créer des cases mémoires sur la mémoire physique pour pouvoir acceuilir les pages.
Chaque case vaut la taille d'une page.
Un processus, est donc divisé en pages pour pouvoir être mis dans les pages.
Cela permet donc de quasiment faire disparaitre l'espace perdu à cause de la fragmentation.
En effet, puisqu'un processus ne prends pas la totalité de l'espace qui lui est alloué, l'espace libre à la fin de la dernière page sera perdu.
\includegraphics[width=450pt]{physical_DRAM_representation_with_pages.drawio.png}
Pour chaque processus, il est donc obligé de garder la trace de ces pages, c'est pour ca que, comme pour la gestion segmenté de la mémoire, le système conserve un table des pages pour chaque processus.
\includegraphics[width=450pt]{physical_DRAM_representation_pagination_table_process.drawio.png}
Pour un processus, il est possible de demander de récupérer l'addresse physique correspondant à une addresse virtuel.
Chaque addresse virtuel est composé d'un numéro de page, et d'un déplacement
\includegraphics[width=450pt]{physical_DRAM_representation_pagination_virt_address.drawio.png}
\vspace{10pt}
\subsection{Traduction d'addresses}
Comme pour la gestion de la mémoire segmentée, le MMU se charge de faire la conversion des addresses vituelles en addresses physiques.
Tout dabord, il vérifie que la page est présente dans la table.
Puis, si les droits sont ok,
si il un test échoue il envoie une interruption système pour régler le problème, sinon, il effectue le conversion.
Ici aussi, par soucis de clareté, nous avons mis les numéros de pages sur le tableau alors que dans un véritable tableau de pages, il n'y en aurrait pas.
Comme pour la segmentation, il devrait y avoir, même si je ne l'ai pas représenté, un indicateur de présence de la page dans la mémoire, et si le MMU tente de traduire l'addresse d'une page qui n'est pas présente en mémoire, il faudrait dabord la rapatrier depuis le disque physique.
Pour faire la conversion de l'addresse virtuelle en addresse physique, le MMU commence par regarder le numéro de page, et trouver dans le tableau l'entrée correspondante.
Il récupère alors le numéro de case correspondante.
Pour obtenir l'addresse de la case correspondante, il lui reste plus que de prendre le numéro de case et le multiplier par la taille d'une case.
Enfin, pour finir, il se décale sur la page de l'offset.
\includegraphics[width=450pt]{physical_DRAM_representation_pages_operation.drawio.png}
L'avantage de la gestion mémoire par pages est notament qu'il n'est pas nécessaire d'avoir toutes les pages d'un processus en mémoire.
Le reste des pages peuvent juste ne pas être chargé, et être chargé que lorsque l'on en à besoin.
Cela règle aussi bien le problème de fragmentation que l'on expérience avec la gestion de mémoire ségmenté.
Son problème par contre, c'est qu'il ne permet pas d'avoir de la mémoire partagée de manière efficiente.
En effet, si nous souhaitons avoir de la mémoire partagée entre les processus, avec juste une mémoire paginée on se retrouve bien embétés.
Eh oui, on peut partager une page, mais si la fin des données que l'on veut partager est entre deux pages, il n'y as pas de solutions.
Soit on partage une partie des données que l'on ne souhaites pas partager, soit on ne partage pas toutes les données que l'on souhaites partager.
Dans les deux cas on est embétées, c'est pour cette raison que l'on as commencés à implementer les deux méthodes en même temps, c'est à dire une gestion de la mémoire hybride.
\vspace{10pt}
\section{La gestion de la mémoire hybride, à la fois ségmenté et paginée}
\subsection{Principes}
Le principe de la solution hybride, la mémoire segmentée paginée, est de tout dabord découper un processus en segment, puis, chaque segments, les mettres sur des pages, pour ensuite les insérer dans les cases mémoires que l'on as créer au préalable.
Son avantage, c'est qu'il permet de récupérer l'avantage de la gestion segmentés de la mémoire, tout en évitant trop de fragmentation.
Cette solution est simplement la combination des deux autres méthodes de gestion de la mémoire.
On vas en effet toujours avoir une table des segment associées à chaque processus, mais la différence, c'est que ce coup-ci, on vas avoir une table des pages associés à chaque segments plutôt que à chaque processus.
\includegraphics[width=450pt]{physical_DRAM_representation_hybride.drawio.png}
\vspace{10pt}
\subsection{Traduction d'addresses}
Le principe pour obtenir une addresse physique est simple quand on connais déjà le principe pour obtenir une addresse physique pour une mémoire ségmentée ou paginée.
La seule différence, c'est que maintenant, il vas falloir faire les deux en même temps.
Nous avons donc comme addresse virtuel la même que quand on utilise une gestion de la mémoire segmentée, c'est à dire, un segment, assortis du déplacement que le processus veut dessu.
Nous allons commencer par aller chercher la table des pages associés à ce segment
\includegraphics[width=450pt]{physical_DRAM_representation_hybride_1.drawio.png}
Une fois que l'on l'as obtenu, nous allons déterminer son numéro de page.
C'est très simple.
Il suffit de faire une division euclidienne entre notre déplacement sur le segment, et la taille des pages.
Le quotient est notre numéro de page, et le reste le déplacement sur cette même page.
Maintenant que l'on à notre numéro de page et notre déplacement, il suffit d'aller chercher la page dans la table de pagination associé à notre segment, et faire le calcul décris dans le chapitre précédent sur la géstion de la mémoire paginée pour obtenir l'addresse physique.
\includegraphics[width=450pt]{physical_DRAM_representation_hybride_2.drawio.png}
Si la gestion de la mémoire suivant la méthode ségmentation paginée possède beaucoup d'avantages concernant la gestion de la mémoire et son optimisation, elle possède un énorme désavantage, et pas des moindres, sa vitesse.
Elle est plus de deux fois plus longue que les autres méthodes, à cause du grand nombre d'oppération qu'elle doit effectuer pour obtenir la traduction d'une addresse virtuelle en addresse physique.
Il existe cependant des solutions pour l'accelérer, par example l'utilisation de cache, appellé le cache TLB dans le processeur, qui garde en mémoire les addresses de pages recherchées les plus récentes.
Cela accélère énormément cette gestion mémoire, étant donnée que les mêmes pages sont très souvant recherchés.
Maintenant que nous avons bien parlé des différentes gestions mémoires, nous allons parler de la mémoire virtuelle ainsi que du cas ou la mémoire vive est pleine, comment notre gestion de la mémoire paginée vas faire.
\vspace{10pt}
Never forget to do the second Part.
\end{document}

View file

@ -6,87 +6,9 @@
\begin{document}
\chapter{Cas ou la mémoire est pleine}
\chapter{Part 3}
Never forget to do the third part.
\section{Principe}
Le concept de mémoire virtuel est celui-ci.
Etant donné que la mémoire comprends plusieurs niveaux différents, pourquoi ne pas faire en sorte de rendre les différents niveaux de mémoire transparents pour les processus.
Ce qui doit être persistant est évidemment stocké dans le disque, cependant, il est possible de mettre les processus entre le disque et la mémoire vive, notament en gérant la mémoire grace à la ségmentation paginée.
Ainsi, grace à la segmentation paginée, il est possible dans le cas ou la mémoire vive est pleine, de mettre les pages qui ne sont pas utilisés dans le disque.
C'est ce que l'on appelle le swap.
Le swap est une partition sur le disque, ou, dans le cas de linux, cela peut aussi être un fichier sur un disque étant que tout est fichier.
Cette partition, vas avoir une table d'addressage contenu dans la mémoire vive, pour faire le lien avec la mémoire physique.
Quand la mémoire vive est pleine, elle vas remplacer des pages qui sont dans la RAM pour la mettre dans ce swap.
C'est ainsi qu'apparait la notion d'algorithme de remplacements.
Il faut choisir la bonne page à évincer et à recopier dans le swap, puis réutiliser la case libérée pour y mettre une nouvelle page.
L'objectif d'un tel algorithme, est de choisir une bonne page à évincer pour minimiser les accès au disque.
Il est important de prioriser les pages qui ne sont peu utilisé, et donc qui pourront rester le plus longtemps que possible dans le swap.
\vspace{10pt}
\section{Algorithmes de remplacements}
L'algorithme Optimal est un algorithme purement théorique puisqu'il nécessite de connaitre le futur.
Cependant il reste très simple.
Il faut choisir de remplacer la page qui ne sera pas réutilisée avant le plus de temps.
Grace à ca, on est sur de diminuer le plus possible le nombre de remplacements à effectuer.
\vspace{10pt}
\subsection{FIFO}
Le première algorithme que l'on peut décrire, c'est l'algorithme FIFO, comme First In First Out
Cette algorithme est simple.
Comme son nom l'indique, la première page chargée en mémoire sera la première qui sera remplacée, et au bout d'un certain moment, puisque toutes les pages aurront été remplacée au moins une fois, les pages les moins utilisée se retrouveront toutes dans le swap.
Son problème est que cet algorithme est peu performant.
Beaucoup de pages seront remplacés alors qu'elles seront réutilisés pratiquement immédiatement, et à chaque fois qu'une page peu utilisé est nécessaire d'être rechargé, elle prendras de la place en mémoire jusqu'as ce que toutes les autres pages dans la mémoire vives aient été remplacées, ce qui vas encore plus amplifiée le problème.
\vspace{10pt}
\subsection{LRU}
Le deuxième algorithme que l'on peut décrire, c'est le LRU, le Least Recently Used algorithme.
Le principe est simple.
C'est le même principe que pour la FIFO, seulement, à chaque fois qu'une pages est utilisé, elle est sortie de la file pour être remise au début.
Au final, toutes les pages pas utilisés finissent par aller dans le swap, alors que celles qui sont toujours réutilisés retent chargés.
Cela est donc beaucoup plus rapide que pour l'algorithme FIFO.
Cet algorithme possède quand même un gros problème, c'est qu'il nécéssite de mettre à jour la liste à chaque accès mémoire, ce qui ralentis beaucoup les processus, et au final, il y à le risque de perdre plus de temps à faire ca que d'utiliser l'algorithme FIFO dirrectement.
\vspace{10pt}
\subsection{NRU}
Le troisième algorithme de remplacement que l'on peut décrire est le NRU, comme Not Recently Used.
Son concept est simple.
Chaque pages à un bit de Reference, que le MMU passe à 1 quand il accède à la page.
Tout les certains intervales de temps, ce bit est repassé à 0.
Pour réaliser le NRU, un daemon système doit tourner en arrière plan, et tout les certains intervales de temps, regarder la valeur du bit de référence. Si il est à 0, c'est que la page est suceptible d'être remplacée.
Cet algorithme prendra une page aléatoire parmis toutes les pages qui ont le bit de référence à 0.
Il est important de noter qu'il éxiste des variantes de tout les alogorithmes vus ici, tel qu'un algorithme FIFO qui ne retire pas les pages qui ont un bit de références de 1,
\vspace{10pt}
\subsection{Autres algorithmes}
D'autres algorithmes importants éxistent, comme le Aging algorithm, qui décale le bit de référence à chaque interval régulier pour chaque pages, ce qui permet de garder un historique de l'utilisation des pages.
L'algorithme aging vas préfférer remplacer les pages qui ont un historique lointain que celles qui on été utilisé il n'y à pas longtemps, ce qui améliore le NRU.
Il y en as encore beaucoup d'autres, et je ne vais pas tous les citer ici.
\end{document}

View file

@ -4,13 +4,14 @@
\begin{document}
\chapter*{Refenrences}
\chapter*{References}
\addcontentsline{toc}{chapter}{References}
{
[1] Linux documentation about page tables. \url{https://docs.kernel.org/mm/page_tables.html}
[1] First link. \url{https://tldp.org/LDP/tlk/fs/filesystem.html}
[2] Second link. \url{https://docs.kernel.org/filesystems/vfs.html}
[2] Wikipedia page about page replacement algorithms. \url{https://en.wikipedia.org/wiki/Page_replacement_algorithm}
\vspace{10pt}

View file

@ -30,9 +30,9 @@
\bf
Année scolaire: 2024-2025
School year: 20XX-20XX
Rapport sur la mémoire
THESIS TEMPLATES
}
@ -46,10 +46,10 @@
\selectfont
\bf
RAPPORT SUR LA MÉMOIRE.
THESIS TEMPLATES
%\vfill
% Sujet2
\vfill
THE RIGHT TEMPLATE FOR A RIGHT PROJECT
% Add another image, related to the botnet.
%\includegraphics[width=150pt]{}
@ -64,7 +64,7 @@
\bf
\fontsize{12}{12}
\selectfont
Rédigé par
Presented by
\vfill
@ -73,19 +73,17 @@
Jérémy PRIMARD
Jude Coulavin ?
\vfill
\fontsize{12}{12}
\selectfont
Enseignant superviseur
Supervised by
\fontsize{14}{18}
\selectfont
Djamel Aouane
Mark Lane
\end{center}