printk() je pro jádro totéž, co printf() pro uživatelský prostor. Řádky zapsané pomocí printk() lze zobrazit pomocí příkazu dmesg. V závislosti na tom, jak důležitá je zpráva, kterou potřebujete vytisknout, si můžete vybrat mezi osmi zprávami na úrovni protokolu, definovanými v include/linux/kern_levels.h, spolu s jejich významem.
Syntaxe printk je:
printk ("log level" "message", <arguments>);
Následuje seznam úrovní protokolu jádra. Každá z těchto úrovní odpovídá číslu v řetězci, jehož priorita je nepřímo úměrná hodnotě čísla. Například 0 má vyšší prioritu:
#define KERN_EMERG "<0>" /* system is unusable*/ #define KERN_ALERT "<1>" /* action must be taken immediately*/ #define KERN_CRIT "<2>" /* critical conditions*/ #define KERN_ERR "<3>" /* error conditions*/ #define KERN_WARNING "<4>" /* warning conditions*/ #define KERN_NOTICE "<5>" /* normal but significant condition*/ #define KERN_INFO "<6>" /* informational*/ #define KERN_DEBUG "<7>" /* debug-level messages*/
Vidíme, že každá úroveň protokolu odpovídá číslu a čím nižší číslo, tím vyšší je důležitost zprávy. Úrovně jsou užitečné při rozhodování, co by se mělo uživateli na konzoli zobrazovat a co ne.
Každá konzola má úroveň protokolu nazývanou úroveň protokolu konzoly a na konzoli se zobrazí jakákoli zpráva s číslem úrovně protokolu nižším, než je úroveň protokolu konzoly, a zaznamenají se další zprávy, které mají číslo úrovně protokolu vyšší nebo rovné úrovni protokolu konzoly. v protokolu jádra, do kterého lze nahlédnout pomocí příkazu „dmesg“.
Úroveň protokolu konzoly lze nalézt v souboru /proc/sys/kernel/printk.
$ cat /proc/sys/kernel/printk 4 4 1 7
První číslo ve výstupu je úroveň protokolu konzoly, druhé je výchozí úroveň protokolu, třetí je minimální úroveň protokolu a čtvrté je maximální úroveň protokolu.
Úroveň protokolu 4 odpovídá KERN_WARNING. Všechny zprávy s úrovněmi protokolu 3, 2, 1 a 0 se tedy zobrazí na obrazovce a také se zaprotokolují a zprávy s úrovněmi protokolu 4, 5, 6, 7 se pouze zaprotokolují a lze je zobrazit pomocí „dmesg“.
Úroveň protokolu konzoly lze změnit zápisem do položky proc:
$ echo "6" > /proc/sys/kernel/printk $ cat /proc/sys/kernel/printk 6 4 1 7
Nyní je úroveň protokolu konzoly nastavena na 6, což je KERN_INFO. Logování můžeme otestovat pomocí následujícího modulu.
# vi hello.c: #include<linux/kernel.h> #include<linux/module.h> #include<linux/init.h> static int hello_init(void) { printk(KERN_WARNING "Hello, world \n "); return 0; } static void hello_exit(void) { printk(KERN_INFO "Goodbye, world \n"); } module_init(hello_init); module_exit(hello_exit);
Printk volaná ve funkci init používá KERN_WARNING, což je úroveň protokolu a menší než 6, což je úroveň protokolu konzoly, a proto by měl být vidět na obrazovce.
Printk použitý ve funkci exit je KERN_INFO, což je úroveň protokolu 6, stejná jako úroveň protokolu konzoly, a proto by neměl být viditelný na obrazovce.
Poznámka :Činnost kódu můžeme otestovat pouze přihlášením do textového režimu, protože žádná ze zpráv se nezobrazuje na terminálu GUI.Makefile:
ifneq ($(KERNELRELEASE),) obj-m := hello.o else KERNELDIR ?= /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: make -C $(KERNELDIR) M=$(PWD) modules clean: $(MAKE) -C $(KERNELDIR) M=$(PWD) clean endif
Kompilace a vložení:
$ make $ insmod hello.ko [5377.966743] Hello world
Můžeme vidět, jak se na obrazovce tiskne ahoj svět.
$ rmmmod hello $ dmesg| tail -2 [5424.190552] Good bye world
Zpráva Good bye world se zaznamená, ale nevytiskne se na obrazovce, ale lze ji vidět v protokolech. Takže pomocí printk a úrovní logování konzoly můžeme ovládat zprávy jádra viditelné pro uživatele.
Poslední myšlenky
Jádro používá funkci printk, která je syntakticky velmi podobná volání funkce printf ze standardních knihoven C, s přidáním volitelné úrovně protokolu. Povolené formáty jsou zdokumentovány ve zdrojovém kódu jádra pod Documentation/printk-formats.txt.
Dostupné úrovně protokolů v printk jsou uvedeny v následující tabulce:
Typ | Symbol | Popis |
---|---|---|
Nouzový stav | KERN_EMERG | Systém je nestabilní a hrozí jeho selhání |
Upozornění | KERN_ALERT | Je nutná okamžitá akce |
Kritické | KERN_CRIT | Kritické selhání softwaru nebo hardwaru |
Chyba | KERN_ERR | Chybový stav |
Upozornění | KERN_WARNING | Nic vážného, ale může to znamenat problém |
Upozornění | KERN_NOTICE | Nic vážného, ale uživatel by to měl vzít na vědomí |
Informace | KERN_INFO | Informace o systému |
Ladění | KERN_DEBUG | Ladění zpráv |
Pokud není zadána žádná úroveň protokolu, použije se výchozí zpráva protokolu nakonfigurovaná v konfiguraci jádra. Ve výchozím nastavení je to KERN_WARNING.