写这个笔记主要是加深自己的印象,对于Makefile刚了解一点,现在突然冒出一个Makefile扩展,要理清楚一步步来正解了。
准备我使用了Linux-3.7内核,并在使用x86的默认配置进行了编译,也编译了内核模块,并且制作的initrd,已经安装到现在用的RHEL6.3中了。这些都是前提。这个编译好的内核代码在/opt/kangear/kernel文件夹下。
然后见到了一个Hello Word!级别的内核模块程序。代码如下:
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
这个笔记的重点如何一步步过度到LDD3上那个Makefile。对于已经在Linux内核代码中的模块,如果要编译成模块方式的话,很简单,在make menuconfig中将其选为 M ,在make modules时就自动将它编译为模块。
为了和上边说的变化不大,但是是又不改变现在内核中的东西。我的第一个版本的Makefile这样写的:
obj-m := hello.o
这样不理解的点就少了,主要弄清楚这个obj-m是什么意思了,这里边的m就相当于上边的那个 M,就代表Module的意思,还有obj-y呢。这个先深入到这。
然后将这个两个文件放到kangear_modul目录下,将这个kangear_modul放到内核源代码目录下。
编译时在/opt/kangear/kernel/linux-3.7下。用以下命令(也可以后边加上“Vi = 1”看详细过程):
make M=./kangear_module/ modules
然后就可以这就顺利编译了,我的过程如下:
V1.0可以这样看Makefile之间的关系: