构建 arm-linux 仿真运行环境 (skyeye + arm-linux + NFS)
http://sourceforge.net/apps/trac/skyeye/wiki/Linux(上面教了我们怎么对不同模拟平台配置skyeye.conf文件)
根目录下的链接文件vmlinuz和initrd.img有什么用(这上面解答了我们为什么要走以下几步的原因)
1 编译linux-2.6.14.tar.bz2,基于smdk2410_defconfig
2 编译skyeye-1.2.4_Rel.tar.gz
3 编译busybox-1.19.2.tar.bz2,用于制作initrd.img文件
4 制作initrd.img文件
5 用skyeye模拟运行
6 在arm-linux里运行我们自己的程序
文件 |
下载地址 |
linux-2.6.14.tar.bz2 |
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.14.tar.bz2 |
arm-linux-gcc-3.4.1.tar.bz2 |
http://www.handhelds.org/download/projects/toolchain/arm-linux-gcc-3.4.1.tar.bz2(注意,原地址可能失效,但用迅雷或者在网上搜此文件找得到下载。) |
cs8900.c、cs8900.h、dev_net_cs8900a.c |
http://www.cppblog.com/Files/jb8164/attach.rar |
skyeye-1.2.4_Rel.tar.gz |
http://www.busybox.net/downloads/busybox-1.19.2.tar.bz2 |
gcc4.1(包含文件cpp-4.1_4.1.2-27ubuntu1_i386.deb、g++-4.1_4.1.2-27ubuntu1_i386.deb、gcc-4.1_4.1.2-27ubuntu1_i386.deb、gcc-4.1-base_4.1.2-27ubuntu1_i386.deb、libstdc++6-4.1-dev_4.1.2-27ubuntu1_i386.deb) |
http://archive.ubuntu.com/ubuntu/pool/universe/g/gcc-4.1/ |
busybox-1.19.2.tar.bz2 |
http://www.busybox.net/downloads/busybox-1.19.2.tar.bz2 |
将arm-linux-gcc-3.4.1.tar.bz2解压,将里面的arm目录移动到/usr/local下。
将linux-2.6.14.tar.bz2解压到工作目录。
下面编译linux:
1)修改Makefile,ARCH ?= arm CROSS_COMPILE ?= /usr/local/arm/3.4.1/bin/arm-linux-
2)make smdk2410_defconfig
3)为内核添加cs87900网卡驱动以支持NFS
4)修改内核文件
5)裁剪/定制内核
makemenuconfig过程中可能提示需You must install ncurses-devel in order,解决办法是:apt-get install libncurses5-dev。
6) 编译
Make,在linux顶目录生成vmlinux文件,这就是所需要的arm-linux内核。编译结果如下:
这里测试过用系统的skyeye,1.2.5版本的,但是最后不能正常运行vmlinux,所以还得自己编译一个指定版本的skyeye,具体步骤如下:
采用软件skyeye-1.2.4_Rel.tar.gz
可能遇到的问题有:
解决办法:使用gcc4.1版本编译器。相关文件列表如下所示:
然后执行dpkg –i *.deb就可以安装好gcc4.1了。然后需要设置默认gcc版本。相关命令为:
ls /usr/bin/gcc*可以查看当前有哪些版本的gcc,注意gcc的目录路径。
update-alternatives –install /usr/bin/gcc gcc /usr/bin/gcc-4.1 40 配置gcc可选版本4.1,也就是刚安装的那一个。
update-alternatives –install /usr/bin/gcc gcc /usr/bin/gcc-4.? ? 配置gcc其他可选版本
update-alternatives –config gcc在里面选择默认的4.1版本。
编译成功后将binary/skyeye复制到/usr/local/bin目录下。
采用的arm工具是上面用到的arm-linux-3.4.1,这里只需要修改相应路径就是。
这个过程可能遇到的问题有:
解决办法:在make menuconfig的时候,把Miscellaneous Utilities --->下面的ionice模块去掉。
解决办法:从Linux2.6.29的include\mtd\ubi-user.h拷贝到busybox下的include\mtd下,如果 busybox下的include没有mtd文件夹,那就先建立一个mtd文件夹,然后复制了。
解决办法:通过查看内核源代码目录中的“include/linux/ifarp.h”文件可得知“ARPHRDINFINIBAND”的值为“32”,然后修改“networking/interface.c”文件,在其中添加:#define ARPHRD_INFINIBAND 32 /* InfiniBand */
解决办法:在makemenuconfig中,把Networking Utilities下的udhcp client(udhcpc)模块去掉。
解决办法:去掉Linux System Utilities --->[ ] mkfs_ext2和[ ] mkfs_vfat
编译成功效果图:
最后执行make install就OK了。
除了按上面的步骤自己做initrd.img外,也可以利用现成的initrd.img,如skyeye-testsuite-2.3中linux/s3c2410/s3c2410x-2.6.14下面所有的initrd.img。
新建一个目录,将上面生成的initrd.img、vmlinux复制过来。并将以下文本写到该目录下的skyeye.conf文件中。
cpu: arm920t mach: s3c2410x # physical memory mem_bank: map=M, type=RW, addr=0xc0000000, size=0x00800000 mem_bank: map=M, type=RW, addr=0xc0800000, size=0x00800000, file=./initrd.img mem_bank: map=M, type=RW, addr=0xc1000000, size=0x01000000 # all peripherals I/O mapping area mem_bank: map=I, type=RW, addr=0x48000000, size=0x20000000 mem_bank: map=I, type=RW, addr=0x19000300, size=0x00000020 net: type=cs8900a, base=0x19000300, size=0x20,int=9, mac=0:4:3:2:1:f, ethmod=tuntap, hostip=10.0.0.1 lcd: type=s3c2410x, mod=gtk #dbct:state=on |
执行skyeye –e vmlinux可能遇到的问题:
程序卡在这里不动,解决办法:多半是因为在上面编译skyeye的时候,前面是用的某另一版本gcc编译器,编译到出问题,设置成默认gcc4.1编译器,再继续编译,最后生成了一个不伦不类的skyeye可执行程序。解决办法就是从一开始就使用gcc4.1编译器。
正常的运行结果如下图所示。
方法一,在制作initrd.img的时候,将程序植入进去,这种方法比较适用于产品发布。
方法二,通过NFS网络来运行。具体步骤如下:
注:上面的/test是指的根目录下的test,这个可以根据自己的情况修改。同样,arm下的版本和网卡配置等也是根据自己的情况修改。
注意,鉴于busybox是静态编译的,上面在使用arm-linux-gcc的时候,需要加上—static选项,即
arm-linux-gcc –static –o hello hello.c(注意arm-linux-gcc是否在PATH中)
运行结果效果图:
附hello.c程序:
int main(void) { int i; for(i = 0; i < 6; i++){ printf("i = %d ",i); printf("Hello, embedded linux!\n"); } return 0; } |