免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4523 | 回复: 6
打印 上一主题 下一主题

请问一下各位:如何将宿主机上的驱动程序框架编译成目标机上能加载的模块?谢谢!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-19 11:39 |只看该作者 |倒序浏览
5可用积分
我这个实验的想法是:将一个在宿主机上编译好后的最简单的驱动程序模块(即*.o文件)通过tftp下载到目标系统中,然后在目标系统中用insmod加载。

现在我的宿主机上的操作系统是linux9.0,内核是2.4.20-8,目标机上是也是linux,我在里面用uname -a看了一下它的内核,是2.4.18的。

我现在已经在宿主机上写好了一个驱动框架demomodule.c(即只有init_module()和clernup_module()这两个函数),而且在宿主机上用gcc -DMODULE _KERNEL_ -DLINUX -I/usr... -c demomodule.c编译成了demomodule.o,并且用insmod demomodule.o和rmmod demomodule能成功的在宿主机上进行加载和卸载,然后我将编译好后的*.o文件通过tftp放到了目标机的文件系统里面去,然后再用insmod加载时,这时它就提示说格式不对。

后来我才想起应该用arm-linux-gcc编译成目标机能匹配的*.o文件,然后我又在宿主机上用arm-linux-gcc重新编译demomodule.c,但是这个时候就出了很多错,主要是说很多头文件找不到,现在这种情况下我应该怎么在宿主机上编译,才能生成目标机上能加载的*.o文件(模块)呢?

谢谢大家了!!

论坛徽章:
0
2 [报告]
发表于 2007-11-19 12:44 |只看该作者
EXEC = demomodule
OBJS = demomodule.o
SRC = demomodule.c

INCLUDE = /***/***/2.4.18-rmk7/include

#以上是你内核代码所在的库文件的路径,你写的那个参数是pc的2.4.20下的,不是你目标机下要用的版本的库。

CC = arm-linux-gcc
LD = arm-linux-ld
MODEFLAGS = -DMODULE -D__KERNEL__ -I$(INCLUDE) -g -Wall -Wstrict-prototypes \
-Wno-trigraphs -Os -mapcs -fno-strict-aliasing -fno-common -fno-common \
-pipe -mapcs-32 -march=armv4 -mtune=arm9tdmi -mshort-load-bytes -msoft-float \

LDFLAGS =

all(OBJS)

$(EXEC)(OBJS)
        $(LD) $(LDFLAGS) -o $ @ $(OBJS)
       
%.o:%.c
        $(CC) $(MODEFLAGS) -c  $(SRC)

clean:
        -rm -f $(EXEC) *.elf *.o *.gdb


#保存这个为makefile 然后再你这个模块的目录下make,之前请确定交叉编译已经安装过了。
# 是: $ 中间没有空格 我一打这个就成了 呵呵

[ 本帖最后由 jojolin 于 2007-11-19 12:48 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-11-19 21:49 |只看该作者
谢谢楼上的 jojolin  !!

实在抱歉,由于我才学Linux不久,只会点简单的操作,所以你上面写的有些没看懂,特别是那一长串编译参数。根据你的指点,我不知道我这样理解对没有:应该在宿主机中用目标板上的内核版本对*.c 进行交叉编译,然后将编译好后的*.o文件通过tftp下载到目标机中,最后在目标机用insmod *.o加载模块。


(问题1)
因此,当时我就先打开mimicom,进入到目标机中的系统中,看看能否找到你说的/***/***/2.4.18-rmk7/include目录,但是我只在目标机中找到了这一条目录:/usr/lib/modules/2.4.18-rmk7-pxa1,该目录下只有一个文件:modules.dep,而没有其它目录,当然也没有include目录了,不知道这是怎么回事?是不是我目标机上的系统装得不完善?

(问题2)
但是我硬着头皮做下去了:
我接着在宿主机上将编译*.c 的语句改成了这样的形式:arm-linux-gcc -DMODULE -D _KERNEL_ -DLINUX -I/usr/src/linux-2.4.18-rmk7/include -Wall -c demomodule.c
这样运行后居然编译成了demomodule.o,而且我就在宿主机下用insmod demomodule.o试了一下,它提示说:ELF file demomodule.o not for this architecture,当时我一阵狂喜,因为我觉得这说明宿主机不识别那么ARM就能识别了,以为这样就可以下到目标机中安装了,于是我马上将demomodule.o下载到目标机中,然后在目标机中insmod demomodule.o,结果这个时候它提示: kernel_module version mismatch
demomodule.o was complied for kernel version 2.4.19-rmk6-pxa1-hh28
while this kernel is version 2.4.18-rmk7-pxa1

这下我又郁闷了,怎么会跑出个2.4.19-rmk6-pxa1-hh28版本来呢?
我的宿主机是2.4.20-8啊!

下面我该怎么修改啊?请大家再帮我看看吧!

谢谢了!!!

论坛徽章:
0
4 [报告]
发表于 2007-11-19 23:08 |只看该作者
你先下载你的目标机的内核版本2.4.18的整个源代码,然后在宿主机上解压,然后再基于这个代码编译

论坛徽章:
0
5 [报告]
发表于 2007-11-19 23:43 |只看该作者
谢谢楼上的 月吻长河 (月吻长河)  !

你能稍微把流程讲详细一点吗?

谢谢!

论坛徽章:
0
6 [报告]
发表于 2007-11-20 11:32 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2007-11-20 11:36 |只看该作者
就像4楼说的,你先下载你的目标机的内核版本2.4.18的整个源代码,然后在宿主机上解压到一个目录,然后再基于这个代码编译。
然后把库指定到这个目录下的include。别老去想你PC上的linux,那和你板子上的是两马事情,找到你移植的内核的源代码,然后指定include,再按照上面来。接近成功了...:wink:
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP