Skip to content

Système de Fichiers en Mémoire ​

Aperçu ​

Le Système de Fichiers en Mémoire est le coeur de Memesplora, organisant les blocs mémoire alloués par la couche périphérique en une structure complète de système de fichiers prenant en charge les arborescences de répertoires, la lecture/écriture de fichiers, la gestion des permissions et autres opérations standard de système de fichiers.

Disposition du Superbloc ​

┌──────────────────────────────────────────────────┐
│ SuperBlock (64 octets)                            │
│  - Magic:   0x4D454D4653 ("MEMFS")              │
│  - Version: 1                                    │
│  - BlockSize: 4096 (défaut 4K)                   │
│  - TotalBlocks                                   │
│  - FreeBlocks                                    │
│  - InodeCount                                    │
│  - FreeInodes                                    │
│  - RootInode                                     │
│  - Checksum                                      │
├──────────────────────────────────────────────────┤
│ Table des Inodes (128 octets chacun)              │
│  - Inode ID (4 octets)                           │
│  - Type (1 octet)                                │
│  - Permissions (2 octets)                        │
│  - Owner ID (4 octets)                           │
│  - Size (8 octets)                               │
│  - Created At (8 octets)                         │
│  - Modified At (8 octets)                        │
│  - Block Count (4 octets)                        │
│  - Direct Blocks [12] (48 octets)                │
│  - Indirect Block (4 octets)                     │
│  - Name (longueur variable)                      │
├──────────────────────────────────────────────────┤
│ Blocs de Données                                  │
│  - Blocs de répertoire : entrées de répertoire    │
│  - Blocs de fichier : contenu du fichier          │
│  - Blocs indirects : pointeurs vers plus de blocs │
└──────────────────────────────────────────────────┘

Interface Principale ​

go
type FileSystem interface {
    Init(ctx context.Context, size uint64, blockSize uint32) error
    Mount(ctx context.Context) error
    Unmount() error
    Create(ctx context.Context, path string, ownerID uint32) (File, error)
    Open(ctx context.Context, path string) (File, error)
    Delete(ctx context.Context, path string) error
    Rename(ctx context.Context, oldPath, newPath string) error
    Mkdir(ctx context.Context, path string, ownerID uint32) error
    ReadDir(ctx context.Context, path string) ([]FileInfo, error)
    Stat(ctx context.Context, path string) (FileInfo, error)
    Stats() FsStats
}

Gestion des Inodes ​

Chaque fichier ou répertoire possède un Inode unique avec 12 blocs directs et 1 bloc indirect pour les fichiers plus volumineux.

Concurrence ​

  • Au niveau du système de fichiers : sync.RWMutex
  • Au niveau de l'Inode : verrous lecture-écriture indépendants par inode
  • Prévention des interblocages : les verrous sont acquis dans un ordre hiérarchique (répertoire → fichier enfant)

Apache License 2.0