extFS-Seyshell/docs/html/md_docs_2compte__rendus_2compte__rendu__2.html
2026-05-25 15:39:10 +02:00

199 lines
18 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Seyshell: compte_rendu_2</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">Seyshell
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
</div><!-- top -->
<div><div class="header">
<div class="headertitle"><div class="title">compte_rendu_2</div></div>
</div><!--header-->
<div class="contents">
<div class="textblock"><p align="right"></p>
<p><img src="../img/logo_isty.png" alt="Logo ISTY" width="180" class="inline"/> </p>
<h1><a class="anchor" id="autotoc_md29"></a>
Rapport de conception</h1>
<h2><a class="anchor" id="autotoc_md30"></a>
Projet Système 2025/2026 Système de Gestion de Fichiers (SGF)</h2>
<p><b>Membres de léquipe :</b></p><ul>
<li>CHOISY Alexis</li>
<li>DEGAT Teddy</li>
<li>DA SILVA FERREIRA Lucas</li>
<li>FOURNIE Baptiste</li>
<li>FATIHI Youssef</li>
</ul>
<p><b>Encadrante :</b> ABOUDA Dhekra <br />
<b>Date de remise :</b> 2 mai 2026</p>
<h2><a class="anchor" id="autotoc_md31"></a>
Sommaire</h2>
<ul>
<li>I. Introduction</li>
<li>II. Architecture et Modélisation</li>
<li>III. Algorithmes Principaux</li>
<li>IV. Conclusion</li>
</ul>
<h2><a class="anchor" id="autotoc_md32"></a>
I. Introduction</h2>
<p>Ce projet consiste à réaliser un SGF (Système de Gestion de Fichier) dans le cadre d'un projet.</p>
<p>Le cahier des charges impose la réalisation de ce SGF en se basant sur un système d'inode et de blocs stockés (ext3fs ou ext4fs) sur un volume afin de persister les données.</p>
<p>Ce rapport a pour but de montrer l'avancement du projet, notamment concernant la conception et l'explication du fonctionnement des primitives du SGF.</p>
<h2><a class="anchor" id="autotoc_md33"></a>
II. Architecture et Modélisation</h2>
<p>Pour rappel, le projet est structuré de cette manière :</p>
<div class="fragment"><div class="line"><span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code hl_struct" href="structenv.html">env</a> {</div>
<div class="line"> <span class="keywordtype">char</span>* <a class="code hl_variable" href="structenv.html#a170118ec15be2b419562524b75693d9f">key</a>;</div>
<div class="line"> <span class="keywordtype">char</span>* <a class="code hl_variable" href="structenv.html#a4c45a37bbe3008aa248a28d0b60289b7">value</a>;</div>
<div class="line">} <a class="code hl_struct" href="structenv.html">env</a>;</div>
<div class="line"> </div>
<div class="line"><span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code hl_struct" href="structinode.html">inode</a> {</div>
<div class="line"> <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> <a class="code hl_variable" href="structinode.html#ab744b42f5d23ec542bd9897a4d15a5fa">perms</a>; <span class="comment">// rwxrwxrwx</span></div>
<div class="line"> <span class="keywordtype">char</span> <a class="code hl_variable" href="structinode.html#a2d0a5188e7dfbfcf2fa374a5fb348177">filetype</a>;</div>
<div class="line"> <span class="keywordtype">int</span> <a class="code hl_variable" href="structinode.html#aaeb4427c36772c74ae86c9510ee6a6b3">blocs</a>[<a class="code hl_define" href="const_8h.html#ad7140f3913ca85546efb2ded034d0af2">MAX_BLOCS</a>];</div>
<div class="line">} <a class="code hl_struct" href="structinode.html">inode</a>;</div>
<div class="line"> </div>
<div class="line"><span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code hl_struct" href="structbloc.html">bloc</a> {</div>
<div class="line"> <span class="keywordtype">char</span> <a class="code hl_variable" href="structbloc.html#a801f2e871d2e285480d31426e39e01a9">datas</a>[<a class="code hl_define" href="const_8h.html#a60fedb7550ff4e00d6c70dd2d257c154">MAX_BYTES_PER_BLOC</a>];</div>
<div class="line">} <a class="code hl_struct" href="structbloc.html">bloc</a>;</div>
<div class="line"> </div>
<div class="line"><span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code hl_struct" href="structdisk.html">disk</a> {</div>
<div class="line"> <span class="keywordtype">char</span> <a class="code hl_variable" href="structdisk.html#a60d62e18ebc1d2933bb952352397acda">owned_blocs</a>[<a class="code hl_define" href="const_8h.html#ad7140f3913ca85546efb2ded034d0af2">MAX_BLOCS</a>]; <span class="comment">// 1 si possédé par un inode, 0 si libre</span></div>
<div class="line"> <a class="code hl_struct" href="structinode.html">inode</a> <a class="code hl_variable" href="structdisk.html#a187c55f0919fa8f44cc442857cce3e8d">inodes</a>[<a class="code hl_define" href="const_8h.html#af58c11b86af508a573976185fb99170f">MAX_INODE</a>];</div>
<div class="line"> <a class="code hl_struct" href="structbloc.html">bloc</a> <a class="code hl_variable" href="structdisk.html#ad418fe421d1f081b29dcc7922608ca59">blocs</a>[<a class="code hl_define" href="const_8h.html#ad7140f3913ca85546efb2ded034d0af2">MAX_BLOCS</a>];</div>
<div class="line">} <a class="code hl_struct" href="structdisk.html">disk</a>;</div>
<div class="line"> </div>
<div class="line"><span class="comment">// pour 10 inode qui a 30 blocs de chacun 1024 octets, on a 30720 octets, soit</span></div>
<div class="line"><span class="comment">// 30,7 Ko sur le disque</span></div>
<div class="ttc" id="aconst_8h_html_a60fedb7550ff4e00d6c70dd2d257c154"><div class="ttname"><a href="const_8h.html#a60fedb7550ff4e00d6c70dd2d257c154">MAX_BYTES_PER_BLOC</a></div><div class="ttdeci">#define MAX_BYTES_PER_BLOC</div><div class="ttdef"><b>Definition</b> const.h:4</div></div>
<div class="ttc" id="aconst_8h_html_ad7140f3913ca85546efb2ded034d0af2"><div class="ttname"><a href="const_8h.html#ad7140f3913ca85546efb2ded034d0af2">MAX_BLOCS</a></div><div class="ttdeci">#define MAX_BLOCS</div><div class="ttdef"><b>Definition</b> const.h:3</div></div>
<div class="ttc" id="aconst_8h_html_af58c11b86af508a573976185fb99170f"><div class="ttname"><a href="const_8h.html#af58c11b86af508a573976185fb99170f">MAX_INODE</a></div><div class="ttdeci">#define MAX_INODE</div><div class="ttdef"><b>Definition</b> const.h:5</div></div>
<div class="ttc" id="astructbloc_html"><div class="ttname"><a href="structbloc.html">bloc</a></div><div class="ttdoc">Segment de données brutes à taille fixe stocké sur le disque virtuel.</div><div class="ttdef"><b>Definition</b> struct.h:36</div></div>
<div class="ttc" id="astructbloc_html_a801f2e871d2e285480d31426e39e01a9"><div class="ttname"><a href="structbloc.html#a801f2e871d2e285480d31426e39e01a9">bloc::datas</a></div><div class="ttdeci">char datas[MAX_BYTES_PER_BLOC]</div><div class="ttdef"><b>Definition</b> struct.h:37</div></div>
<div class="ttc" id="astructdisk_html"><div class="ttname"><a href="structdisk.html">disk</a></div><div class="ttdoc">Représentation globale en mémoire (Memory Mapping) de la structure logique du disque virtuel.</div><div class="ttdef"><b>Definition</b> struct.h:46</div></div>
<div class="ttc" id="astructdisk_html_a187c55f0919fa8f44cc442857cce3e8d"><div class="ttname"><a href="structdisk.html#a187c55f0919fa8f44cc442857cce3e8d">disk::inodes</a></div><div class="ttdeci">inode inodes[MAX_INODE]</div><div class="ttdef"><b>Definition</b> struct.h:48</div></div>
<div class="ttc" id="astructdisk_html_a60d62e18ebc1d2933bb952352397acda"><div class="ttname"><a href="structdisk.html#a60d62e18ebc1d2933bb952352397acda">disk::owned_blocs</a></div><div class="ttdeci">char owned_blocs[MAX_BLOCS]</div><div class="ttdef"><b>Definition</b> struct.h:47</div></div>
<div class="ttc" id="astructdisk_html_ad418fe421d1f081b29dcc7922608ca59"><div class="ttname"><a href="structdisk.html#ad418fe421d1f081b29dcc7922608ca59">disk::blocs</a></div><div class="ttdeci">bloc blocs[MAX_BLOCS]</div><div class="ttdef"><b>Definition</b> struct.h:49</div></div>
<div class="ttc" id="astructenv_html"><div class="ttname"><a href="structenv.html">env</a></div><div class="ttdoc">Modélise une variable d'environnement sous forme de clé/valeur (dictionnaire).</div><div class="ttdef"><b>Definition</b> struct.h:13</div></div>
<div class="ttc" id="astructenv_html_a170118ec15be2b419562524b75693d9f"><div class="ttname"><a href="structenv.html#a170118ec15be2b419562524b75693d9f">env::key</a></div><div class="ttdeci">char * key</div><div class="ttdef"><b>Definition</b> struct.h:14</div></div>
<div class="ttc" id="astructenv_html_a4c45a37bbe3008aa248a28d0b60289b7"><div class="ttname"><a href="structenv.html#a4c45a37bbe3008aa248a28d0b60289b7">env::value</a></div><div class="ttdeci">char * value</div><div class="ttdef"><b>Definition</b> struct.h:15</div></div>
<div class="ttc" id="astructinode_html"><div class="ttname"><a href="structinode.html">inode</a></div><div class="ttdoc">Représente un index de fichier (Inode) au sein du SGF.</div><div class="ttdef"><b>Definition</b> struct.h:24</div></div>
<div class="ttc" id="astructinode_html_a2d0a5188e7dfbfcf2fa374a5fb348177"><div class="ttname"><a href="structinode.html#a2d0a5188e7dfbfcf2fa374a5fb348177">inode::filetype</a></div><div class="ttdeci">char filetype</div><div class="ttdef"><b>Definition</b> struct.h:26</div></div>
<div class="ttc" id="astructinode_html_aaeb4427c36772c74ae86c9510ee6a6b3"><div class="ttname"><a href="structinode.html#aaeb4427c36772c74ae86c9510ee6a6b3">inode::blocs</a></div><div class="ttdeci">int blocs[MAX_BLOCS]</div><div class="ttdef"><b>Definition</b> struct.h:27</div></div>
<div class="ttc" id="astructinode_html_ab744b42f5d23ec542bd9897a4d15a5fa"><div class="ttname"><a href="structinode.html#ab744b42f5d23ec542bd9897a4d15a5fa">inode::perms</a></div><div class="ttdeci">unsigned short perms</div><div class="ttdef"><b>Definition</b> struct.h:25</div></div>
</div><!-- fragment --><p>Entre temps nous avons jugé important de rajouter </p><div class="fragment"><div class="line"><span class="keywordtype">char</span> owned_blocs[<a class="code hl_define" href="const_8h.html#ad7140f3913ca85546efb2ded034d0af2">MAX_BLOCS</a>]</div>
</div><!-- fragment --><p>pour certaines commandes afin de déterminer si un bloc est libre ou non (par exemple pour la commande <code>df</code>).</p>
<p>Nous avons aussi rajouté une structure <code>env</code> sous forme d'un dictionnaire mis à disposition pour le shell (par exemple la variable 'PWD' qui sert pour parcourir l'arborescence). <code>env</code> utilise le design pattern singleton, c'est à dire qu'une seule instance de cet objet existe et est fréquentée ou modifiée quand cela est nécessaire.</p>
<h2><a class="anchor" id="autotoc_md34"></a>
III. Algorithmes Principaux</h2>
<p>Ici sera expliqué le fonctionnement des primitives du SGF ainsi que certaines commandes du shell associé.</p>
<h3><a class="anchor" id="autotoc_md35"></a>
&lt;u&gt;3.1. La primitive &lt;tt&gt;create_file()&lt;/tt&gt;&lt;/u&gt;</h3>
<p>Avant d'expliquer le fonctionnement de la primitive, il est nécessaire d'expliquer comment fonctionne un fichier dans un système ext3fs <img src="../img/file_struct.png" alt="illustration du fonctionnement d'un fichier" class="inline"/> Il s'agit simplement d'un inode qui pointe sur un ou plusieur bloc de donnée (ici 128 octets). Ce bloc décrit le contenu du fichier. L'inode contient</p><ul>
<li>Si l'inode concerne un fichier, un répertoire ou un lien symbolique</li>
<li>les droits de l'inode concerné (droit de lecture/écriture/exécution)</li>
</ul>
<p>La primitive fonctionne de la manière suivante :</p><ul>
<li>On trouve un bloc de donné libre</li>
<li>Une fois ce bloc trouvé, on trouve un espace libre de 32 octets (28 pour le nom du fichier et 4 pour la référence à l'index de l'inode concerné)</li>
</ul>
<h3><a class="anchor" id="autotoc_md36"></a>
&lt;u&gt;3.2. La primitive &lt;tt&gt;create_directory()&lt;/tt&gt;&lt;/u&gt;</h3>
<p>Premièrement il faut savoir comment se structure un dossier dans un système ext3fs <img src="../img/dir_struct.png" alt="illustration du fonctionnement d'un dossier" class="inline"/></p>
<p>La primitive fonctionne de la manière suivante :</p><ul>
<li>On trouve un bloc de donné libre</li>
<li>Une fois ce bloc trouvé, on trouve un espace libre de 32 octets (28 pour le nom du fichier et 4 pour la référence à l'index de l'inode concerné)</li>
<li>On créer un dossier '.' qui pointe sur l'inode du dossier en création</li>
<li>On créer un dossier '..' qui pointe sur le parent de l'inode en création</li>
</ul>
<p>à noter qu'un dossier n'est qu'un fichier qui structure l'information d'une manière différente (en faisant stockant le nom et la référence vers les inodes de ses fils)</p>
<h3><a class="anchor" id="autotoc_md37"></a>
&lt;u&gt;3.3. La primitive &lt;tt&gt;write_in_file()&lt;/tt&gt;&lt;/u&gt;</h3>
<p>Il s'agit simplement d'écrire des données dans un bloc de données soit en écrasant les données par des nouvelles (mode 'w') soit en rajoutant les données à la suite de celles déjà existantes (mode 'a').</p>
<h3><a class="anchor" id="autotoc_md38"></a>
&lt;u&gt;3.4. La commande &lt;tt&gt;cd&lt;/tt&gt;&lt;/u&gt;</h3>
<p>Contrairement aux autres commandes du projet, cd est une commande assez spéciale car elle est toujours implémentée par le shell lui même et non déjà existante dans le système. En bref, elle est propre à chaque shell (bash, zsh, fish...). Dans les faits ça ne change pas grand chose mais l'implémentation n'est pas dans le fichier <code><a class="el" href="disk_8c.html" title="Implémentation des primitives de bas niveau et des commandes du Système de Gestion de Fichiers (SGF).">disk.c</a></code> mais <code><a class="el" href="exec_8c.html" title="Moteur d&#39;exécution des commandes et gestionnaire de l&#39;architecture des redirections (Pipes/Redirectio...">exec.c</a></code> qui s'occupe de tout l'aspect exécution de commande (et non implémentation à la base).</p>
<p>Le plus long est le parsing du chemin, le fait de séparer les noms des dossiers des '/'. Par exemple pour le chemin <code>/dir1/dir2/</code> on va devoir parcourir <code>dir1</code> puis <code>dir2</code>. Pour cela, il existe une fonction <code><a class="el" href="disk_8c.html#a6f69e1d7bb5d136f816149887845e9c8" title="Parcourt les entrées d&#39;un répertoire pour extraire l&#39;ID numérique de l&#39;inode correspondant à un nom d...">find_dir_inode_by_name()</a></code> qui comme son nom l'indique sert à retrouver un inode grâce à son nom et comme on le sait déjà, le nom d'un inode est stocké dans le/les blocs du parent.</p>
<p>En bref, on va commencer du tout début du/des blocs du parent jusqu'à trouver (ou non) le nom du dossier donnné en paramètre. Et comme les noms sont stockés de cette manière : <img src="../img/file_name.png" alt="illustration de la méthode de stockage du nom d'un fichier" class="inline"/></p>
<p>Une fois l'inode associé au nom du dernier dossier dans le chemin trouvé. on change la variable d'environnement 'PWD'.</p>
<p><br />
<br />
</p>
<h3><a class="anchor" id="autotoc_md39"></a>
&lt;u&gt;3.5. La commande &lt;tt&gt;ls&lt;/tt&gt;&lt;/u&gt;</h3>
<p>ls est très similaire à cd sur le fonctionnement à la seule différence que ls affiche le contenu du dossier avec l'inode associé.</p>
<h2><a class="anchor" id="autotoc_md40"></a>
IV. Conclusion</h2>
<p>En résumé, cette phase intermédiaire de conception nous a permis de poser des fondations solides et cohérentes pour notre Système de Gestion de Fichiers. L'architecture globale, basée sur le modèle des inodes et des blocs de données (façon ext3/ext4), est désormais clairement modélisée et structurée en mémoire.</p>
<p>Le développement des primitives fondamentales — comme la création et l'écriture de fichiers ou l'arborescence des dossiers — couplé aux premières commandes vitales du shell (cd, ls), prouve la viabilité de notre approche. L'ajout de structures d'optimisation comme owned_blocs ou l'environnement global (env) montre également notre capacité à adapter le cahier des charges aux défis techniques rencontrés en cours de route.</p>
<p>Bien que le projet soit encore en phase de développement, cette étape de mi-parcours valide nos choix algorithmiques et architecturaux. Les bases sont désormais saines et opérationnelles pour entamer la suite de l'implémentation et aboutir à un système complet et persistant d'ici le rendu final. </p>
</div></div><!-- contents -->
</div><!-- PageDoc -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8
</small></address>
</body>
</html>