Chinaunix首页 | 论坛 | 博客
  • 博客访问: 47426
  • 博文数量: 8
  • 博客积分: 401
  • 博客等级: 一等列兵
  • 技术积分: 125
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-15 12:28
文章分类
文章存档

2010年(8)

我的朋友

分类: LINUX

2010-04-14 17:31:18

编译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) |
给主人留下些什么吧!~~