我正在创建一个非常简单的hello world内核模块并获得一些疯狂的行为。这一直有效,直到我升级到内核3.3.8,现在它......好吧,它在退出时调用init
函数,在初始化时调用exit
函数。我已经确定我的名字是正确的
// Needed for module definitions
#include <linux/module.h>
// Needed for initilization modules
#include <linux/init.h>
// Must declare some license
MODULE_LICENSE("Dual BSD/GPL");
// Function to be called on insmod
// Returns 0 on success
static int __init mymod_init(void)
{
// Prints kernel alert. Check /var/log/syslog
printk(KERN_ALERT "Module was loaded, this is the printk.");
return 0;
}
// Function to be called on rmmod
static void __exit mymod_exit(void)
{
// Prints kernel alert. Check /var/log/syslog
printk(KERN_ALERT "Module was unloaded, this is the printk");
}
// Register these functions
module_init(mymod_init);
module_exit(mymod_exit);
示例输出:
root @ cop4610:/home/cop4610/Downloads/linux-3.3.8/mymodule#insmod mymodule.ko root @ cop4610:/home/cop4610/Downloads/linux-3.3.8/mymodule# tail / var / log / syslog 10月12日10:08:20 cop4610内核:[633.567832] 模块已卸载,这是printk
以下是现场直播的视频: http://www.youtube.com/watch?v=8aJNSpCd7as&feature=youtu.be
答案 0 :(得分:16)
需要换行!!!!!! Arrggg !!!
printk(KERN_ALERT "Module was unloaded, this is the printk\n");
和
printk(KERN_ALERT "Module was loaded, this is the printk\n");
似乎并没有真正按顺序执行它们,它只是出现了,因为第一个没有出现,直到第二个发布,因为缓冲区没有刷新。
答案 1 :(得分:1)
这是我的基本例子:
#include <linux/module.h>
#include <linux/kernel.h>
#define MODULE_NAME "hello_md"
MODULE_LICENSE("GPL");
MODULE_AUTHOR("B3h3m0th");
MODULE_DESCRIPTION("Basic LKM; hello world module");
MODULE_VERSION("0.0");
static int __init insert_mod(void)
{
printk(KERN_ALERT "[%s] Init: \"Hello World\"\n", MODULE_NAME);
return 0;
}
static void __exit remove_mod(void)
{
printk(KERN_ALERT "[%s] Exit\n", MODULE_NAME);
}
module_init(insert_mod);
module_exit(remove_mod);
我的基本Makefile:
obj-m += basic_module.o
KERNELVERSION = $(shell uname -r)
all:
$(MAKE) -C /lib/modules/$(KERNELVERSION)/build M=$(PWD) modules
clean:
$(MAKE) -C /lib/modules/$(KERNELVERSION)/build M=$(PWD) clean