编译hello world module for arm 出问题了
按照ldd3上的步骤和方法,编写了下面的hello.c模块:
#include
#include
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "hello, I am a module test\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Good by module\n");
}
module_init(hello_init);
module_exit(hello_exit); |
还有一个Makefile文件:
obj-m:=hello.o
KERN_DIR?=/lib/modules/$(shell uname -r)/build
PWD:=$(shell pwd)
default:
$(MAKE) -C $(KERN_DIR) M=$(PWD) modules
clean:
rm -rf *.o *.ko *.mod.* Module.* |
然后直接make,可以生成需要的hello.ko,加载成功!
注:
内核是: 2.6.18-128.el5
编译器: arm-linux-gcc gcc version 4.3.2
需要编译成for arm的模块的时候,这样编译:
$make ARCH=arm CROSS_COMPILE=arm-linux-
出现问题了.
编译时候出现
warning: 'regparm' attribute directive ignored
错误!
正在查找解决方法!
2个礼拜的查找,终于可以在开发板上加载模块了.
解决方法:
PC系统里的符号表和在ARM上运行的是不一样的,导致许多头文件之类的找不到,所以出现那么多的问题。(其实这是我猜想的)
然后从kernel.org下载了最新的2.6.33.2的内核,按照网上学习的方法,从 arch/arm/configs/下拷贝mini2440_defconfig 文件到内核跟目录下为.config文件,然后运行:
$make menuconfig ARCH=arm
配置一下,保存,然后编译:
$make uImage ARCH=arm CROSS_COMPILE=arm-linux-
编译成功会出现 Image arch/arm/boot/uImage is ready
修改Makefile文件,
KERN_DIR?=/lib/modules/$(shell uname -r)/build
改成:
KERN_DIR?=/z/linux-2.6.33.2
然后编译:
$make ARCH=arm CROSS_COMPILE=arm-linux-
成功!
通过tftp拷贝到开发板上,运行,又出问题了.
提示内核版本不对,晕了.
重新从开发板带的那个光盘上拷贝linux-2.6.33.2-mini2440的内核到pc上按照上面的方法编译一个内核,修改Makefile文件,重新编译,下载到开发板上,运行:
$insmod hello.ko
可以正常加载了.
阅读(1661) | 评论(0) | 转发(0) |