hello world!模块
hello.c
#include
#include // 这两个头文件包含相应宏定义
MODULE_LICENSE("GPL"); // 告知内核,这是free模块
static int __init hello_init(void) // 模块进入函数
{
printk(KERN_ALERT "Hello World\n");
return 0;
}
static void __exit hello_exit(void) // 模块退出函数
{
printk(KERN_ALERT "Hello World exit\n");
}
module_init(hello_init); // 初始化
module_exit(hello_exit); // 退出
MODULE_AUTHOR("Di Zhuang"); // 作者声明
MODULE_DESCRIPTION("A simple Hello World Module");
MODULE_ALIAS("a simplest module");
hello.c
#include
#include
MODULE_LICENSE("GPL"); // 告知内核,这是free模块
static int __init hello_init(void) // 模块进入函数
{
printk(KERN_ALERT "Hello World\n");
return 0;
}
static void __exit hello_exit(void) // 模块退出函数
{
printk(KERN_ALERT "Hello World exit\n");
}
module_init(hello_init); // 初始化
module_exit(hello_exit); // 退出
MODULE_AUTHOR("Di Zhuang"); // 作者声明
MODULE_DESCRIPTION("A simple Hello World Module");
MODULE_ALIAS("a simplest module");
Makefile:
ifneq ($(KERNELRELEASE),)
obj-m :=hello.o
obj-m :=hello.o
else
KDIR := /lib/modules/2.6.18-194.8.1.el5/build
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif
make -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif
加载 insmod insmod hello.ko
卸载 rmmod rmmod hello
查看 lsmod
加载 modprobe modprobe hello 看加载的文件是否依赖其他文件,如果是,则会先找到这些模块,把他们先加载到内核
MODULE_LICENSE("GPL") 许可证申明
MODULE_AUTHOR(“Simon Li"); 作者
MODULE_DESCRIPTION("Hello World Module"); 模块描述
MODULE_VERSION("V1.0"); 模块版本
MODULE_ALIAS("a simple module"); 模块别名
module_param(name,type,perm) 模块参数
EXPORT_SYMBOL(符号名)
EXPORT_SYMBOL_GPL(符号名)
EXPORT_SYMBOL_GPL(符号名)
常见问题:
内核模块版本 与正在运行的内核版本必须一致