GNU/Linux >> Linux Esercitazione >  >> Linux

Cosa succede quando eseguo il comando Cat /proc/cpuinfo?

Cosa succede quando scrivo cat /proc/cpuinfo . È una named pipe (o qualcos'altro) al sistema operativo che legge le informazioni sulla CPU al volo e genera quel testo ogni volta che lo chiamo?

Risposta accettata:

Ogni volta che leggi un file in /proc , questo richiama del codice nel kernel che calcola il testo da leggere come contenuto del file. Il fatto che il contenuto sia generato al volo spiega perché quasi tutti i file hanno il loro tempo riportato come adesso e le loro dimensioni riportate come 0 — qui dovresti leggere 0 come "non so". A differenza dei normali filesystem, il filesystem che è montato su /proc , chiamato procfs, non carica i dati da un disco o altro supporto di memorizzazione (come FAT, ext2, zfs, …) o sulla rete (come NFS, Samba, …) e non chiama il codice utente (a differenza di FUSE ).

Procfs è presente nella maggior parte degli unice non BSD. Ha iniziato la sua vita nei Bell Labs di AT&T nell'ottava edizione di UNIX come un modo per riportare informazioni sui processi (e ps è spesso una graziosa stampante per informazioni lette tramite /proc ). La maggior parte delle implementazioni di procfs ha un file o una directory chiamata /proc/123 per riportare informazioni sul processo con PID 123. Linux estende il filesystem proc con molte più voci che riportano lo stato del sistema, incluso il tuo esempio /proc/cpuinfo .

In passato, /proc di Linux ha acquisito vari file che forniscono informazioni sui driver, ma questo uso è ora deprecato a favore di /sys e /proc ora si evolve lentamente. Voci come /proc/bus e /proc/fs/ext4 rimangono dove si trovano per la compatibilità con le versioni precedenti, ma le interfacce simili più recenti vengono create in /sys . In questa risposta, mi concentrerò su Linux.

Il primo e il secondo punto di accesso per la documentazione su /proc su Linux sono:

  1. il proc(5) pagina man;
  2. Il /proc filesystem nella documentazione del kernel .

Il tuo terzo punto di accesso, quando la documentazione non lo copre, è leggere la fonte . Puoi scaricare il sorgente sulla tua macchina, ma questo è un programma enorme e LXR, il riferimento incrociato di Linux, è di grande aiuto. (Ci sono molte varianti di LXR; quella in esecuzione su lxr.linux.no è di gran lunga il più bello, ma sfortunatamente il sito è spesso inattivo.) È richiesta una piccola conoscenza del C, ma non è necessario essere un programmatore per rintracciare un valore misterioso.

La gestione principale di /proc le voci si trovano in fs/proc directory. Qualsiasi pilota può registrare voci in /proc (sebbene, come indicato sopra, questo sia ora deprecato a favore di /sys ), quindi se non trovi quello che cerchi in fs/proc , guarda ovunque. I driver chiamano le funzioni dichiarate in include/linux/proc_fs.h . Le versioni del kernel fino alla 3.9 forniscono le funzioni create_proc_entry e alcuni wrapper (soprattutto create_proc_read_entry ), e le versioni del kernel 3.10 e successive forniscono invece solo proc_create e proc_create_data (e pochi altri).

Prendendo /proc/cpuinfo ad esempio, una ricerca per "cpuinfo" ti porta alla chiamata a proc_create("cpuinfo, …") in fs/proc/cpuinfo.c . Puoi vedere che il codice è praticamente un codice standard:poiché la maggior parte dei file sotto /proc scarica solo alcuni dati di testo, ci sono funzioni di supporto per farlo. C'è semplicemente un seq_operations struttura, e la vera carne è nel cpuinfo_op struttura dei dati, che dipende dall'architettura, generalmente definita in arch/<architecture>/kernel/setup.c (o talvolta un file diverso). Prendendo come esempio x86, siamo portati a arch/x86/kernel/cpu/proc.c . Lì la funzione principale è show_cpuinfo , che stampa il contenuto del file desiderato; il resto dell'infrastruttura è lì per fornire i dati al processo di lettura alla velocità richiesta. Puoi vedere i dati assemblati al volo dai dati in varie variabili nel kernel, inclusi alcuni numeri calcolati al volo come la frequenza della CPU.

Correlati:l'opzione -F per ls?

Gran parte di /proc sono le informazioni per processo in /proc/<PID> . Queste voci sono registrate in fs/proc/base.c , nel tgid_base_stuff Vettore; alcune funzioni qui registrate sono definite in altri file. Diamo un'occhiata ad alcuni esempi di come vengono generate queste voci:

  • cmdline è generato da proc_pid_cmdline nello stesso file. Individua i dati nel processo e li stampa.
  • clear_refs , a differenza delle voci che abbiamo visto finora, è scrivibile ma non leggibile. Pertanto le proc_clear_refs_operations strutture definisce un clear_refs_write funzione ma nessuna funzione di lettura.
  • cwd è un collegamento simbolico (un po' magico), dichiarato da proc_cwd_link , che cerca la directory corrente del processo e la restituisce come contenuto del collegamento.
  • fd è una sottodirectory. Le operazioni sulla directory stessa sono definite in proc_fd_operations struttura dei dati (sono standard ad eccezione della funzione che enumera le voci, proc_readfd , che enumera i file aperti del processo) mentre le operazioni sulle voci sono in `proc_fd_inode_operations.

Un'altra importante area di /proc è /proc/sys , che è un'interfaccia diretta per sysctl . La lettura da una voce in questa gerarchia restituisce il valore del valore sysctl corrispondente e la scrittura imposta il valore sysctl. I punti di ingresso per sysctl sono in fs/proc/proc_sysctl.c . Sysctl ha il proprio sistema di registrazione con register_sysctl e amici.


Linux
  1. Qual è l'uso del comando '/usr/bin/[' [parentesi quadra] in Linux?

  2. Qual è l'equivalente di /proc/cpuinfo su FreeBSD v8.1?

  3. /proc/[pid]/pagemaps e /proc/[pid]/maps | Linux

  4. Come ottenere il numero di CPU/core in Linux dalla riga di comando?

  5. Qual è la differenza tra /tmp e /run?

Qual è la differenza tra Cat e Touch Command

Qual è il comando kill in Linux?

/proc/cpuinfo e /proc/meminfo in Linux

Cosa succede in background quando esegui il comando "useradd" in Linux

Comprendere i file /proc/mounts, /etc/mtab e /proc/partitions

Cos'è anon_inode nell'output di ls -l /proc/[PID]/fd?