|
早上7點(diǎn),就被窗外一群敲鑼打鼓的響聲吵醒了,今天可是星期天啊,沒(méi)法睡了,起來(lái)做點(diǎn)有意義的吧。
昨天在OK6410開(kāi)發(fā)板上折騰了一下午,才正常把內(nèi)核模塊的編譯和運(yùn)行搞定,現(xiàn)在整理一下過(guò)程,待以后有個(gè)參考。
什么事情實(shí)際做起來(lái)總會(huì)比想象的復(fù)雜,特別是一開(kāi)始,本來(lái)是很簡(jiǎn)單的一段代碼如下:
#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);
第一步當(dāng)然是編譯了,遇到第一個(gè)問(wèn)題:要在6410上運(yùn)行該內(nèi)核模塊,如何設(shè)置交叉編譯器?首先想到的是makefile,打開(kāi)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
這個(gè)路徑由自己決定,移植的arm平臺(tái)下的linux源代碼放在什么地方就填什么路徑,如果指定錯(cuò)誤的話,會(huì)提示找不到
#include
#include
這兩個(gè)文件的。
然后指定交叉編譯器,CROSS_COMPILE=/usr/loacl/arm/4.2.2-eabi/usr/bin/arm-linux-
同樣這個(gè)路徑也是自己決定,放在哪個(gè)目錄就填哪個(gè)目錄。
makefile主要修改這兩個(gè)地方就OK了,保存關(guān)閉。
在控制臺(tái)命令下,進(jìn)入hello.c目錄,先make clean一下,再make,可以看到hello.ko內(nèi)核模塊生成了,將它拷貝到ok6410板上:
insmod hello.ko
可以看到hello world打印信息,但是在rmmod的時(shí)候,確無(wú)法卸載,google了一把,需要在linux源碼目錄下,執(zhí)行make prepare一下,修復(fù)bounds.h文件。
再rmmod hello
Goodbye Cruel World!
卸載成功。
原文出自:一路上you你 大神的搜狐博客
文章轉(zhuǎn)引自:飛凌嵌入式Linux討論區(qū) www.witech.com.cn |
|