Я - новичок к модулю ядра, программируя, таким образом, это могло бы оказаться чем-то немым.
Я следую этому руководству. Я пытаюсь сделать модуль, который охватывает несколько файлов. (от руководства).
Отдельные файлы:
#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
на правой стороне окно терминала.
Вывод как ожидалось, но в разное время.
hello world ...
вывод отображен, когда я удаляю модуль at +10.624...
.Short is the life ...
вывод отображен, когда я вставляю мышь USB.new device
сообщение однако отображено точно в срок.Мое исходное предположение было то, что существует, вероятно, некоторый механизм буферизации в действии здесь, таким образом, я пытался повысить приоритет на printk()
полностью к KERN_ALERT
но бесцельно. Также, почему сообщение сбрасывает от буфера, когда мышь подключается? И почему мышь производится не буферизованная? Я действительно мог продвинуться вперед с этим очень, но я хотел бы знать то, что происходит под капотом.
PS: проигнорируйте странные имена пользователей
Кольцевой буфер ядра является буферизованной строкой, что означает, что это не сбрасывается, пока это не встречается с новой строкой. Добавьте \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");
, который имеет тот же эффект как исходная строка.