GNU/Linux >> Znalost Linux >  >> Linux

Co se stane, když spustím příkaz Cat /proc/cpuinfo?

Co se stane, když napíšu cat /proc/cpuinfo . Je to pojmenovaná roura (nebo něco jiného) pro operační systém, který za běhu čte informace o CPU a generuje tento text pokaždé, když jej zavolám?

Přijatá odpověď:

Kdykoli čtete soubor pod /proc , to vyvolá nějaký kód v jádře, který vypočítá text, který se má číst jako obsah souboru. Skutečnost, že obsah je generován za běhu, vysvětluje, proč téměř všechny soubory mají svůj čas hlášený jako nyní a jejich velikost je hlášena jako 0 – zde byste měli číst 0 jako „nevím“. Na rozdíl od běžných souborových systémů je to souborový systém, který je připojen k /proc , který se nazývá procfs, nenačítá data z disku nebo jiného paměťového média (jako FAT, ext2, zfs, …) nebo přes síť (jako NFS, Samba, …) a nevolá uživatelský kód (na rozdíl od FUSE ).

Procfs je přítomen ve většině unixů bez BSD. Svůj život začal v Bell Labs společnosti AT&T v UNIX 8. vydání jako způsob, jak hlásit informace o procesech (a ps je často pěkná tiskárna pro informace čtené přes /proc ). Většina implementací procfs má soubor nebo adresář s názvem /proc/123 k hlášení informací o procesu pomocí PID 123. Linux rozšiřuje souborový systém proc o mnoho dalších položek, které hlásí stav systému, včetně vašeho příkladu /proc/cpuinfo .

V minulosti Linux /proc získal různé soubory, které poskytují informace o ovladačích, ale toto použití je nyní zastaralé ve prospěch /sys a /proc nyní se pomalu vyvíjí. Záznamy jako /proc/bus a /proc/fs/ext4 zůstanou tam, kde jsou kvůli zpětné kompatibilitě, ale novější podobná rozhraní jsou vytvořena pod /sys . V této odpovědi se zaměřím na Linux.

Váš první a druhý vstupní bod pro dokumentaci o /proc na Linuxu jsou:

  1. proc(5) manuálová stránka;
  2. Program /proc souborový systém v dokumentaci jádra .

Vaším třetím vstupním bodem, pokud to dokumentace nepokrývá, je přečtení zdroje . Zdrojový kód si můžete stáhnout do svého počítače, ale toto je obrovský program a LXR, křížový odkaz na Linux, je velkou pomocí. (Existuje mnoho variant LXR; ta běžící na lxr.linux.no je zdaleka nejhezčí, ale bohužel web často nefunguje.) Vyžaduje se malá znalost jazyka C, ale nemusíte být programátor, abyste vystopovali záhadnou hodnotu.

Základní zpracování /proc položky jsou v fs/proc adresář. Každý ovladač může registrovat položky v /proc (ačkoli jak je uvedeno výše, toto je nyní zastaralé ve prospěch /sys ), takže pokud nenajdete to, co hledáte v fs/proc , podívejte se všude jinde. Ovladače volají funkce deklarované v include/linux/proc_fs.h . Verze jádra do 3.9 poskytují funkce create_proc_entry a některé obaly (zejména create_proc_read_entry ) a verze jádra 3.10 a vyšší poskytují místo toho pouze proc_create a proc_create_data (a několik dalších).

Použití /proc/cpuinfo například hledání "cpuinfo" vás zavede k volání proc_create("cpuinfo, …") v fs/proc/cpuinfo.c . Můžete vidět, že kód je do značné míry standardní kód:protože většina souborů je pod /proc stačí vypsat nějaká textová data, k tomu existují pomocné funkce. Existuje pouze seq_operations a skutečné maso je v cpuinfo_op datová struktura, která je závislá na architektuře, obvykle definovaná v arch/<architecture>/kernel/setup.c (nebo někdy jiný soubor). Vezmeme-li jako příklad x86, jsme vedeni k arch/x86/kernel/cpu/proc.c . Tam je hlavní funkcí show_cpuinfo , který vytiskne požadovaný obsah souboru; zbytek infrastruktury je zde k tomu, aby přidával data do procesu čtení rychlostí, kterou je požaduje. Můžete vidět, jak se data sestavují za chodu z dat v různých proměnných v jádře, včetně několika čísel vypočítaných za chodu, jako je frekvence CPU.

Související:Možnost -F pro ls?

Velká část /proc jsou informace o jednotlivých procesech v /proc/<PID> . Tyto položky jsou registrovány v fs/proc/base.c , v tgid_base_stuff pole; některé zde registrované funkce jsou definovány v jiných souborech. Podívejme se na několik příkladů, jak jsou tyto položky generovány:

  • cmdline je generován proc_pid_cmdline ve stejném souboru. Vyhledá data v procesu a vytiskne je.
  • clear_refs , na rozdíl od záznamů, které jsme dosud viděli, je zapisovatelný, ale nečitelný. Proto proc_clear_refs_operations struktury definuje clear_refs_write funkce, ale žádná funkce čtení.
  • cwd je symbolický odkaz (trochu magický), deklarovaný proc_cwd_link , který vyhledá aktuální adresář procesu a vrátí jej jako obsah odkazu.
  • fd je podadresář. Operace na samotném adresáři jsou definovány v proc_fd_operations datová struktura (jsou standardní kromě funkce, která vyjmenovává položky, proc_readfd , který vyjmenovává otevřené soubory procesu), zatímco operace s položkami jsou v `proc_fd_inode_operations.

Další důležitá oblast /proc je /proc/sys , což je přímé rozhraní k sysctl . Čtení ze záznamu v této hierarchii vrací hodnotu odpovídající hodnoty sysctl a zápis nastavuje hodnotu sysctl. Vstupní body pro sysctl jsou v fs/proc/proc_sysctl.c . Sysctls mají svůj vlastní registrační systém s register_sysctl a přátelé.


Linux
  1. Co dělá řádek '!/bin/sh -e'?

  2. /proc/[pid]/pagemaps a /proc/[pid]/maps | linux

  3. Jak získat počet CPU/jádr v Linuxu z příkazového řádku?

  1. Kdy mám použít /dev/shm/ a kdy /tmp/?

  2. Jaký je rozdíl mezi /tmp a /run?

  3. Co je anon_inode ve výstupu ls -l /proc/[PID]/fd?

  1. Jaké je použití příkazu „/usr/bin/[“ [hraná závorka] v Linuxu?

  2. Jak Linux zpracovává více po sobě jdoucích oddělovačů cest (/home////username///soubor)?

  3. Co se přesně stane, když spustím soubor v prostředí Shell?