From 80f444b32f3ba1f898eac92a2e926620b9dbb1ac Mon Sep 17 00:00:00 2001
From: Guillaume Chanel <Guillaume.Chanel@unige.ch>
Date: Wed, 9 Oct 2024 15:51:59 +0200
Subject: [PATCH] update minix and implementation

---
 9.filesystems/04_Systemes_fichiers_minix.md   | 87 +++++++++++++++----
 .../05_Systemes_fichiers_implementation.md    |  4 +-
 2 files changed, 75 insertions(+), 16 deletions(-)

diff --git a/9.filesystems/04_Systemes_fichiers_minix.md b/9.filesystems/04_Systemes_fichiers_minix.md
index 9478668..2882e00 100644
--- a/9.filesystems/04_Systemes_fichiers_minix.md
+++ b/9.filesystems/04_Systemes_fichiers_minix.md
@@ -29,10 +29,16 @@
 - Les premières versions du noyau Linux (1992) utilisaient MINIX-fs comme FS
 - 1992 : Rémy Card implémente ext (Extended Filesystem) pour remplacer MINIX-fs
   - ext est basé sur une structure similaire à MINIX-fs
-- 1993 : Rémy Card publie ext2
-- 2001 : Theodore Ts'o et d'autres publient ext3
+- 1993 : Rémy Card publie ext2 (amélioration de performances)
+- 2001 : Theodore Ts'o et d'autres publient ext3 (ajout de journalisation)
 - 2006 : la version instable de ext4 est publiée
-- 2008 : la version stable de ext4 est publiée
+- 2008 : la version stable de ext4 est publiée (amélioration de performances et augmentations des limites de tailles)
+
+<aside class="notes">
+
+Tailles augmentée pour ext4: fichiers, volumes et répertoires
+
+</aside>
 
 --
 
@@ -44,6 +50,12 @@
   - variante avec noms de fichiers de 14 caractères max (superblock magic value `0x137F`)
   - variante avec noms de fichiers de 30 caractères max (superblock magic value `0x138F`)
 
+<aside class="notes">
+
+magic value: une valeure qui fait partie du super bloc
+
+</aside>
+
 --
 
 ## Comparaison MINIX-fs et ext2/3/4
