сообщение printk не отображается до следующего события

Reference Image

Я - новичок к модулю ядра, программируя, таким образом, это могло бы оказаться чем-то немым.

Я следую этому руководству. Я пытаюсь сделать модуль, который охватывает несколько файлов. (от руководства).

Отдельные файлы:

#include <linux/kernel.h>
#include <linux/module.h>

int init_module(void)
{
    printk(KERN_INFO "Hello, world - this is the kernel speaking");
    return 0;
}

и,

#include <linux/kernel.h>
#include <linux/module.h>

void cleanup_module()
{
    printk(KERN_INFO "Short is the life of a kernel module");
}

Вот мой make-файл.

obj-m += hello-1.o
obj-m += startstop.o
startstop-objs := start.o stop.o 

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

(hello-1 от предыдущего осуществления),

Модуль компилирует успешно. Изображение в вершине показывает полный вывод make. После компиляции я вставляю модуль [Jan21 07:25] и затем удалите его [ +10.624728]. Затем я подключаю мышь USB только для подтверждения точки зрения. Я работаю $ dmesg -wH на правой стороне окно терминала.

Вывод как ожидалось, но в разное время.

  1. hello world ... вывод отображен, когда я удаляю модуль at +10.624....
  2. Short is the life ... вывод отображен, когда я вставляю мышь USB.
  3. new device сообщение однако отображено точно в срок.

Мое исходное предположение было то, что существует, вероятно, некоторый механизм буферизации в действии здесь, таким образом, я пытался повысить приоритет на printk() полностью к KERN_ALERT но бесцельно. Также, почему сообщение сбрасывает от буфера, когда мышь подключается? И почему мышь производится не буферизованная? Я действительно мог продвинуться вперед с этим очень, но я хотел бы знать то, что происходит под капотом.

PS: проигнорируйте странные имена пользователей

0
задан 21 January 2019 в 05:16

1 ответ

Кольцевой буфер ядра является буферизованной строкой, что означает, что это не сбрасывается, пока это не встречается с новой строкой. Добавьте \n в конец Вашего printk строки:

printk(KERN_INFO "Hello, world - this is the kernel speaking\n");

Вы также могли бы рассмотреть использование printk форматирование макросов, поскольку я полагаю, что они предпочтены по определению KERN_INFO непосредственно:

pr_info("Hello, world - this is the kernel speaking\n");

, Если бы Вы хотите поместить два отдельных сообщения ядра на ту же строку, Вы использовали бы:

pr_info("Hello, world - ");
pr_cont("this is the kernel speaking\n");

, который имеет тот же эффект как исходная строка.

0
ответ дан 22 September 2019 в 02:51

Другие вопросы по тегам:

Похожие вопросы: