初始化和清理在内核模块中交换

Initialization and Cleanup are swapped around in Kernel Module

目前正在研究内核模块,我们的任务是编写一个小的 Hello World / Bye World 内核模块(C 语言)。很快就想到了,大致知道我应该做什么。

需要使初始化函数打印一条 Hello 消息,并使清理函数打印一条 Bye 消息。当我使用 insmod 将内核模块添加到模块列表(在 Debian VM 上工作)时应该打印初始化消息,以及清理消息当我使用 rmmod.

删除模块时应该打印

这是代码片段:

#define MODULE
#define LINUX
#define __KERNEL__

#include <linux/module.h>   // all modules
#include <linux/kernel.h>   // KERN_ALERT and potentially other priorities
#include <linux/init.h>     // macros

static int __init do_initialization(void) {
    printk(KERN_ALERT "Hello World :)");
    return 0;
}

static void __exit do_cleanup(void){
    printk(KERN_ALERT "Bye bye :)");
}

module_init(do_initialization);
module_exit(do_cleanup);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("A");
MODULE_DESCRIPTION("Exercise");
MODULE_VERSION("1.00");

这是我使用的 Makefile(这是提供给我们的,但我了解其中的大部分内容):

obj-m += mymodule.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

注意:我使用 KERN_ALERT 而不是 KERN_INFO 只是为了确保它无论如何都能显示在我的终端上。

我的问题在于: 当我 运行 insmod mymodule.ko 时,打印 Bye Bye 消息。当我运行 rmmod mymodule.ko时,Hello消息被打印出来了。这对我来说真的没有任何意义,我确保我的功能在宏中正确设置。

感谢任何帮助。

正如 Tsyvarev 在 2021 年 3 月 1 日作为评论添加到问题中的 link 以及 Roi 在 2021 年 3 月 2 日的回答所指出的,我只需要添加 \ n 在登录内核时。感谢所有帮助过的人。