Principes du Système d'Exploitation : Redirection et Système de Fichiers

Espace Utilisateur vs Espace Noyau

Les opérations sur les fichiers semblent simples en espace utilisateur :

int desc = ouvrir("donnees.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
ecrire(desc, "salut\n", 6);
fermer(desc);

Mais cela ne montre que la surface. En réalité, un descripteur de fichier (fd) est seulement un index vers des structures internes au noyau.

Gestion des Descripteurs de Fichiers

Chaque processus possède une table de descripteurs dans sa structure de contrôle :

struct table_fichiers {
    struct fichier *tab_desc[MAX_DESCRIPTEURS];
};

Les index 0, 1 et 2 sont pré-attribués respectivement à l'entrée standard, la sortie standard et la sortie d'erreur. Le descripteur est l'index dans ce tableau.

Structure du Fichier Ouvert

La structure interne pour un fichier ouvert est définie comme suit :

struct fichier {
    struct operations_fichier *ops;
    position_courante pos;
    int mode;
    void *donnees_privees;
};

Un inode représente les attributs d'un fichier, tandis que cette structure capture une session d'ouverture spécifique par un processus.

Appel Système Ouvrir

L'appel système effectue trois étapes clés :

  1. Création d'une instance de structure de fichier en analysant le chemin et en localisant l'inode.
  2. Affectation du plus petit index disponible dans la table des descripteurs du processus.
  3. Retour de cet index comme descripteur.

Pourquoi le Descripteur est le Plus Petit Index

Le noyau parcourt le tableau de descripteurs depuis l'index zéro jusqu'à trouver une place libre. Ainsi, après une fermeture, le prochain descripteur attribué peut réutiliser cet index.

Initialisation des Descripteurs Standards

Lors de la création d'un processus via fork et exec, le noyau initialise les descripteurs 0, 1 et 2 pour les flux standards.

Redirection par le Shell

La commande ./programme > sortie.log 2>&1 est transformée par le shell avant l'exécution :

fermer(1);
ouvrir("sortie.log") // retourne un descripteur, par exemple 1
dupliquer(1, 2); // redirige la sortie d'erreur vers le même fichier

C'est une simple réaffectation des pointeurs dans la table des descripteurs.

Mémoire Tampon en Langage C

Les fonctions comme printf utilisent des tampons en espace utilisateur pour réduire les appels système. Les stratégies incluent le tampon complet pour les fichiers, le tampon par ligne pour les terminaux, et l'absence de tampon pour stderr. Le tampon est vidé lorsqu'il est plein, sur un saut de ligne, par fflush, ou à la fin du processus.

Structure du Système de Fichiers sur Disque

Une partition typique ext4 est organisée ainsi :

| bloc super |
| GDT |
| bitmap blocs |
| bitmap inodes |
| table inodes |
| blocs données |

Chaque bloc fait généralement 4 Ko. Un inode contient les métadonnées du fichier, mais pas son nom. Les noms sont stockés dans les répertoires, qui associent des noms aux numéros d'inode.

Résolution de Chemin

Pour accéder à un fichier comme /rep1/rep2/fichier.txt :

  1. Commencer à l'inode racine.
  2. Dans le bloc de données du répertoire, chercher l'entrée correspondante.
  3. Répéter jusqu'à l'inode cible.
  4. Accéder aux blocs de données via l'inode.

Création et Suppression de Fichiers

La création alloue un inode et des blocs de données, puis met à jour le répertoire parent. La suppression libère ces ressources et efface l'entrée de répertoire. Cependant, si des processus tiennent encore des ouvertures, la libération finale est reportée.

Résumé

Les descripteurs sont des index privés au processus. Les structures de fichier décrivent les sessions d'ouverture. Les inodes et blocs de données stockent les métadonnées et le contenu. La redirection manipule les descripteurs pour rediriger les flux. Le système de fichiers virtuel (VFS) permet une abstraction à travers différentes implémentations.

Étiquettes: Linux système de fichiers descripteurs de fichiers inodes VFS

Publié le 7 juillet à 21h50