Que se passe-t-il lorsque j'écris cat /proc/cpuinfo . Est-ce un canal nommé (ou autre chose) vers le système d'exploitation qui lit les informations du processeur à la volée et génère ce texte à chaque fois que je l'appelle ?
Réponse acceptée :
Chaque fois que vous lisez un fichier sous /proc , cela appelle du code dans le noyau qui calcule le texte à lire comme contenu du fichier. Le fait que le contenu soit généré à la volée explique pourquoi presque tous les fichiers ont leur heure signalée comme maintenant et leur taille signalée comme 0 – ici, vous devriez lire 0 comme "je ne sais pas". Contrairement aux systèmes de fichiers habituels, le système de fichiers qui est monté sur /proc , qui s'appelle procfs, ne charge pas de données à partir d'un disque ou d'un autre support de stockage (comme FAT, ext2, zfs, …) ou sur le réseau (comme NFS, Samba, …) et n'appelle pas de code utilisateur (contrairement à FUSE ).
Procfs est présent dans la plupart des unices non-BSD. Il a commencé sa vie dans les Bell Labs d'AT&T sous UNIX 8e édition comme moyen de rapporter des informations sur les processus (et ps est souvent une jolie imprimante pour les informations lues via /proc ). La plupart des implémentations procfs ont un fichier ou un répertoire appelé /proc/123 pour rapporter des informations sur le processus avec le PID 123. Linux étend le système de fichiers proc avec beaucoup plus d'entrées qui rapportent l'état du système, y compris votre exemple /proc/cpuinfo .
Dans le passé, le /proc de Linux acquis divers fichiers qui fournissent des informations sur les pilotes, mais cette utilisation est désormais déconseillée au profit de /sys , et /proc évolue maintenant lentement. Des entrées comme /proc/bus et /proc/fs/ext4 restent où ils sont pour la rétrocompatibilité, mais de nouvelles interfaces similaires sont créées sous /sys . Dans cette réponse, je vais me concentrer sur Linux.
Vos premier et deuxième points d'entrée pour la documentation sur /proc sous Linux sont :
- le
proc(5)page de manuel; - Le
/procsystème de fichiers dans la documentation du noyau .
Votre troisième point d'entrée, lorsque la documentation ne le couvre pas, est la lecture de la source . Vous pouvez télécharger la source sur votre machine, mais c'est un énorme programme, et LXR, la référence croisée Linux, est d'une grande aide. (Il existe de nombreuses variantes de LXR ; celle qui s'exécute sur lxr.linux.no est de loin le meilleur mais malheureusement le site est souvent indisponible.) Une petite connaissance du C est nécessaire, mais vous n'avez pas besoin d'être un programmeur pour traquer une valeur mystérieuse.
La gestion de base de /proc les entrées sont dans le fs/proc annuaire. N'importe quel pilote peut enregistrer des entrées dans /proc (bien que, comme indiqué ci-dessus, cela soit désormais obsolète au profit de /sys ), donc si vous ne trouvez pas ce que vous cherchez dans fs/proc , regarde partout ailleurs. Les pilotes appellent les fonctions déclarées dans include/linux/proc_fs.h . Les versions du noyau jusqu'à 3.9 fournissent les fonctions create_proc_entry et certains wrappers (en particulier create_proc_read_entry ), et les versions de noyau 3.10 et supérieures fournissent à la place uniquement proc_create et proc_create_data (et quelques autres).
Prendre /proc/cpuinfo par exemple, une recherche de "cpuinfo" vous mène à l'appel à proc_create("cpuinfo, …") dans fs/proc/cpuinfo.c . Vous pouvez voir que le code est à peu près du code passe-partout :puisque la plupart des fichiers sous /proc il suffit de vider certaines données textuelles, il existe des fonctions d'assistance pour le faire. Il y a simplement un seq_operations structure, et la vraie viande est dans le cpuinfo_op structure de données, qui dépend de l'architecture, généralement définie dans arch/<architecture>/kernel/setup.c (ou parfois un fichier différent). En prenant x86 comme exemple, nous sommes conduits à arch/x86/kernel/cpu/proc.c . Là, la fonction principale est show_cpuinfo , qui imprime le contenu du fichier souhaité ; le reste de l'infrastructure est là pour fournir les données au processus de lecture à la vitesse à laquelle il le demande. Vous pouvez voir les données assemblées à la volée à partir de données dans diverses variables du noyau, y compris quelques nombres calculés à la volée tels que la fréquence du processeur.
Une grande partie de /proc est l'information par processus dans /proc/<PID> . Ces entrées sont enregistrées dans fs/proc/base.c , dans le tgid_base_stuff déployer; certaines fonctions enregistrées ici sont définies dans d'autres fichiers. Examinons quelques exemples de la manière dont ces entrées sont générées :
cmdlineest généré parproc_pid_cmdlinedans le même fichier. Il localise les données dans le processus et les imprime.clear_refs, contrairement aux entrées que nous avons vues jusqu'à présent, est inscriptible mais pas lisible. Par conséquent, leproc_clear_refs_operationsstructures définit unclear_refs_writefonction mais pas de fonction de lecture.cwdest un lien symbolique (un peu magique), déclaré parproc_cwd_link, qui recherche le répertoire actuel du processus et le renvoie comme contenu du lien.fdest un sous-répertoire. Les opérations sur le répertoire lui-même sont définies dans leproc_fd_operationsstructure de données (elles sont passe-partout à l'exception de la fonction qui énumère les entrées,proc_readfd, qui énumère les fichiers ouverts du processus) tandis que les opérations sur les entrées sont dans `proc_fd_inode_operations.
Un autre domaine important de /proc est /proc/sys , qui est une interface directe avec sysctl . La lecture à partir d'une entrée de cette hiérarchie renvoie la valeur de la valeur sysctl correspondante, et l'écriture définit la valeur sysctl. Les points d'entrée pour sysctl sont dans fs/proc/proc_sysctl.c . Les sysctls ont leur propre système d'enregistrement avec register_sysctl et amis.