在驅動開發的過程中,常常需要對代碼進行返回的調試,如果返回的編譯再燒寫內核,勢必會浪費開發人員大量的時間和心力,加班加點那是時常的事。為此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);
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打印信息了。