编写ARM上Linux驱动程序出错,请教高手要写些什么结构
我弄了一个最简单的驱动程序编译完了在PC机上可以运行,用交差编译器和ARM C语言库编译后到ARM上运行,提示:Invalid module format(-1):Exec format error,请问我的程序错在哪里,要改些什么结构?(我的开发板是Intel270,OS是BusyBox Linux).谢谢!
#ifndef __KERNEL__
# define __KERNEL__
#endif
#ifndef MODULE
# define MODULE
#endif
#include <linux/config.h>
#include <linux/module.h>
MODULE_LICENSE( "GPL ");
#ifdef CONFIG_SMP
#define __SMP__
#endif
#include <linux/kernel.h> /* printk()在这个文件里 */
static int init_module()
{
printk( "Hello,test World!\n ");
return 0; /* 如果初始工作失败,就返回非0 */
}
static void cleanup_module()
{
printk( "Bye!\n ");
}
------解决方案--------------------按提示是你编译的问题,不是目标机器所认识的格式
------解决方案--------------------提示编译的目标格式不对啊
是不是编译也要相应的arm内核源代码?
------解决方案--------------------很显然,是你的MAKEFILE没对
再者,编译是需要arm-linux内核源码的,因为需要头文件
------解决方案--------------------你开发板上的内核版本(配置)和你交叉编译环境的内核版本(配置)不一致吧。
你需要把用目标板上的系统代码和lib拿来交叉编译才行。
------解决方案--------------------请用静态编译 makefile 里加 -static
------解决方案--------------------这是我在用的一个Makefile
ifeq ($(KERNELRELEASE),)
KERNELDIR ?=/linuxsrc
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
else
obj-m = mymodule
endif
不过在使用以前要设置几个环境PATH,ARCH和CROSS_COMPILE,而且Makefile里面的linux源代码树是用交叉编译环境编译过的,要不然会缺少文件。然后直接make就K.O.了。
Good luck!
------解决方案--------------------请教:我在FC6 下编译,编译在FC6 下的模块,库文件用的是 /usr/src/kernels/2.6.18-1.2798.fc6-i686/include/ ,编译的时候,提示很多库文件里面有很多错误,自己去下了个Linux 2.6.18内核,也是一样很多错误,,
库文件要怎么设置?
------解决方案--------------------去下载<<LINUX设备驱动程序> > 第三版中的例程源代码,稍改一下就OK了,至于下载地点,你去看一看那本书的前言,里面说了源码的下载地址