Supposons que j'ai inventé un nouveau système de fichiers et que je souhaite maintenant créer un pilote de système de fichiers pour celui-ci.
Comment pourrais-je implémenter ce pilote de système de fichiers, est-ce fait en utilisant un module de noyau?
Et comment le pilote du système de fichiers peut-il accéder au disque dur, si le pilote du système de fichiers contient du code pour accéder au disque dur, ou Linux contient-il un pilote de périphérique pour accéder au disque dur utilisé par tous les pilotes du système de fichiers?
Oui, les systèmes de fichiers sous Linux peuvent être implémentés en tant que modules du noyau. Mais il y a aussi l'interface Fuse (Filesystem in USErspace), qui peut permettre à un processus d'espace utilisateur normal d'agir comme un pilote de système de fichiers. Si vous prototypez un nouveau système de fichiers, l'implémenter d'abord à l'aide de l'interface Fuse pourrait faciliter les tests et le développement. Une fois que les composants internes du système de fichiers ont été élaborés sous forme de fusible, vous pouvez alors commencer à en implémenter une version de module de noyau optimisée pour les performances.
Voici quelques informations de base sur l'implémentation d'un système de fichiers dans l'espace noyau. Il est assez ancien (de 1996!), Mais cela devrait au moins vous donner une idée de base du genre de choses que vous devrez faire.
Si vous choisissez d'aller sur la route Fuse, voici libfuse, l'implémentation de référence du côté espace utilisateur de l'interface Fuse.
Fondamentalement, la fonction d'initialisation de votre module de pilote de système de fichiers doit simplement appeler une fonction register_filesystem()
, et lui donner comme paramètre une structure qui inclut un pointeur de fonction qui identifie la fonction dans votre pilote de système de fichiers qui sera utilisée comme la première étape pour identifier votre type de système de fichiers et le monter. Il ne se passe plus rien à ce stade.
Lorsqu'un système de fichiers est en cours de montage, et que le type de système de fichiers est spécifié pour correspondre à votre pilote, ou que la détection automatique du type de système de fichiers est effectuée, la couche Virtual FileSystem du noyau (VFS pour faire court) appellera cette fonction. Il dit essentiellement "Voici un pointeur vers une représentation au niveau du noyau d'un périphérique de bloc Linux standard. Jetez-y un œil, voyez si c'est quelque chose que vous pouvez gérer, puis dites-moi ce que vous pouvez en faire."
À ce stade, votre pilote est censé lire tout ce dont il a besoin pour vérifier que c'est le bon pilote pour le système de fichiers, puis renvoyer une structure qui inclut des pointeurs vers d'autres fonctions que votre pilote peut faire avec ce système de fichiers particulier. Ou si le pilote du système de fichiers ne reconnaît pas les données sur le disque, il est censé renvoyer un résultat d'erreur approprié, puis VFS signalera une défaillance dans l'espace utilisateur ou - si une détection automatique de type de système de fichiers est effectuée - demandera à un autre système de fichiers pilote pour essayer.
Les autres pilotes du noyau fourniront l'interface de périphérique de bloc standard, de sorte que le pilote du système de fichiers n'aura pas à implémenter la prise en charge matérielle. Fondamentalement, le pilote du système de fichiers peut lire et écrire des blocs de disque en utilisant des fonctions standard au niveau du noyau avec le pointeur de périphérique qui lui est attribué.
La couche VFS s'attend à ce que le pilote du système de fichiers mette un certain nombre de fonctions standard à la disposition de la couche VFS; certains d'entre eux sont obligatoires pour que la couche VFS fasse quoi que ce soit de significatif avec le système de fichiers, d'autres sont facultatifs et vous pouvez simplement retourner un NULL à la place d'un pointeur vers une telle fonction facultative.
Oui, un pilote de noyau peut gérer un système de fichiers.
La meilleure solution pour simuler un prototype de système de fichiers est d'utiliser Fuse. Et après, vous pouvez penser à le transformer en pilote de noyau.
Wikipedia => https://en.wikipedia.org/wiki/Filesystem_in_Userspace
Source => https://github.com/libfuse/libfuse
un tutoriel => https://developer.ibm.com/articles/l-Fuse/
Oui, cela se fait généralement à l'aide d'un pilote de noyau qui peut être chargé en tant que module du noyau ou compilé dans le noyau.
Vous pouvez consulter des pilotes de système de fichiers similaires et leur fonctionnement ici .
Ces pilotes utilisent probablement des fonctions internes du noyau pour accéder aux périphériques de stockage sous forme de blocs d'octets, mais vous pouvez également utiliser des périphériques de bloc tels qu'exposés par les pilotes dans les dossiers périphériques de bloc et périphériques de caractères .
Vous pouvez utiliser Fuse pour créer un système de fichiers utilisateur ou écrire un module noyau. C'est plus facile à faire avec Fuse, car vous avez le choix des langues, et vous ne planterez pas le noyau (et donc tout le système).
Les modules du noyau peuvent être plus rapides, mais la première règle d'optimisation est la suivante: ne le faites pas avant d'avoir testé le code de travail. La seconde est comme ça: ne le faites pas avant d'avoir la preuve que c'est trop lent. Et le troisième: ne le conservez pas sauf si vous avez la preuve qu'il le rend plus rapide/plus petit.
Et oui, le noyau a déjà des pilotes pour le matériel, vous ne les réimplémentez pas.