Linux 模块的编译步骤
1. 源码准备
#include <linux/init.h>
#include<linux/module.h>
MODULE_LICENSE("GPL");
static int hello_init(void)
{
printk(KERN_ALERT"Hello,world!\n");
return 0;
}
static int hello_exit(void)
{
printk(KERN_ALERT"good bye,cruelworld!\n");
}
module_init(hello_init);
module_exit(hello_exit);
2. 编写Makefile文件
obj-m := modules.o
modules-objs := mymod.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
make -C $(KDIR) M=$(PWD) modules
#clean:
#rm -rf *.o *.cmd *.ko *.mod.c*.tmp_versions
注意:default下面一行要以tab键开头。
3. 编译模块
在mymod.c所在文件夹中,执行make,出现错误:
make-C /lib/modules/2.6.32-220.el6.x86_64/build M=/zk modules
make: *** /lib/modules/2.6.32-220.el6.x86_64/build: 没有那个文件或目录。 停止。make: *** [default] 错误 2
原因分析:其实该目录下的build文件是存在的,不过build文件是一个链接文件,它指向的内容不存在。也就是/usr/src/kernels目录为空,所以出现了这个错误。KDIR目录是模块编译环境的目录。这种情况的出现时由于缺少内核开发包kernel-devel导致的。
解决方法:直接利用本地镜像文件来安装。
首先挂载镜像文件:mount /dev/cdrom /mnt/cds,然后进入Packages目录下;
然后搜索是否安装kernel-devel:rpm –q kernel-devel*,出现提示:
package kernel-debug-2.6.32-220.el6.x86_64.rpm is not installed
package kernel-debug-devel-2.6.32-220.el6.x86_64.rpm is notinstalled
package kernel-devel-2.6.32-220.el6.x86_64.rpm is notinstalled
package kernel-doc-2.6.32-220.el6.noarch.rpm is not installed
这时候,利用命令rpm -ivh kernel-devel-2.6.32-220.el6.x86_64.rpm安装即可。
当这个错误解决后,再次运行make:
make -C /lib/modules/2.6.32-220.el6.x86_64/build M=/zk modules
make[1]: Entering directory`/usr/src/kernels/2.6.32-220.el6.x86_64'
CC [M] /zk/mymod.o
/zk/mymod.c: 在函数‘__exittest’中:
/zk/mymod.c:16: 警告:返回了不兼容的指针类型
LD [M] /zk/modules.o
Building modules, stage2.
MODPOST 1 modules
CC /zk/modules.mod.o
LD [M] /zk/modules.ko.unsigned
NO SIGN [M]/zk/modules.ko
make[1]: Leaving directory`/usr/src/kernels/2.6.32-220.el6.x86_64'
这时候,在mymod.c所在的目录生成了如下几个文件:
modules.mod.o mymod.c modules.ko modules.o mymod.o
modules.ko.unsigned modules.order modules.mod.c Module.symvers
4. 加载和卸载我们的模块
终端输入:
[root@localhost zk]# insmod modules.ko
然后查看是否成功挂载:[root@localhost zk]# dmesg | tail -1
输出结果如下:
Hello,world!
然后再卸载一下模块: [root@localhost zk]# rmmodmodules.ko
然后查看是否成功卸载: [root@localhost zk]# dmesg |tail -2
输出如下: Hello,world!
good bye,cruel world!