在完成了驱动程序代码的编写之后,接下来的任务就是编译。linux内核编译的过程是通过内核源码的根目录和各子目录中的Makefile分级管理的。其中根目录的Makefile是最重要的,它可以看成是其他Makefile最初的入口。它负责定义所有与体系结构无关的变量和目标,读取.config文件,并根据其信息最终生成vmlinux(elf格式的Linux内核)和modules(模块)。make通过向下递归调用子目录下的Makefile来编译这两个目标。
通常希望把驱动程序放在内核里,在配置内核时可以自由裁剪。这需要对内核配置脚本Kbuild有一定得了解。具体可以参考内核源码中的Documentation/kbuild目录下的相关文档
Kbuild是一组很容易使用的脚本。通常只需要关心个目录下的两个文件:Kconfig(2.6内核)和Makefile。
以hello模块为例
step1:代码编写
mini2440_hello_module.c 放置的位置/opt/FriendlyARM/mini2440/linux2.6.29/drivers/char
代码如下
/**********************************************************************************************/
/*文件:mini2440_hello_module.c */
/*简介:HelloWorld */
/***********************************************************************************************/
#include<linux/init.h>
#include<linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_module_init(void)
{
printk(KERN_ALERT"Hello,world/n");
return 0;
}
static void hello_module_exit(void)
{
printk(KERN_ALERT"Goodbye, world/n");
}
module_init(hello_module_init);
module_exit(hello_module_exit);
step2: 在char 目录下打开Kconfig(可以理解为是内核的配置脚本)
添加
config MINI2440_HELLO_MODULE
tristate "Mini2440/QQ2440 module sample"
depends on ARCH_S3C2440
default m if MACH_FRIENDLY_ARM_MINI2440
help
mini2440/QQ2440 module_sample
step 3:然后进入linux 2.6.29 目录下
$make menuconfig
在出现的页面下选择device Drivers---> 回车
Character devices 回车
选中 Mini2440/QQ2440 module1 sample
按空格键进行切换到M
则配置完成
step 4 : drivers/char目录下
打开Makefile文件
添加内容如下
obj-$(CONFIG_MINI2440_HELLO1_MODULE) += mini2440_hello1_module.o
step 5: 在linux 2.6.29目录下
输入命令 $make modules
则对内核中所有配置为模块的驱动程序进行编译了