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
/proc
systè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 :
cmdline
est généré parproc_pid_cmdline
dans 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_operations
structures définit unclear_refs_write
fonction mais pas de fonction de lecture.cwd
est 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.fd
est un sous-répertoire. Les opérations sur le répertoire lui-même sont définies dans leproc_fd_operations
structure 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.