早上7點,就被窗外一群敲鑼打鼓的響聲吵醒了,今天可是星期天啊,沒法睡了,起來做點有意義的吧。
昨天在OK6410開發板上折騰了一下午,才正常把內核模塊的編譯和運行搞定,現在整理一下過程,待以后有個參考。
什么事情實際做起來總會比想象的復雜,特別是一開始,本來是很簡單的一段代碼如下:
#include
#include
MODULE_LICENSE("GPL");
MODULE_AUTHOR("David Xie");
MODULE_DESCRIPTION("Hello World Module");
MODULE_ALIAS("a simplest module");
static int __init hello_init()
{
printk(KERN_EMERG"Hello World!\n");
return 0;
}
static void __exit hello_exit()
{
printk(KERN_EMERG "Goodbye Cruel World!\n");
}
module_init(hello_init);
module_exit(hello_exit);
第一步當然是編譯了,遇到第一個問題:要在6410上運行該內核模塊,如何設置交叉編譯器?首先想到的是makefile,打開makefile文件,如下:
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
else
KDIR := /forlinux/kernel/linux-2.6.28
all:
make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif
首先需要指定kernel的源代碼路徑:
KDIR := /forlinux/kernel/linux-2.6.28
這個路徑由自己決定,移植的arm平臺下的linux源代碼放在什么地方就填什么路徑,如果指定錯誤的話,會提示找不到
#include
#include
這兩個文件的。
然后指定交叉編譯器,CROSS_COMPILE=/usr/loacl/arm/4.2.2-eabi/usr/bin/arm-linux-
同樣這個路徑也是自己決定,放在哪個目錄就填哪個目錄。
makefile主要修改這兩個地方就OK了,保存關閉。
在控制臺命令下,進入hello.c目錄,先make clean一下,再make,可以看到hello.ko內核模塊生成了,將它拷貝到ok6410板上:
insmod hello.ko
可以看到hello world打印信息,但是在rmmod的時候,確無法卸載,google了一把,需要在linux源碼目錄下,執行make prepare一下,修復bounds.h文件。
再rmmod hello
Goodbye Cruel World!
卸載成功。
原文出自:一路上you你 大神的搜狐博客
文章轉引自:飛凌嵌入式Linux討論區 www.witech.com.cn |