主要步骤:
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.linuxidc.com/Linux/2010-07/26990.htm
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.linuxidc.com/Linux/2011-08/40704.htm
skyeye-1.2.4_Rel.tar.gz 与cs8900.c、cs8900.h、dev_net_cs8900a.c下载见
免费下载地址在 http://linux.linuxidc.com/
用户名与密码都是www.linuxidc.com
具体下载目录在 /2012年资料/2月/28日/在SkyEye上运行ARM Linux图解教程/
详细步骤:
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
4)修改内核文件
5)裁剪/定制内核
makemenuconfig过程中可能提示需You must install ncurses-devel in order,解决办法是:apt-get install libncurses5-dev。
6) 编译
Make,在linux顶目录生成vmlinux文件,这就是所需要的arm-linux内核。编译结果如下:
2 编译skyeye
这里测试过用系统的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目录下。
3 编译busybox-1.19.2.tar.bz2,用于制作initrd.img文件。
采用的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了。
4 制作initrd.img文件除了按上面的步骤自己做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可能遇到的问题:
程序卡在这里不动,解决办法:多半是因为在上面编译skyeye的时候,前面是用的某另一版本gcc编译器,编译到出问题,设置成默认gcc4.1编译器,再继续编译,最后生成了一个不伦不类的skyeye可执行程序。解决办法就是从一开始就使用gcc4.1编译器。
正常的运行结果如下图所示。
6 在arm-linux里运行我们自己的程序
方法一,在制作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; } |