#include int test(void)
{
printk("test here.\n");
return 0;
}
//extern_app.h
#ifndef __EXTERN_APP_H
#define __EXTERN_APP_H
extern int test(void);
#endif
//Makefile
#ifneq ($(KERNELRELEASE),)
obj-m := my_module.o
my_module-objs := test_module.o extern_app.o
#else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
rm -rf Module.* modules.*
.PHONY: default clean
#endif
make,如果执行成功则生成my_module.ko
//执行insmod 后并调用dmesg,正常情况如下显示:
[root@localhost module_kernel]# insmod my_module.ko who=Coding many=5
[root@localhost module_kernel]# dmesg
test here.
Hello, Coding!
Hello, Coding!
Hello, Coding!
Hello, Coding!
Hello, Coding!
[root@localhost module_kernel]#
//rmmod从内核移除模块
[root@localhost module_kernel]# insmod my_module.ko
insmod: error inserting 'my_module.ko': -1 File exists
[root@localhost module_kernel]# rmmod my_module
二、出错原因解决方法
在插入模块时常遇到的错误:
[root@panlimin module_study]# insmod my_module.ko
insmod: error inserting 'my_module.ko': -1 Invalid module format
dmesg查看内核报错消息:
[root@panlimin module_study]# dmesg
my_module: no symbol version for module_layout
[root@panlimin module_study]#
一般出这个错在make时会有类似这样的警告:
WARNING: Symbol version dump /root/study/kernel/linux-2.6.34/Module.symvers
is missing; modules will have no dependencies and modversions.
这是应该Linux内核版本依赖出现了问题,这种情况一般出现在自行编译内核后没有链接到正确的内核源码目录树情况,或者
内核目录树顶层的Module.symvers文件丢失。因为模块代码必须针对要链接的内核版本重新编译。
如果没有此警告,但在insmod时还是报此错误,就需要查看Module.symvers文件是否正确,比如这个文件可能是0字节,
Module.symvers在编译内核时会生成,如果发行版本在/lib/module/目录下对应的内核目录树中会有,此时只要确保该文件正确
再重新make,insmod应该就没问题了。
除了insmod可以将模块插入内核外,modprobe也可以,它们的区别在于后者会考虑要插入的模块是否引用了一些当前内核不存在的符号,
如果有这类引用,modprobe会在查找相应模块并尝试插入到内核。所以有时使用insmod插入无效时还可以使用modprobe.
如果由于模块依赖导致符号表出现问题,比如,~/.viminfo被破坏,甚至无法加载网络接口等,可以在/lib/module/对应的内核目录下
执行depmod -a重新生成正确的符号表,执行过程需要点时间。