全部博文(41)
2011年(41)
分类: 嵌入式
2011-08-29 16:53:50
开发板mini2440
虚拟机系统 fedora
交叉编译链 友善之臂arm-linux-gcc-4.4.3
linux内核 2.6.32.2
从安装开发环境到开始第一个驱动,而且还是完全照着手册来的,而且没有自己写,完全只是熟悉流程,没想到这个过程也是这么的不容易,今天不是来庆功的,今天来鼓励自己的,最简单的hello模块到今天为止还是失败。
至于其他的大大小小的问题和一些方法就不多讲了,本来想弄完了hello模块的驱动在来个总结,自己捣鼓了俩天,baidu google搜了不少,问题没有解决,今天终于在群里面问了,大家也很积极帮我这新手,不过后来群主的几句话让我很泄气啊,大概意思就是先去google一下,可能他们看起来很简单的问题吧,可能google一下就找了答案了。可是我也google了俩天了,额,也许是对的吧,不过很打击新手。给自己鼓励一下吧,继续加油!
问题1 加载hello模块的时候modprobe: 'mini2440_hello_module.ko': invalid module format 的错误,log/messages中的信息如下
[root@FriendlyARM /]# cat var/log/messages
Aug 28 17:49:57 FriendlyARM syslog.info syslogd started: BusyBox v1.13.3
Aug 28 17:50:11 FriendlyARM daemon.info init: starting pid 692, tty '': '-/bin/'
问题2 启动nfs服务的时候
[root@tom char]# /etc/init.d/nfs start
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ]
Starting NFS daemon: [FAILED]
问题3 编译虚拟机系统内核出错 进行make操作时候出错
make[1]: *** No rule to make target `missing-syscalls'. Stop.
make: *** [prepare0] Error 2
总结整个过程,开始配置好了nfs服务,可以挂载,安装好了交叉编译工具,前天照着ARM Linux 入门与实践一书时照着写了一个linux下的hello驱动,发现编译的时候出现很多的文件和变量找不到的错误,上网一搜,发现是因为内核没有编译的原因,按照网上的方法,在/usr/src/kernels/2.6.25-14.fc9.i686下面make,发现出现上面的问题3的出错,我又上网搜,找了很多办法也试了好多,而且可能已经改变了一些内核的东西吧,反正是一个一个的方法试的。后面没有弄成功。
接下来又去看mini2440的用户手册,里面有hello模块的详细步骤,我就照着一步步做,其他也遇到了问题,那就是配置了Kconfig后在make menuconfig的时候发现没有mini2440的模块,后面又是在内核配置中配置了一番,不过后面是搞定了,依赖关系中的前一个选项没有选上,一开始什么都不懂的原因啊,学习吧。后面就照着一步步终于是弄出了一个mini2440_hello_module.ko的模块,要把这个模块下到开发板中去,然后动态加载进内核,我就想到用nfs共享来传,启动nfs时,出现问题2的出错。我怀疑是前面内核给弄的,网上一顿搜索,没有解决,无解就暂时放着,用串口传,又捣鼓了一顿串口,好了,终于是传到开发板了,动态加载内核模块,出现问题1的错误,上网一顿搜,没有解决。整个过程大概就这样吧。
我自己思考着着几个问题应该是一起的,就是说,要是我没有 make那个内核可能就不会启动不了nfs 或者这个加载 hello模块可能也是好的,那就是这个问题在于那个内核make的问题上。
第二,问题2和问题1中提示信息中都有deamon这个信息,是不是这俩个问题其实会不会是一个问题?
第三,对于问题1也有可能是编译内核和编译模块的gcc版本问题,其实对于这个版本问题,好晕,一来工具有版本问题,而且,现在一个linux系统有个内核版本,我用的是fedora9.0 内核是2.6.25-14.fc9.i686 然后在这个linux上面又装了一个内核 是linux2.6.32.2的,然后开发板上的linux也有一个内核,2.6.32.2-FriendlyARM,要把这些东西的依赖关系弄清楚,哪些应该是要相同的。
第四,看能不能解决linux内核那个make的问题。这个可能是关键。
今天暂且把这些先写到这里 2011-08-28 21:21
昨天写了一篇驱动入手遇到的问题的文章来给自己鼓气,今天终于是把第一个驱动模块给加载进去并且能够运行了。对于昨天的问题还有俩个问题没有答案,不过那俩个问题就先放着。
首先大概说一下交叉编译来开发,以前对于交叉编译开发我的理解就是要安装一个交叉编译工具arm-linux-gcc然后其他的就不用管了,其实不是这样的,而且对于交叉编译环境的搭建一定要明确,那就是要在你开发的系统中(我们一般是在虚拟机中搭建的linux系统)搭建一个和你开发板中的系统完全一样的开发环境,这个环境包括安装相同的内核源码,库文件,各种内核配置等等,要完整的照着手册要做,包括安装linux源码,定制linux内核等等,一开始我不明白怎么又要安装linux内核干嘛的。其实这个搭建的环境编译后生成的内核镜像和你开发板的一样,你可以烧写到开发板中试一试。到这里的时候我就可以想到昨天出现的其他那俩个问题,开发机linux的内核编译和nfs问题就和这个不一样了,因为交叉编译的环境,内核代码,头文件库文件,各种配置都是在搭建的这个开发环境中,和你开发主机linux的内核没有关系。现在你可以看一下一般你的开发主机的内核和搭建的开机环境的内核一般是不一样的,我的pc机的linux内核是2.6.25-14.fc9.i686而我搭建的开发环境的linux内核是2.6.32.2.熟悉了的人看起来这种问题很简单,但是刚开始的时候我是很晕的,要不然我不会去编译PC开发机的linux内核的。
说了很多废话,回到主题,关于前一篇问题的问题1,前一篇文章 linux+arm驱动入手问题
有俩个方面的问题导致加载模块不成功,一是编译模块前需要一些配置,还有开发环境的搭建中的一些问题。二是minicom串口传输文件,这个也是昨天琢磨了好久的,今天发现用这个传文件的时候传完了一定要检查一下,昨天我看到了有一个命令可以检查的但是今天找不到了,不过检查大小也是一样的,我以前就是因为传的文件不完整,大小不大,我该了之后就好了。
这是我在网上找到的一份MINI2440开发环境及模块安装至少我现在觉得很好
1.安装Fedora9.0
mini2440推荐安装9.0的版本。
在VM虚拟机中默认安装即可。
2.安装gcc
在Fedora9.0.ISO中的package文件夹下可以找到gcc的rpm安装包,就不需要到网上费劲下载了。
rpm -ivh gcc*.rpm
首次安装会提示依赖包确实,按照提示一个一个的安装上,这些rpm包都在ISO里。
顺别说一次,如果需要相互依赖的包,可以通过rpm -Uvh a.rpm b.rpm同时安装这两个包。
安装完成后,输入gcc -v查询版本信息,如果能执行,表明gcc已安装成功。
3.安装arm-linux-gcc
在mini2440的光盘中linux文件夹下找到arm-linux-gcc.tar.gz文件,复制到/opt/下
然后tar xvzf arm-linux-gcc.tar.gz -C 解压缩
然后gedit /root/.bashrc
在最后一行追加
export PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin
重新登录linux后
执行arm-linux-gcc -v,如果能执行,表明arm-linux-gcc已安装成功。
4.解压缩arm-linux源码
在mini2440光盘中linux下找到文件
linux-2.6.32.2-mini2440-20100728.tar.gz,将它复制到/opt下,然后解压缩,压缩后会生成
/opt/FriendlyARM/mini2440/linux2.6.32.2文件夹
cd /opt/FriendlyARM/mini2440/linux2.6.32.2
配置缺省config
cp config_mini2440_t35 .config
make menuconfig
如果提示ncurses有问题,需要通过rpm方式安装ncurses,其rpm包在Fedora9.0.ISO中可以找到。
然后 make menucofig,一般不需要改。
然后 make
5.编译模块
make menuconfig 配置要编译的模块
make modules
make modules_install
这样就可以生成.ko模块文件
将这个文件ftp(记住是bin模式)上传到mini2440开发板下的/lib/modules/2.6.32.2-FriendlyARMxia
然后modprobe yourmodulename,不要带扩展名.ko。如果通过insmod命令安装
通过lsmod查看模块安装情况
通过rmmod yourmodulename卸载
错误
insmod: error inserting 'helloworld.ko': -1 Invalid module format
原因是编译问题,必须严格按照步骤。
可以通过cat /var/log/messages查看详细的错误信息。
不过我这里说一下关于/var/log/messages 也是网上找到的,简单的说明了一下
日志文件其实是纯文本的文件,每一行就是一个消息。只要是在Linux下能够处理纯文本的工具都能用来查看日志文件。日志文件总是很大的,因为从你第一次启动Linux开始,消息就都累积在日志文件中。看日志文件的一个比较好的方法是用像More或Less那样的分页显示程序,或者用Grep查找特定的消息。我们先用Less显示“/var/log/messages”,可以看到从日志文件中取出来的一些消息。每一行表示一个消息,而且都由四个域的固定格式组成:
*时间标签(Timestamp),表示消息发出的日期和时间。
*主机名(Hostname),表示生成消息的计算机的名字。如果只有一台计算机,主机名就可能没有必要了。但是,如果在网络环境中使用Syslog,那么就可能要把不同主机的消息发送到一台服务器上集中处理。在我们的例子中主机名为lcbj。
*生成消息的子系统的名字。可以是“Kernel”,表示消息来自内核或者是进程的名字,表示发出消息的程序的名字。在方括号里的是进程的PID。
*消息(Message),即消息的内容。
我根据这个我查看了一下我的messages信息,发现你们说的是里面信息来自进程的名字那里写的是az 这个是串口的命令啊,所以我就去看看文件有没有完整,果然有问题。
今天暂时就先写到这里吧,其他的俩个问题或者关于messages的详解我一直没找到,那就以后看到了在来写。
2011-08-29 16:53
今天终于是发现问题的所在了, 一个非常非常菜的问题,这样的问题都不好意思说出来,但是不说出来又意味着什么了?下面是引用别人的。
kernel devel和kernel source的区别 区别:kernel-devel包只包含用于内核开发环境所需的内核头文件以及Makefile,而kernel-souce包含所有内核源代码。 kernel-souce在RH某些版本之后不再附带在发行版中了,必须自己通过kernel-XXX.src.rpm做出来。 关于kernel source的有kernel和kernel-devel两个rpm,其中kernel rpm包含源文件和头文件(就像2.4下的kernel-source rpm),而kernel-devel则主要是头文件。 这就是我折腾了好久今天终于弄明白的一件事,那就是我其实没有安装源代码,而我只是安装的一个kernel-devel,因为
fedora安装VMware-tools的时候需要安装这个包,所以我一直编译不成功的内核源码原来是一直在编译没有源代码的头文件,因为编译不成功后
面修改了内核的配置,所以导致nfs服务启动失败,cdrom无法挂载等等问题。而这些问题缘由是改变了内核,相当于伤到了筋骨,所以一般的办法无法修
复。所以我搜遍了google baidu都没有一个办法可以解决,最后果断重装了。果然内核的修改伤不起啊!这个慢慢来,有空多练练内功。 2011-08-31 21:18
如果仅仅是用于你自己编写的模块开发的话,因为只需引用相应的内核头文件,所以只有devel包即可,如果你要修改现有的内核源代码并重新编译,那必须是kernel-souce。
kernel-devel是用做内核一般开发的,比如编写内核模块,原则上,可以不需要内核的原代码。
kernel则是专指内核本身的开发,因此需要内核的原代码。