Je suis nouveau sur Linux, j'ai découvert qu'il y a des "files réels" sous Linux et qu'il y a des "files virtuels", les files réels sont des files qui se trouvent sur le disque dur, alors que les files virtuels ne sont que des données représentées par le kernel sous forme de files .
Par exemple, les files du /proc
sont des files virtuels.
Je veux comprendre comment une fonction comme read()
sait comment lire un file réel et comment lire un file virtuel. J'ai créé le diagramme suivant pour montrer ma compréhension de ce sujet, s'il vous plaît corrigez-moi si j'ai tort de ma compréhension:
Dans la couche VFS, tous les files sont virtuels (ils ont été inventés par les ingénieurs SunOS pour lier les filesystems UFS (sur disque) et NFS (réseau)).
Chaque file
ouvert a une table de fonctions f_op
qui fournit des implémentations pour des routines communes (certaines peuvent être generics) et chaque inode
a un object address_space
attaché qui a aussi une table de fonctions C ( a_ops
) contenant les implémentations nécessaires. La séquence est la suivante:
sys_read()
: l'application lance la lecture de file à l'aide d'un appel système vfs_read()
) file->f_op->read()
ou do_sync_read()
ou new_sync_read()
a_ops->direct_IO()
, ext4_direct_IO()
pour ext4
) est appelée et datatables sont renvoyées file_get_page()
a_ops->readpage()
, qui est implémenté par ext4_readpage()
partir du pilote ext4
submit_bio()
De http://myaut.github.io/dtrace-stap-book/kernel/fs.html , il est un peu obsolète que la stack VFS a été refactorisée un peu après que j'aie écrit ceci
Je ne vais pas donner une réponse exhaustive à ce sujet par tous les moyens …
Vous êtes essentiellement correct, à l'exception d'une séparation importante: read () request au kernel ce qu'un descripteur de file contient, le kernel gère le rest. Qu'il s'agisse d'un système de files physique, d'un système de files réseau, d'un système de files virtuel (/ proc, / sys, …) n'est pas pertinent pour read () . Le kernel a un code sous-jacent pour traiter la requête (ou non), c'est ce que vous appelez un pilote.