GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was passiert, wenn ich den Befehl Cat /proc/cpuinfo ausführe?

Was passiert, wenn ich cat /proc/cpuinfo schreibe . Ist das eine benannte Pipe (oder etwas anderes) zum Betriebssystem, die die CPU-Informationen spontan liest und diesen Text bei jedem Aufruf generiert?

Akzeptierte Antwort:

Immer wenn Sie eine Datei unter /proc lesen , ruft dies einen Code im Kernel auf, der den zu lesenden Text als Dateiinhalt berechnet. Die Tatsache, dass der Inhalt spontan generiert wird, erklärt, warum für fast alle Dateien die Zeit als jetzt und die Größe als 0 gemeldet wird – hier sollten Sie 0 als „weiß nicht“ lesen. Im Gegensatz zu üblichen Dateisystemen wird das Dateisystem auf /proc gemountet , das procfs heißt, lädt keine Daten von einer Festplatte oder anderen Speichermedien (wie FAT, ext2, zfs, …) oder über das Netzwerk (wie NFS, Samba, …) und ruft keinen Benutzercode auf (im Gegensatz zu FUSE ).

Procfs ist in den meisten Nicht-BSD-Unices vorhanden. Es begann in den Bell Labs von AT&T in der 8. Ausgabe von UNIX, um Informationen über Prozesse (und ps ist oft ein hübscher Drucker für Informationen, die durch /proc gelesen werden ). Die meisten procfs-Implementierungen haben eine Datei oder ein Verzeichnis namens /proc/123 um Informationen über den Prozess mit PID 123 zu melden. Linux erweitert das proc-Dateisystem um viele weitere Einträge, die den Zustand des Systems melden, einschließlich Ihres Beispiels /proc/cpuinfo .

In der Vergangenheit war /proc von Linux hat verschiedene Dateien erworben, die Informationen über Treiber bereitstellen, aber diese Verwendung ist jetzt zugunsten von /sys veraltet , und /proc entwickelt sich jetzt langsam. Einträge wie /proc/bus und /proc/fs/ext4 bleiben aus Gründen der Abwärtskompatibilität dort, wo sie sind, aber neuere ähnliche Schnittstellen werden unter /sys erstellt . In dieser Antwort konzentriere ich mich auf Linux.

Ihr erster und zweiter Einstiegspunkt für die Dokumentation über /proc unter Linux sind:

  1. der proc(5) Manpage;
  2. Der /proc Dateisystem in der Kernel-Dokumentation .

Ihr dritter Einstiegspunkt, wenn die Dokumentation ihn nicht abdeckt, ist das Lesen der Quelle . Sie können den Quellcode auf Ihren Computer herunterladen, aber das ist ein riesiges Programm, und LXR, der Linux-Querverweis, ist eine große Hilfe. (Es gibt viele Varianten von LXR; diejenige, die auf lxr.linux.no läuft ist bei weitem die schönste, aber leider ist die Seite oft down.) Ein wenig C-Kenntnisse sind erforderlich, aber Sie müssen kein Programmierer sein, um einen mysteriösen Wert aufzuspüren.

Die zentrale Handhabung von /proc Einträge befinden sich im fs/proc Verzeichnis. Jeder Treiber kann Einträge in /proc registrieren (obwohl dies, wie oben angegeben, jetzt zugunsten von /sys veraltet ist ), wenn Sie also in fs/proc nicht finden, wonach Sie suchen , schauen Sie überall hin. Treiber rufen Funktionen auf, die in include/linux/proc_fs.h deklariert sind . Kernelversionen bis 3.9 bieten die Funktionen create_proc_entry und einige Wrapper (insbesondere create_proc_read_entry ) und die Kernel-Versionen 3.10 und höher bieten stattdessen nur proc_create und proc_create_data (und noch ein paar mehr).

