主题 : 内核驱动编译问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 78994
精华: 0
发帖: 33
金钱: 170 两
威望: 34 点
综合积分: 66 分
注册时间: 2012-09-28
最后登录: 2017-07-29
楼主  发表于: 2013-05-05 14:16

 内核驱动编译问题

最近学习驱动,编写了一字符设备驱动,看了他人的几个makefile,发现其中的KDIR不一样啊,一个是KDIR := /home/guoqian/4-3-1/linux-2.6.29,另一个是KDIR := /lib/modules/2.6.18-53.el5/build/这两个路径有什么区别吗?其中第一个还加交叉编译(ARCH=arm CROSS_COMPILE=arm-linux-),使用第一个路径的时候出错(目录已更改过是我自己的源代码路径),于是进入目录makexxx' ARCH=arm CROSS_COMPILE=arm-linux-,之后编译通过,到下载到开发板(mini6410)上运行时,报错,信息如下:
globlemem_5_4: version magic '2.6.36 mod_unload modversions ARMv5 ' should be '2.6.36-FriendlyARM preempt mod_unload ARMv6 '
insmod: can't insert 'globlemem-5-4.ko': invalid module format

使用第二个路径且不加交叉编译一路编译顺畅,在虚拟机中加载、使用一切正常,真是一头雾水,
通过这么一折腾又有了些问题:
1、虚拟机中linux下  /lib/modules/2.6.18-53.el5/build/是怎么来的?arm与宿主机在编译内核时指定内核目录不同?
2、是不是从网上下载的源代码编译之后才能使用?
谁能帮忙解答一下吗?万分感谢,初学伤不起啊~~~
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2013-05-05 16:18
通常情况下,内核模块Makefile中的KDIR表示编译要加载这个模块的内核镜像对应的源代码目录。而对于运行在PC上(包括虚拟机)的Linux来说,/lib/modules/x.xx.xx/build这样的路径指向的是这个PC上运行的x.xx.xx版本内核镜像所对应的源代码目录。如果x.xx.xx与“uname -r”命令的结果一致,那就表示是PC当前运行的内核镜像。所以,这样的路径通常用来编译加载到当前PC上运行的Linux的内核模块。这就是你所说的“使用第二个路径且不加交叉编译一路编译顺畅,在虚拟机中加载、使用一切正常,真是一头雾水”的原因。

第一个路径是用来编译开发板上运行的内核模块的。那需要两个条件
1. 开发板当前运行内核镜像对应的源代码目录(并且已配置好);
2. 交叉编译配置。
从你的出错信息

globlemem_5_4: version magic '2.6.36 mod_unload modversions ARMv5 ' should be '2.6.36-FriendlyARM preempt mod_unload ARMv6 '

看,应该是没有正确配置内核源代码。在友善之臂提供的开发板用户手册上可以找到如何配置内核的步骤。

1、虚拟机中linux下  /lib/modules/2.6.18-53.el5/build/是怎么来的?arm与宿主机在编译内核时指定内核目录不同?

这是虚拟机安装Linux过程中生成的,为了方便编译在虚拟机上加载的内核模块,和编译在开发板上运行的内核模块所需要的内核目录不同。

2、是不是从网上下载的源代码编译之后才能使用?

我不清楚你所说的"从网上下载的源代码"指的是什么,不过一般来说,C/C++这样的源代码需要编译成二进制文件(可执行档或库文件)之后才能运行。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 78994
精华: 0
发帖: 33
金钱: 170 两
威望: 34 点
综合积分: 66 分
注册时间: 2012-09-28
最后登录: 2017-07-29
2楼  发表于: 2013-05-05 17:51

 回 1楼(kasim) 的帖子

非常感谢,清楚了很多。
最后一个问题是想问我从网上下载的内核源代码不经修改,在编译内核模块的时候指向该目录可不可以?按你的说法,这个源代码没有编译也就没有内核镜像,应该不能编译吧?

make[1]: Entering directory `/home/linux-2.6.36'

  ERROR: Kernel configuration is invalid.
         include/generated/autoconf.h or include/config/auto.conf are missing.
         Run 'make oldconfig && make prepare' on kernel src to fix it.


  WARNING: Symbol version dump /home/linux-2.6.36/Module.symvers
           is missing; modules will have no dependencies and modversions.

  Building modules, stage 2.
/home/linux-2.6.36/scripts/Makefile.modpost:42: include/config/auto.conf: No such file or directory
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
3楼  发表于: 2013-05-05 21:55

 回 2楼(w伸个懒腰) 的帖子

是的。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."