web-dev-qa-db-fra.com

Comment implémenter un système de fichiers très simple?

Je me demande comment le système d'exploitation lit/écrit sur le disque dur.
J'aimerais par exemple mettre en place un système de fichiers simple, sans répertoires pouvant lire et écrire des fichiers.
Où est-ce que je commence?
Est-ce que C/C++ fera l'affaire ou dois-je adopter une approche plus bas niveau?
Est-ce trop difficile à gérer pour une seule personne?

24
the_drow

Jetez un coup d'oeil à Fuse: http://Fuse.sourceforge.net/

Cela vous permettra d'écrire un système de fichiers sans avoir à écrire un pilote de périphérique. À partir de là, je commencerais par un seul fichier. En gros, créez un fichier de (par exemple) 100 Mo de long, puis écrivez vos routines pour lire et écrire à partir de ce fichier. 

Une fois que vous êtes satisfait des résultats, vous pouvez alors envisager d'écrire un pilote de périphérique et de le faire fonctionner sur un disque physique. 

La bonne chose est que vous pouvez utiliser presque toutes les langues avec Fuse, pas seulement le C/C++.

17
Timothy Baldridge

Pour apprendre les idées d'un système de fichiers, il n'est pas vraiment nécessaire d'utiliser un disque, je pense. Créez simplement un tableau de 512 octets. Imaginez simplement que votre disque dur commence à expérimenter un peu. Aussi, vous voudrez peut-être jeter un coup d’œil à certains manuels scolaires standards tels que http://codex.cs.yale.edu/avi/ os-book/OS8/os8c/index.html

7
0x434D53

J'ai trouvé assez facile de comprendre un système de fichiers simple tout en utilisant le système de fichiers fat sur le microcontrôleur avr. 

http://Elm-chan.org/fsw/ff/00index_f.html

Regardez le code vous allez comprendre comment fonctionne la graisse. 

7
optixx

La réponse à votre première question est qu'outre Fuse, comme quelqu'un vous l'a dit, vous pouvez également utiliser Dokan qui fait la même chose pour Windows. À partir de là, il suffit de lire et d'écrire sur une partition physique ( http: //msdn.Microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx (lisez en particulier la section sur les disques physiques et les volumes)). 

Bien sûr, sous Linux ou Unix, en plus d'utiliser quelque chose comme Fuse, il vous suffit d'émettre un appel en lecture ou en écriture au périphérique souhaité dans/dev/xxx (si vous êtes root) et, dans ces conditions, les Unices sont plus conviviaux ou plus. non sécurisé selon votre point de vue.

À partir de là, essayez d’implémenter un système de fichiers simple comme Fat, ou quelque chose de plus exotérique, comme un système de fichiers tar, ou même un système de fichiers simple basé sur des concepts Unix comme UFS ou Minux, ou simplement quelque chose qui enregistre uniquement les appels passés et leurs arguments. fichier journal (et cela vous aidera à comprendre les appels qui sont faits au pilote du système de fichiers pendant l’utilisation régulière de votre ordinateur).

Maintenant, votre deuxième question (qui est beaucoup plus simple à répondre), oui, C/C++ fera l'affaire, car ils sont la lingua franca du développement système, une grande partie de votre exemple de code sera également en C/C++. moins lu C/C++ dans votre développement.

Maintenant, pour votre troisième question, oui, ceci est réalisable par une seule personne, par exemple le système de fichiers ext (largement connu dans le monde Linux par ses successeurs ext2 ou ext3) a été créé par un seul développeur, Theodore Ts'o. que ces choses ne sont pas faisables par une seule personne.

Maintenant les notes finales, rappelez-vous qu’un système de fichiers réel interagit avec de nombreux autres sous-systèmes d’un noyau normal, par exemple, si vous avez un ordinateur portable et que vous le mettez en veille prolongée, le système de fichiers doit effacer toutes les modifications apportées aux fichiers ouverts, si vous avez un ordinateur. fichier de page sur la partition ou même si le fichier de page a son propre système de fichiers, cela affectera votre système de fichiers, en particulier la taille des blocs, car ils auront tendance à être égaux ou à des puissances égales à la taille du bloc de la page, car il est facile de placer un bloc à partir du système de fichiers en mémoire qui, par coïncidence, est égal à la taille de la page (car il ne s'agit que d'un transfert).

Et aussi, la sécurité, car vous voudrez contrôler les utilisateurs et quels fichiers ils lisent/écrivent et cela signifie généralement qu'avant d'ouvrir un fichier, vous devez savoir quel utilisateur est connecté et quelles autorisations il a pour ce fichier. Et évidemment, sans système de fichiers, les utilisateurs ne peuvent exécuter aucun programme ni interagir avec la machine. Les couches de système de fichiers modernes interagissent également avec le sous-système réseau car il existe des systèmes de fichiers réseau et distribués.

Donc, si vous voulez apprendre à faire des systèmes de fichiers du noyau, vous devrez vous préoccuper de certaines choses (en plus de connaître une interface VFS)

P.S .: Si vous voulez que les autorisations Unix fonctionnent sous Windows, vous pouvez utiliser quelque chose comme ce que MS utilise pour NFS sur les versions serveur de Windows ( http://support.Microsoft.com/kb/262965 )

3
Coyote21

Juste un complément à ce que Coyote21 a dit. Vous pouvez lire cette thèse http://www.minix3.org/theses/gerofi-minix-vfs.pdf

Dans cette thèse, vous pouvez en apprendre un peu plus sur VFS et quelques détails y sont décrits. Il y a des choses très utiles dans l'annexe B. Il existe une implémentation d'un système de fichiers (pas un vrai système de fichiers, mais un en mémoire).

1