-
Notifications
You must be signed in to change notification settings - Fork 4
Virtual File System
Le système de VFS de TacOS a été conçu dans l'optique d'être le plus simple possible. Il n'y a aucun mécanisme de cache et les systèmes de fichiers ne peuvent être montés qu'à la racine (pas besoin de créer de dossier pour monter un FS, d'ailleurs ce n'est pas possible de créer de dossier à la racine).
+-------+ +--------+
v | v |
+--------+ | +---------+ | +----------+
| name | +---|-fs | +--|-instance |
| mount | | device | | ... |
| umount | | getroot | | read |
| | | lookup | | write |
| | | ... | | ... |
+--------+ +---------+ +----------+
file_system_t fs_instance_t open_file_descriptor
Lorsque de l'appel à la fonction sys_open, vfs_open est appelé et ce dernier va examiner le chemin pour retrouver l'instance de fs. Cet objet contient un pointeur vers la fonction open du bon file system. Open se charge d'allouer un nouvel open_file_descriptor et de faire en sorte que les fonctions read, write, etc soient ceux du file system utilisé.
Pour résumer, on retrouve dans fs_instance_t, les fonctions qui prennent en argument le chemin du fichier, alors que dans open_file_descriptor, ce sont des fonctions qui manipulent des fichiers déjà ouverts.
Lors de l'appel à une fonction tel que open ou mkdir, le VFS s'occupe de retrouver l'instance de fs qui va bien. Pour cela l'algorithme est trivial : on prend le premier dossier du chemin (toujours absolu) et on recherche dans la liste des points de montage si on retrouve ce dossier. Chaque entrée de la liste des points de montage contient un pointeur vers l'instance de fs mais aussi le nom du point de montage.
Si on essaye de lire le contenu du dossier "/", alors le VFS retourne la liste des points de montage.
Si on veut que l'OS puisse monter un nouveau type de FS, on doit simplement créer une nouvelle structure file_system_t et l'enregistrer avec vfs_register_fs. Et pour monter un disque, on utilise la fonction mount avec pour argument le device, le nom du point de montage et le type de FS.
La structure file_system_t contient juste le nom du FS, un pointeur vers la fonction mount et un pointeur vers la fonction umount.
Lors de la manipulation d'un fichier, on obtient une structure de type inode_t qui contient toutes les informations sur le fichier ainsi qu'un pointeur vers les fonctions de manipulation (read, write, etc.).
On y trouve aussi un pointeur i_fs_specific pour stocker des informations complémentaires qui n'ont de sens que pour le FS manipulant cet inode.
Lors du mount d'un FS, le FS alloue une structure de type fs_instance_t qui contient :
- device : de type open_file_descriptor, c'est le périphérique de type block utilisé pour les lectures/écritures.
- getroot : pointeur vers la fonction qui renvoie l'entrée racine.
Ainsi que les fonctions de manipulation d'inode :
- lookup : pointeur vers la fonction de résolution de nom (renvoie une entrée).
- mkdir : pointeur vers la fonction de création de dossier.
- mknod : pointeur vers la fonction de création de noeud (fichier régulier ou spécial).
- stat : pointeur vers la fonction qui retourne le status d'un noeud.
- unlink : pointeur vers la fonction qui supprime un noeud.
- rmdir : pointeur vers la fonction de suppression d'un dossier.
- truncate : pointeur vers la fonction qui change la taille d'un fichier.
- setattr : pointeur vers la fonction de mise à jour des attributs d'un noeud.
- rename : pointeur vers la fonction pour renommer / déplacer un noeud.
Pour toutes ses fonctions, le premier argument est un pointeur vers l'inode. Les fonctions read, write, etc, sont affectés lors du open, dans l'open file descriptor (Open File Descriptors).