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:
proc(5)manuálová stránka;- Program
/procsouborový 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.
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:
cmdlineje generovánproc_pid_cmdlineve 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ý. Protoproc_clear_refs_operationsstruktury definujeclear_refs_writefunkce, ale žádná funkce čtení.cwdje symbolický odkaz (trochu magický), deklarovanýproc_cwd_link, který vyhledá aktuální adresář procesu a vrátí jej jako obsah odkazu.fdje podadresář. Operace na samotném adresáři jsou definovány vproc_fd_operationsdatová 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é.