首页 > 技术文章 > firefly rk3288 内核模块编译

z3j6w9 2017-07-13 14:31 原文

  在驱动开发的过程中,常常需要对代码进行返回的调试,如果返回的编译再烧写内核,势必会浪费开发人员大量的时间和心力,加班加点那是时常的事。为此linux提供了编译内核模块的方式,无需返回烧写内核,只需insmod内核模块即可,大大提高了开发效率。

  内核模块的开发核心还是makefile,如下是使用的firefly rk3288的sdk进行模块开发的makefile和测试程序

1 PWD=$(shell pwd)
2 KDIR:=/root/exe/firefly/firefly-rk3288-kernel
3 obj-m:= hello.o
4 
5 all:
6         make ARCH=arm CROSS_COMPILE=/root/exe/firefly/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi- -C $(KDIR) M=$(PWD) modules
 1 #include <linux/init.h>
 2 #include <linux/module.h>
 3 #include <linux/kernel.h>
 4 
 5 static int __init hello_init(void)
 6 {
 7         printk(KERN_ALERT "hello driver init \n");
 8         return 0;
 9 }
10 
11 static void __exit hello_exit(void)
12 {
13         printk(KERN_ALERT "hello driver exit \n");
14 }
15 
16 module_init(hello_init);
17 module_exit(hello_exit);
View Code

  KDIR指的是内核代码的路径,makefile中还设置了ARCH和CROSS_COMPILE变量,这是编译该sdk的时候需要使用到的变量参数,我们可以简单的看下kernel路径下面的makefile就知道为啥了

line204和205,可以看到有两个变量都使用到了ARCH这个变量,搜索一下SRCARCH这个变量,找到了如下这个地方,其实就是根据ARCH变量来决定使用哪个makefile,由于我使用的是arm板子,当然得用arm下面的makefile啦 

而cross_compile其实就是指定了编译用的编译链而已,如下所示就可以看出来

 

现在大概知道了makefile是怎么回事情了,这个时候执行make就会在当前目录下生成hello.ko文件,将hello.ko文件拷贝到开发板中,使用命令insmod hello,ko,然后使用命令dmesg,就能看到熟悉的hello打印信息了。

 

推荐阅读