- 积分
- 1028
贡献127
飞刀2 FD
注册时间2011-9-14
在线时间97 小时
|
发表于 2012-4-16 09:22:02
|
显示全部楼层
本帖最后由 飞凌-develop 于 2012-4-16 09:27 编辑
早上7点,就被窗外一群敲锣打鼓的响声吵醒了,今天可是星期天啊,没法睡了,起来做点有意义的吧。
昨天在OK6410开发板上折腾了一下午,才正常把内核模块的编译和运行搞定,现在整理一下过程,待以后有个参考。
什么事情实际做起来总会比想象的复杂,特别是一开始,本来是很简单的一段代码如下:
#include <linux/module.h>
#include <linux/init.h>
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 <linux/module.h>
#include <linux/init.h>
然后指定交叉编译器,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! |
|