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
/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.
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ánproc_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ý. Protoproc_clear_refs_operations
struktury definujeclear_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 vproc_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é.