Unter /proc/cpuinfo als Beispiel eine Suche nach "cpuinfo" führt Sie zum Aufruf von proc_create("cpuinfo, …") in fs/proc/cpuinfo.c . Sie können sehen, dass der Code ziemlich viel Boilerplate-Code ist:da die meisten Dateien unter /proc einfach einige Textdaten ausgeben, dafür gibt es Hilfsfunktionen. Es gibt lediglich eine seq_operations Struktur, und das eigentliche Fleisch befindet sich in cpuinfo_op Datenstruktur, die architekturabhängig ist und normalerweise in arch/<architecture>/kernel/setup.c definiert wird (oder manchmal eine andere Datei). Am Beispiel von x86 werden wir zu arch/x86/kernel/cpu/proc.c geführt . Dort ist die Hauptfunktion show_cpuinfo , die den gewünschten Dateiinhalt ausdruckt; der Rest der Infrastruktur ist dazu da, die Daten in der geforderten Geschwindigkeit dem Leseprozess zuzuführen. Sie können sehen, wie die Daten im laufenden Betrieb aus Daten in verschiedenen Variablen im Kernel zusammengesetzt werden, einschließlich einiger Zahlen, die im laufenden Betrieb berechnet werden, wie z. B. die CPU-Frequenz.

Verwandte:Die Option -F für ls?

Ein großer Teil von /proc sind die Informationen pro Prozess in /proc/<PID> . Diese Einträge werden in fs/proc/base.c registriert , im tgid_base_stuff Array; Einige hier registrierte Funktionen sind in anderen Dateien definiert. Sehen wir uns einige Beispiele an, wie diese Einträge generiert werden:

  • cmdline wird von proc_pid_cmdline generiert in derselben Datei. Es findet die Daten im Prozess und druckt sie aus.
  • clear_refs ist im Gegensatz zu den bisher gesehenen Einträgen beschreibbar, aber nicht lesbar. Daher die proc_clear_refs_operations Strukturen definiert ein clear_refs_write Funktion, aber keine Lesefunktion.
  • cwd ist ein symbolischer Link (ein leicht magischer), deklariert durch proc_cwd_link , das nach dem aktuellen Verzeichnis des Prozesses sucht und es als Linkinhalt zurückgibt.
  • fd ist ein Unterverzeichnis. Die Operationen auf dem Verzeichnis selbst werden in proc_fd_operations definiert Datenstruktur (sie sind Boilerplate mit Ausnahme der Funktion, die die Einträge aufzählt, proc_readfd , das die geöffneten Dateien des Prozesses auflistet), während Operationen an den Einträgen in `proc_fd_inode_operations.
  • sind

Ein weiterer wichtiger Bereich von /proc ist /proc/sys , das eine direkte Schnittstelle zu sysctl ist . Das Lesen aus einem Eintrag in dieser Hierarchie gibt den Wert des entsprechenden sysctl-Werts zurück, und das Schreiben setzt den sysctl-Wert. Die Einstiegspunkte für sysctl befinden sich in fs/proc/proc_sysctl.c . Sysctls haben ihr eigenes Registrierungssystem mit register_sysctl und Freunde.


Linux
  1. Was ist die Verwendung des Befehls ‘/usr/bin/[‘ [eckige Klammer] in Linux?

  2. Linux – Was bedeuten die Flags in /proc/cpuinfo?

  3. Was genau passiert, wenn ich eine Datei in der Shell ausführe?

  4. Linux – /proc/mnt mit /proc/mounts verknüpfen?

  5. Wie erhalte ich den Pfad eines Prozesses in Unix / Linux

Was ist der Unterschied zwischen Cat und Touch Command?

Was ist der Kill-Befehl in Linux?

/proc/cpuinfo- und /proc/meminfo-Dateien unter Linux

Was im Hintergrund passiert, wenn Sie unter Linux den Befehl „useradd“ ausführen

Die Dateien /proc/mounts, /etc/mtab und /proc/partitions verstehen

Was ist der Unterschied zwischen /tmp und /run?