@@ -82,7 +94,7 @@ struct minix_inode {
     u16 i_mode;     // file type and permissions for file
     u16 i_uid;      // user id
     u32 i_size;     // file size in bytes
-    u32 i_time;     // inode time
+    u32 i_time;     // inode modification time
     u8 i_gid;       // group id
     u8 i_nlinks;    // number of dir entry pointing to
                     // this inode
@@ -95,6 +107,14 @@ struct minix_inode {
 - **Important** : structure sur disque stockée selon l'ordre *little-endian*
 - Taille d'un inode en bytes ?
 
+<aside class="notes">
+
+On calcule, d'après la structure minix_inode, que sur Minix un inode est 32 octets (bytes).
+
+1024 octets (taille du bloc) / 32 octets (taille d'un inode) = 32 inodes par bloc
+
+</aside>
+
 --
 
 ## Structure du mode du fichier
@@ -177,7 +197,7 @@ struct minix_super_block {
                                  // need 6848 bits
                                  // -> 1 block = 8192 bits
     u16 s_zmap_blocks = 3;       // data blocks bitmap size in blocks
-                                 // need 20480 bits -> 3 blocks = 8192*3 bits
+                                 // need 20480 - 220 bits -> 3 blocks = 8192*3 bits
     u16 s_firstdatazone = 220;   // index of first data block
     u16 s_log_zone_size = 0;     // block size = 1024*2^s_log_zone_size
                                  // = 1024*2^0 = 1024
@@ -191,6 +211,32 @@ struct minix_super_block {
 
 <small>1: permet d'arrondir au prochain multiple de la taille d'un inode</small>
 
+<aside class="notes">
+
+Le calcul pour arriver à 220 comme premier bloc de données (s_firstdatazone) est le suivant:
+
+Bloc 0 pour le superbloc
+
+6848 inodes / 32 inodes par bloc = 214 blocs pour la table d'inodes
+
+1 bloc pour la bitmap des inodes
+
+3 blocs pour la bitmap des zones (blocs de données)
+
+Total : 1 + 214 + 1 + 3 = 219 blocs
+
+Le calcul pour arriver à 268966912 octets pour la taille max d'un fichier (s_max_size) est le suivant:
+
+7 pointeurs directs : 7 * 1024 = 7168 octets -- Les 7 premiers pointeurs de l'inode pointent directement vers des blocs de données.
+
+1 pointeur d'indirection simple : 512 * 1024 = 524288 octets -- Un bloc d'indirection simple contient 512 pointeurs (1024 / 2, car chaque pointeur fait 2 octets).
+
+1 pointeur d'indirection double : 512 * 512 * 1024 = 268435456 octets -- Le bloc d'indirection double pointe vers 512 blocs d'indirection simple, chacun pointant vers 512 blocs de données.
+
+Total: 1024 * 7 + 512 * 1024 + 512 * 512 * 1024 = 268966912
+
+</aside>
+
 --
 
 ## Exemple de superbloc
@@ -236,7 +282,7 @@ struct minix_inode {
   u8 i_gid = 0;            // 0 = root
   u8 i_nlinks = 8;         // 8 dir entries point to
                            // this inode
-  u16 i_zone[7] = {220, 0, 0, 0, 0, 0, 0 };  // 1 data block
+  u16 i_zone[7] = {220, 0, 0, 0, 0, 0, 0 };  // 1 data block ⚠️ index 0 = superbloc
   u16 i_indir_zone = 0;     // no indirect block
   u16 i_dbl_indir_zone = 0; // no double indirect block
 };
@@ -278,6 +324,16 @@ struct minix_inode {
 
 </div>
 
+<aside class="notes">
+
+00 00 79 6F 00 00 00 00 00 00 00 00 00 00 00 00 ..yo............
+
+Les deux premiers octets (00 00) indiquent un numéro d'inode 0, ce qui signifie que cette entrée est inutilisée. Les deux octets suivants (79 6F) correspondent aux caractères ASCII "yo".
+
+Cette entrée était donc utilisée auparavant pour un fichier ou un répertoire appelé "yo". Lorsque l'entrée a été supprimée, le numéro d'inode a été mis à 0, mais le nom n'a pas été effacé.
+
+</aside>
+
 --
 
 ## Exemple d'inode - fichier répertoire
@@ -326,7 +382,7 @@ struct minix_inode {
 <div style="font-size: 0.8em">
 
 - Le nom `.` (0x2E) pointe sur l'inode 2 (lui même)
-- Le nom `.` (0x2E2E) pointe sur le répertoire parent, l'inode 1 (la racine)
+- Le nom `..` (0x2E2E) pointe sur le répertoire parent, l'inode 1 (la racine)
 - Il y a 2 répertoires : `linux` (inode 0x36C) et `system` (inode 0x9)
 - Il y a 2 fichiers : `hello.c` (inode 0xB) et `.bash_login` (inode 0xE)
 - Il y a 4 `dir_entry` inutilisées (inodes à 0)
@@ -359,7 +415,7 @@ struct minix_inode {
 
 ## Exemple de bloc de données - contenu fichier régulier
 
-Contenu du 1er bloc de données référencé par l'inode 11\
+Contenu du 1er bloc de données référencé par l'inode 11 (0xB)
 
 - bloc 583 (offset = 583*1024 = 0x91C00)
 
@@ -384,7 +440,7 @@ Contenu du 1er bloc de données référencé par l'inode 11\
 
 ## Exemple d'inode - fichier régulier
 
-Contenu de l'inode 16
+Contenu de l'inode 16 (0x10)
 
 ```c
 struct minix_inode {
@@ -407,7 +463,7 @@ struct minix_inode {
 
 ## Exemple de bloc de données - contenu fichier régulier
 
-Contenu du bloc indirect référencé par l'inode 11\
+Contenu du bloc indirect référencé par l'inode 16 (0x10)
 
 - bloc 595 (offset = 595*1024 = 0x94C00)
 
@@ -437,9 +493,9 @@ Contenu du bloc indirect référencé par l'inode 11\
 - Le nombre total d'inodes pouvant être créés dans le FS est indiqué par le champs `ninodes` du superbloc
 - La table des inodes possède `ninodes` entrées
 - Le premier inode de la table (à l'indice 0) est l'inode 1, il n'y a donc pas d'inode 0 !
-- **Attention** : le bit 0 du bitmap indique l'état de l'inode 0 !
-  - le bit 0 est toujours à 1 (utilisé), bien que l'inode 0 n'existe pas
-  - un FS vide aura donc 2 bits à 1 dans le bitmap\ : le bit 0 (inode 0) et le bit 1 (inode 1 = répertoire racine)
+- **Attention** :
+  - le bit 0 du bitmap indique l'"état" de l'inode 0 ! le bit 0 est toujours à 1 (utilisé), bien que l'inode 0 n'existe pas
+  - un FS vide aura donc 2 bits à 1 dans le bitmap: le bit 0 (inode 0) et le bit 1 (inode 1 = répertoire racine)
 
 </div>
 <br>
@@ -461,8 +517,9 @@ Contenu du bloc indirect référencé par l'inode 11\
 
 - Les n° de blocs dans l'inode sont relatifs au début du FS
 - Le bitmap des blocs de données indique uniquement l'état des **blocs de données** utilisés (donc pas superbloc, bitmaps, etc.)
-- **Attention** : le bit 0 du bitmap des blocs de données est à **ignorer** !
-  - il est toujours à 1 et ne représente aucun bloc de données
+- **Attention** :
+  - le bit 0 du bitmap des blocs de données est à **ignorer** !
+    - Il est toujours à 1 et ne représente aucun bloc de données
   - le bit 1 du bitmap correspond au bloc `firstdatazone` indiqué dans le superbloc
     - il correspond donc au premier bloc de données
 
diff --git a/9.filesystems/05_Systemes_fichiers_implementation.md b/9.filesystems/05_Systemes_fichiers_implementation.md
index cae8588..8a15357 100644
--- a/9.filesystems/05_Systemes_fichiers_implementation.md
+++ b/9.filesystems/05_Systemes_fichiers_implementation.md
@@ -155,7 +155,9 @@ indirect, pas l'indice 8
 - Nombre de blocs adressables avec une seule indirection : 4
 - Nombre de blocs adressables avec une double indirection : 4*4
 
-![](images/bmap_example.png)<!-- .element width="70%" -->
+![](images/bmap_example.png)<!-- .element width="65%" -->
+
+<small> ⚠️ ici les blocs sont indéxés logiquement en réalité c'est leur numéro physique qui est présents dans les tableaux de zone
 
 --
 
-- 
GitLab