我是内核模块编程的初学者,所以这可能会变得很愚蠢。
我正在遵循本指南。我正在尝试制作一个跨越多个文件的模块。(来自指南)。
各个文件是:
#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");
}
这是我的生成文件。
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:请忽略奇怪的用户名
内核环形缓冲区是行缓冲的,这意味着它在遇到换行符之前不会被刷新。将 a 添加到字符串
\n
的末尾:printk
您也可以考虑使用 printk 格式化宏,因为我相信这些比
KERN_INFO
直接指定更受欢迎:如果您想将两个单独的内核消息放在同一行,您可以使用:
这与原始行具有相同的效果。