dmesg не показывает оператор printk

Я пытаюсь создать запись Proc. Моя функция init_module, как показано ниже

int init_module()
{
printk(KERN_INFO "proc2:Module Loaded\n");
proc_entry=proc_create_data(proc_name,0644,NULL,&fops,NULL);
if(proc_entry==NULL)
{
    printk(KERN_INFO "proc2:Error registering proc entry");
}
else
{
    printk(KERN_INFO "proc2:Proc Entry Created");
}
return 0;
}

Следующий метод очистки

void cleanup_module()
{
printk(KERN_INFO "proc2:module unloaded");
remove_proc_entry(proc_name,proc_entry);
}

Остальная часть программы включает определение переменных и функции обратного вызова.

Когда я компилирую эту программу, она компилируется хорошо. когда я использую insmod он не отвечает мне на приглашение.lsmod перечисляет мой модуль и показывает, используемые одним (не знаю, что).dmesg не показывает ни одно из указанных выше сообщений printk.

Вы можете сказать мне, что здесь не так?

3 ответа

Решение

Пытаться echo "7" > /proc/sys/kernel/printk включить все уровни журнала консоли.

Номера соответствуют ниже:

#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*/

Номер по умолчанию - 4, что позволяет консоли показывать сообщения только по крайней мере в KERN_WARNING, Вот почему вы не можете войти в систему KERN_INFO уровень.

Даже после использования echo "7" > /proc/sys/kernel/printk, printk не работал для меня.

https://lwn.net/Articles/487437/ говорит об модифицированной или более расширенной версии printk называется pr_** API (pr_info,pr_emerg).

я использовал pr_info вместо printk и это решило мою проблему.

В дополнении к Ответу Уэйн , то исходный код ядра говорит

Этот макрос расширяется до dynamic_pr_debug(), если установлен CONFIG_DYNAMIC_DEBUG. В противном случае, если определена DEBUG, она эквивалентна printk с уровнем логирования KERN_DEBUG. Если DEBUG не определен, он ничего не делает.

Это означает, что вам нужно будет определить DEBUGили используйте динамическую отладку . Мне удалось успешно загрузить модуль с помощью debug printk через

      $ sudo insmod module-name.ko dyndbg
Другие вопросы по тегам