初学者求解-交叉环境的搭建

cikerexue 2012-12-14 02:50:42
各位大神求助啊,本人初学linux一书,里面有搭建交叉编译环境,本人如网上所说搭建,但是老是到最后一步,安装模块的时候报错,网上说是内核版本不匹配,我找过3个版本的内核代码,都是一样的报错。最后一次报错结果如下:


makefile中指向目录有文件如下:


本人下载的内核源码和自身携带的如下:


我是初学者,刚刚开始看linux设备驱动一书,只是想先把环境搭建出来
要加载的模块本身没有意义,就是一个hello world
但是现在我电脑上的环境也不能搭建出来,搞了3天了,编译内核不下5次了,感觉自己太水了。
我的版本难道还不匹配么?
...全文
189 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
铭雪 2012-12-14
  • 打赏
  • 举报
回复
解答的很透彻!
cikerexue 2012-12-14
  • 打赏
  • 举报
回复
引用 13 楼 weiqing1981127 的回复:
你说的下载linu2.6.38到虚拟机,然后要在虚拟机上直接insmod到虚拟机你下的那个linux2.6.38文件里是不可实现的
哦,明白了,谢谢,结贴给分
流水恋歌 2012-12-14
  • 打赏
  • 举报
回复
你说的下载linu2.6.38到虚拟机,然后要在虚拟机上直接insmod到虚拟机你下的那个linux2.6.38文件里是不可实现的
流水恋歌 2012-12-14
  • 打赏
  • 举报
回复
这样给你解释下,我们一般insmod驱动都是加载到开发板的,比如我们使用mini2440的开发板,它使用的是linux2.6.32.2的内核,那么我们会下载一个linux2.6.32.2内核源代码到虚拟机,然后将Makefile的路径指向我们存放linux2.6.32.2内核源代码,这样你make下会生成hello.ko,然后你启动开发板(假设你的操作界面使用的是超级终端),那么你首先传输uImage或者ZImage内核镜像,然后在超级终端下insmod hello.ko,这样,你的hello.ko就是基于你下载的linux2.6.32.2,同时也编译进了linux2.6.32.2内核中。
cikerexue 2012-12-14
  • 打赏
  • 举报
回复
引用 10 楼 weiqing1981127 的回复:
是的,你的回答完全正确,恭喜你理解了。如果只是在虚拟机上insmod,根本不用下载内核到虚拟机的。
恩,再次感谢你! 我还有一个疑问,有没有什么办法可以将我的模块加载到我下载后编译并挂载上去的那个文件夹里面呢?
流水恋歌 2012-12-14
  • 打赏
  • 举报
回复
是的,你的回答完全正确,恭喜你理解了。如果只是在虚拟机上insmod,根本不用下载内核到虚拟机的。
cikerexue 2012-12-14
  • 打赏
  • 举报
回复
引用 6 楼 weiqing1981127 的回复:
如果你在虚拟机上insmod,那你必须在虚拟机里找到,虚拟机中导入的linux内核的版本,你可以用下面我写的这个Makefile就可以了 obj-m := hello.o KERNELDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KERNELDIR) M=……
首先谢谢你的耐心解答。 这样是可以。但是我还有一个疑惑,这样的话那我原先下载的内核代码进行编译就没有必要了,直接可以使用系统自带的就ok了。下面是我的理解,不知道错了没有: ---------------------------------------------------------------------------------- 我首先在终端之中用察看自己内核代码版本,之后下载对应的版本,之后进行make oldconfig(即裁剪内核),之后再进行编译(即make),之后创建内核模块(即make modules),最后安装(即make modules_install)模块。即在我的文件之中生成”/lib/modules/2.6.38.8“这样一个文件夹,至此环境搭建完成。 ---------------------------------------------------------------------------------- 然后,我的想法是我在外面编译我的hello world代码,并生成模块。最终我用我的那个Makefile编译出来的模块加载到的地方是"/lib/modules/2.6.38.8“这个文件夹里面。而不是加载到在系统自带的"/lib/modules/2.6.38-8-generic",而你说的那个方式是加载到系统自带的文件夹里面。 不知道我的想法对不对?谢谢
zhujinqiang 2012-12-14
  • 打赏
  • 举报
回复
楼上正解..
流水恋歌 2012-12-14
  • 打赏
  • 举报
回复
编译驱动,要看你编译的驱动在哪里加载,也就是看驱动的使用环境。如果在虚拟机内加载,你就要知道虚拟机里linux内核的版本,如果你在开发板上加载,那么你就要知道开发板使用的内核版本,这个版本就对应Makefile中的内核路径
流水恋歌 2012-12-14
  • 打赏
  • 举报
回复
如果你在虚拟机上insmod,那你必须在虚拟机里找到,虚拟机中导入的linux内核的版本,你可以用下面我写的这个Makefile就可以了 obj-m := hello.o KERNELDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
cikerexue 2012-12-14
  • 打赏
  • 举报
回复
引用 3 楼 weiqing1981127 的回复:
另外友情提醒:你Makeifile中用的是2.6.38.8版本的内核,如果这是开发板的内核版本,那你就该在板子上insmod,如果这是虚拟机中内核版本,那你就可以在虚拟机上insmod
我是在虚拟机里面insmod一个简单的hello world模块,只是做测试环境之用
cikerexue 2012-12-14
  • 打赏
  • 举报
回复
引用 2 楼 weiqing1981127 的回复:
加载模块应该是insmod hello.ko 不是你的insmod ./hello.ko 哦
ps:我也是自己看驱动,自己摸索驱动快一年了,加油!

谢谢你的解答,但是还是不行,这是我的运行结果。
[
流水恋歌 2012-12-14
  • 打赏
  • 举报
回复
另外友情提醒:你Makeifile中用的是2.6.38.8版本的内核,如果这是开发板的内核版本,那你就该在板子上insmod,如果这是虚拟机中内核版本,那你就可以在虚拟机上insmod
流水恋歌 2012-12-14
  • 打赏
  • 举报
回复
加载模块应该是insmod hello.ko 不是你的insmod ./hello.ko 哦 ps:我也是自己看驱动,自己摸索驱动快一年了,加油!
cikerexue 2012-12-14
  • 打赏
  • 举报
回复
再附上模块信息:

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