GNU/Linux >> Tutoriels Linux >  >> Linux

Que se passe-t-il lorsque j'exécute la commande Cat /proc/cpuinfo ?

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 :

  1. le proc(5) page de manuel;
  2. 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.

Connexe :L'option -F pour ls ?

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é par proc_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, le proc_clear_refs_operations structures définit un clear_refs_write fonction mais pas de fonction de lecture.
  • cwd est un lien symbolique (un peu magique), déclaré par proc_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 le proc_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.


Linux
  1. Comment Linux gère-t-il plusieurs séparateurs de chemins consécutifs (/home////nom d'utilisateur///fichier) ?

  2. Que se passe-t-il lorsque la limite de bande passante est dépassée ?

  3. Comment obtenir le chemin d'un processus sous Unix / Linux

  4. Que fait la ligne '!/bin/sh -e' ?

  5. Quel est l'équivalent de /proc/cpuinfo sur FreeBSD v8.1 ?

Quelle est la différence entre le chat et la commande tactile

Qu'est-ce que la commande kill sous Linux ?

Fichiers /proc/cpuinfo et /proc/meminfo sous Linux

Que se passe-t-il en arrière-plan lorsque vous exécutez la commande "useradd" sous Linux

Comprendre les fichiers /proc/mounts, /etc/mtab et /proc/partitions

Qu'est-ce qu'anon_inode dans la sortie de ls -l /proc/[PID]/fd ?