我是内核模块编程的初学者,所以这可能会变得很愚蠢。
我正在遵循本指南。我正在尝试制作一个跨越多个文件的模块。(来自指南)。
各个文件是:
#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:请忽略奇怪的用户名