Les préfixes que l'OP voit sont des préfixes KERN_<LEVEL>. Il s'agit de chaînes littérales spéciales à ajouter avant la chaîne principale printk
en utilisant la concaténation de chaînes de caractères adjacentes du langage C. Par exemple :
printk(KERN_ERR "Something has gone wrong!\n");
À partir de la version 3.6 du noyau, ces macros de préfixe KERN_<LEVEL> sont définies dans "include/linux/kern_levels.h" et commencent par le caractère ASCII SOH "\001"
suivi du niveau de journalisation sous forme de chiffre ASCII pour les niveaux numériques, ou d'un autre caractère ASCII pour les significations spéciales. La chaîne de caractères pour KERN_DEFAULT
est passé de "\001" "d"
a ""
(chaîne vide) dans la version 5.1 du noyau. La chaîne pour KERN_CONT
est passé de ""
(chaîne vide) à "\001" "c"
dans la version 4.9 du noyau.
De la version 2.6.37 à 3.5.x du noyau, les macros de préfixe KERN_<LEVEL> étaient définies dans "include/linux/printk.h" et utilisaient un format différent avec le niveau spécifié entre crochets, par exemple KERN_WARNING
a été défini comme suit "<4>"
, KERN_DEFAULT
a été défini comme suit "<d>"
y KERN_CONT
a été défini comme suit "<c>"
.
Outre printk
Il existe d'autres macros pour générer des journaux du noyau, dont certaines spécifient implicitement la partie KERN_<LEVEL>. L'exemple du PO provient de "lib/nlattr.c" :
pr_warn_ratelimited("netlink: %d bytes leftover after parsing attributes in process `%s'.\n",
rem, current->comm);
Ici, le pr_warn_ratelimited
est définie dans "include/linux/printk.h" comme :
#define pr_warn_ratelimited(fmt, ...) \
printk_ratelimited(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__)
Il y a beaucoup de choses qui se passent ici, mais pr_fmt(fmt)
est une ou plusieurs chaînes littérales comprenant fmt
de sorte que la chaîne transmise à printk_ratelimited
est construit à partir de chaînes littérales concaténées, en commençant par celles de l'expansion de KERN_WARNING
.