GNU/Linux >> Tutoriales Linux >  >> Linux

¿Qué sucede cuando ejecuto el comando Cat /proc/cpuinfo?

¿Qué sucede cuando escribo cat /proc/cpuinfo? . ¿Es una canalización con nombre (o algo más) al sistema operativo que lee la información de la CPU sobre la marcha y genera ese texto cada vez que lo llamo?

Respuesta aceptada:

Siempre que lea un archivo bajo /proc , esto invoca algún código en el núcleo que calcula el texto para leer como el contenido del archivo. El hecho de que el contenido se genere sobre la marcha explica por qué casi todos los archivos tienen su tiempo informado como ahora y su tamaño informado como 0; aquí debería leer 0 como "no sé". A diferencia de los sistemas de archivos habituales, el sistema de archivos que está montado en /proc , que se llama procfs, no carga datos desde un disco u otro medio de almacenamiento (como FAT, ext2, zfs,...) o a través de la red (como NFS, Samba,...) y no llama al código de usuario (a diferencia de FUSE ).

Procfs está presente en la mayoría de los dispositivos que no son BSD. Comenzó su vida en Bell Labs de AT&T en UNIX 8th edition como una forma de reportar información sobre procesos (y ps es a menudo una impresora bonita para leer información a través de /proc ). La mayoría de las implementaciones de procfs tienen un archivo o directorio llamado /proc/123 para reportar información sobre el proceso con PID 123. Linux extiende el sistema de archivos proc con muchas más entradas que reportan el estado del sistema, incluyendo su ejemplo /proc/cpuinfo .

En el pasado, /proc de Linux adquirió varios archivos que brindan información sobre los controladores, pero este uso ahora está obsoleto a favor de /sys y /proc ahora evoluciona lentamente. Entradas como /proc/bus y /proc/fs/ext4 permanecen donde están por compatibilidad con versiones anteriores, pero se crean interfaces similares más nuevas en /sys . En esta respuesta, me centraré en Linux.

Su primer y segundo punto de entrada para la documentación sobre /proc en Linux son:

  1. el proc(5) página man;
  2. El /proc sistema de archivos en la documentación del kernel .

Su tercer punto de entrada, cuando la documentación no lo cubre, es leer la fuente . Puede descargar la fuente en su máquina, pero este es un programa enorme, y LXR, la referencia cruzada de Linux, es de gran ayuda. (Hay muchas variantes de LXR; la que se ejecuta en lxr.linux.no es el mejor con diferencia, pero desafortunadamente el sitio suele estar caído). Se requiere un poco de conocimiento de C, pero no es necesario ser programador para rastrear un valor misterioso.

El manejo central de /proc las entradas están en fs/proc directorio. Cualquier conductor puede registrar entradas en /proc (aunque como se indicó anteriormente, ahora está en desuso a favor de /sys ), por lo que si no encuentra lo que busca en fs/proc , mira por todos lados. Los controladores llaman a las funciones declaradas en include/linux/proc_fs.h . Las versiones del kernel hasta la 3.9 proporcionan las funciones create_proc_entry y algunos contenedores (especialmente create_proc_read_entry ), y las versiones del kernel 3.10 y superiores proporcionan en su lugar solo proc_create y proc_create_data (y algunos más).

Tomando /proc/cpuinfo como ejemplo, una búsqueda de "cpuinfo" lo lleva a la llamada a proc_create("cpuinfo, …") en fs/proc/cpuinfo.c . Puede ver que el código es bastante repetitivo:dado que la mayoría de los archivos se encuentran en /proc simplemente descargue algunos datos de texto, hay funciones de ayuda para hacer eso. Simplemente hay un seq_operations estructura, y la verdadera carne está en el cpuinfo_op estructura de datos, que depende de la arquitectura, generalmente definida en arch/<architecture>/kernel/setup.c (o, a veces, un archivo diferente). Tomando x86 como ejemplo, llegamos a arch/x86/kernel/cpu/proc.c . Allí la función principal es show_cpuinfo , que imprime el contenido del archivo deseado; el resto de la infraestructura está ahí para alimentar los datos al proceso de lectura a la velocidad que lo solicita. Puede ver los datos que se ensamblan sobre la marcha a partir de datos en varias variables en el kernel, incluidos algunos números calculados sobre la marcha, como la frecuencia de la CPU.

Relacionado:¿La opción -F para ls?

Una gran parte de /proc es la información por proceso en /proc/<PID> . Estas entradas se registran en fs/proc/base.c , en el tgid_base_stuff formación; algunas funciones registradas aquí están definidas en otros archivos. Veamos algunos ejemplos de cómo se generan estas entradas:

  • cmdline es generado por proc_pid_cmdline en el mismo archivo. Localiza los datos en el proceso y los imprime.
  • clear_refs , a diferencia de las entradas que hemos visto hasta ahora, se puede escribir pero no leer. Por lo tanto, proc_clear_refs_operations estructuras define un clear_refs_write pero sin función de lectura.
  • cwd es un enlace simbólico (ligeramente mágico), declarado por proc_cwd_link , que busca el directorio actual del proceso y lo devuelve como el contenido del enlace.
  • fd es un subdirectorio. Las operaciones en el propio directorio se definen en proc_fd_operations estructura de datos (son repetitivos excepto por la función que enumera las entradas, proc_readfd , que enumera los archivos abiertos del proceso) mientras que las operaciones en las entradas están en `proc_fd_inode_operations.

Otra área importante de /proc es /proc/sys , que es una interfaz directa a sysctl . La lectura de una entrada en esta jerarquía devuelve el valor del valor de sysctl correspondiente y la escritura establece el valor de sysctl. Los puntos de entrada para sysctl están en fs/proc/proc_sysctl.c . Sysctls tiene su propio sistema de registro con register_sysctl y amigos.


Linux
  1. ¿Qué hace la línea '!/bin/sh -e'?

  2. ¿Cuál es el equivalente de /proc/cpuinfo en FreeBSD v8.1?

  3. /proc/[pid]/pagemaps y /proc/[pid]/maps | linux

  4. ¿Cómo obtener la cantidad de CPU/núcleos en Linux desde la línea de comandos?

  5. ¿Cuándo debo usar /dev/shm/ y cuándo debo usar /tmp/?

¿Cuál es la diferencia entre el comando Cat y Touch?

¿Qué es el comando matar en Linux?

Archivos /proc/cpuinfo y /proc/meminfo en Linux

Qué sucede en segundo plano cuando ejecuta el comando "useradd" en Linux

Comprender los archivos /proc/mounts, /etc/mtab y /proc/partitions

¿Qué es anon_inode en la salida de ls -l /proc/[PID]/fd?