菠菜

敏感而豁达

研究在skyeye上运行arm linux

参考教程:

构建 arm-linux 仿真运行环境 (skyeye + arm-linux + NFS)

Ubuntu安装低版本的GCC

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

详细步骤:

1 编译linux-2.6.14.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

image

image

image

image

image

4)修改内核文件

image

5)裁剪/定制内核

image

makemenuconfig过程中可能提示需You must install ncurses-devel in order,解决办法是:apt-get install libncurses5-dev。

image

6) 编译

Make,在linux顶目录生成vmlinux文件,这就是所需要的arm-linux内核。编译结果如下:

image

2 编译skyeye

这里测试过用系统的skyeye,1.2.5版本的,但是最后不能正常运行vmlinux,所以还得自己编译一个指定版本的skyeye,具体步骤如下:

采用软件skyeye-1.2.4_Rel.tar.gz

image

可能遇到的问题有:

image

解决办法:使用gcc4.1版本编译器。相关文件列表如下所示:

image

然后执行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目录下。

3 编译busybox-1.19.2.tar.bz2,用于制作initrd.img文件。

采用的arm工具是上面用到的arm-linux-3.4.1,这里只需要修改相应路径就是。

image

image

这个过程可能遇到的问题有:

image

解决办法:在make menuconfig的时候,把Miscellaneous Utilities --->下面的ionice模块去掉。

image

解决办法:从Linux2.6.29的include\mtd\ubi-user.h拷贝到busybox下的include\mtd下,如果 busybox下的include没有mtd文件夹,那就先建立一个mtd文件夹,然后复制了。

image

解决办法:通过查看内核源代码目录中的“include/linux/ifarp.h”文件可得知“ARPHRDINFINIBAND”的值为“32”,然后修改“networking/interface.c”文件,在其中添加:#define ARPHRD_INFINIBAND 32 /* InfiniBand */

image

解决办法:在makemenuconfig中,把Networking Utilities下的udhcp client(udhcpc)模块去掉。

image

解决办法:去掉Linux System Utilities --->[ ] mkfs_ext2和[ ] mkfs_vfat

编译成功效果图:

image

最后执行make install就OK了。

4 制作initrd.img文件

image

image

image

除了按上面的步骤自己做initrd.img外,也可以利用现成的initrd.img,如skyeye-testsuite-2.3中linux/s3c2410/s3c2410x-2.6.14下面所有的initrd.img。

5 用skyeye模拟运行

新建一个目录,将上面生成的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可能遇到的问题:

image

程序卡在这里不动,解决办法:多半是因为在上面编译skyeye的时候,前面是用的某另一版本gcc编译器,编译到出问题,设置成默认gcc4.1编译器,再继续编译,最后生成了一个不伦不类的skyeye可执行程序。解决办法就是从一开始就使用gcc4.1编译器。

正常的运行结果如下图所示。

image

6 在arm-linux里运行我们自己的程序

方法一,在制作initrd.img的时候,将程序植入进去,这种方法比较适用于产品发布。

方法二,通过NFS网络来运行。具体步骤如下:

image

注:上面的/test是指的根目录下的test,这个可以根据自己的情况修改。同样,arm下的版本和网卡配置等也是根据自己的情况修改。

image

注意,鉴于busybox是静态编译的,上面在使用arm-linux-gcc的时候,需要加上—static选项,即

arm-linux-gcc –static –o hello hello.c(注意arm-linux-gcc是否在PATH中)

运行结果效果图:

image

附hello.c程序:

int main(void)

{

int i;

for(i = 0; i < 6; i++){

printf("i = %d ",i);

printf("Hello, embedded linux!\n");

}

return 0;

}

posted on 2012-02-21 23:58  ~菠菜~  阅读(2177)  评论(0编辑  收藏  举报

导航