嵌入式系统移植三部曲 王晓峰

嵌入式系统移植三部曲
班级:09计应一班   姓名:王晓峰   日期:2010年6月13日

备注:本文是基于skyeye集成开发环境建立起来的,因此在进行系统移植之前要安装了skyeye才行;另外,对Linux内核、BusyBox、BootLoader(u-boot)的编译需要通过arm-linux-gcc-编译器,所以事先要搭建交叉编译环境;
准备工作:下载218.198.18.51:/课程资料/嵌入式/下的所有文件!,以备后用!

1,安装SkyEye:
操作系统:CentOS 5.6
从下面网址下载skyeye-1.2.6_rc1.tar.bz2。
218.198.18.51
下载完后在终端下执行:
[root@localhost Desktop]# tar -xjvf skyeye-1.2.6_rc1.tar.bz2 -C ./
解压源码包。
接着,编译skyeye-1.2.6
[root@localhost Desktop]# cd skyeye-1.2.6_rc1
[root@localhost skyeye-1.2.6_rc1]# ./configure
[root@localhost skyeye-1.2.6_rc1]# make
[root@localhost skyeye-1.2.6_rc1]#make install     //将skyeye安装到/usr/local/bin/
[root@localhost skyeye-1.2.6_rc1]# mv /usr/local/bin/skyeye  /usr/local/bin/skyeye1.2.6            //重命名启动开发板的命令为skyeye1.2.6
安装完毕!
2,创建交叉编译环境
从下面网址下载arm-linux-gcc-2.95.3.tar.bz2,arm-linux-gcc-3.4.1.tar.bz2,arm-linux-tools-4.2.1-20070808.tar.gz
218.198.18.51
:/课程资料/嵌入式/
下载后解压:
[root@localhost Desktop]# tar -xjvf arm-linux-gcc-2.95.3.tar.bz2 -C /usr/local/arm/
[root@localhost Desktop]# tar -xjvf arm-linux-gcc-3.4.1.tar.bz2 -C /
[root@localhost Desktop]# tar -xzvf arm-linux-tools-4.2.1-20070808.tar.gz -C /                      
搭建完毕!

第一步:Bootloader的移植!
从下面网址下载u-boot-1.1.4.tar.bz2
218.198.18.51
:/课程资料/嵌入式/u-boot-1.1.4.tar.bz2
原理:将引导加载程序u—boot烧写到开发板的NAND flash的起始地址,供bios读取
具体移植过程可以参考218.198.18.51:/课程资料/嵌入式/9.3 实例—Bootloader的移植.doc
第二步:linux内核的移植
大致流程:配置内核,制作能够被u-boot识别的内核映像u-image;再通过搭建tptp服务器将uimage下载到开发板内存,然后通过nand write 写到nand flash的第二个分区( 0x00100000 0x00300000),在u-boot中设置环境变量bootcmd为nand read 0x31000000 0x00100000 0x00300000,其中0x00100000 0x00300000代表nand flash 的第二个分区;意思是直接从nand flash的第二个分区将u-image读到内存的0x31000000处执行,而不是借助于tftp从宿主机下载到内存0x31000000处执行!这样就脱离了宿主机,直接从nand flash加载内核;
操作的具体步骤可参考218.198.18.51:/课程资料/嵌入式/9.4  实例—Linux的移植.doc

启动skyeye,进入u-boot;执行如下操作,把uImage.img用tftp下载到内存中,然后再固化到Nand Flash中,操作和执行如下:
OK2410 # tftp 0x31000000 uImage
OK2410 # nand erase 0x00100000 0x00300000    //擦除第二个分区
OK2410 # nand write 0x31000000 0x00100000 0x00300000  //将uimage写到nandflash第二分区
OK2410 # set bootcmd 'nand read 0x31000000 0x00100000 0x00300000;bootm 0x31000000'                         //设置启动参数,意思是将nand中0x31000000 0x00100000(和kernel分区一致)的内容读到内存0x31000000中,然后用bootm命令来执行;
OK2410 # saveenv    //保存设置;
重启skyeye就可以发现uimage可以自动被u-boot加载,不用通过tftp下载到内存后才能加载!脱离了宿主机!
至此,内核移植工作完成!
第三步:文件系统的移植(包含基于nandflash的jffs,cramfs,yaffs等MTD设备和基于网络的nfs文件系统;)
—,用BusyBox建立文件系统
首先搭建nfs服务器:[root@localhost Desktop]# gedit /etc/exports
文件内容如下:
/tmp/nfs *(rw,sync)
创建共享目录
[root@localhost Desktop]# mkdir -p /tmp/nfs/temp
[root@localhost Desktop]# exportfs -rv
exporting *:/tmp/nfs
[root@localhost Desktop]# chmod a+w /tmp/nfs/temp
[root@localhost Desktop]# chmod a+w /tmp/nfs/
nfs服务器搭建完毕;
根文件系统的移植:参考218.198.18.51:/课程资料/嵌入式/9.5  实例—根文件系统的移植.doc
jffs,cramfs,yaffs,Ramdisk,romfs文件系统的创建参考218.198.18.51:/课程资料/嵌入式/下对应的实例!
创建完毕后,通过tptp下载到内存,然后可以写到nand flash的固定分区上!这里要记住写的位置所代表的分区,进而修改环境变量bootargs,调整所使用的文件系统!
启动流程如下:
[root@localhost u-boot-1.1.4]# skyeye1.2.6

**************************** WARNING **********************************
If you want to run ELF image, you should use -e option to indicate
your elf-format image filename. Or you only want to run binary image,
you need to set the filename of the image and its entry in skyeye.conf.
***********************************************************************

Your elf file is little endian.
。。。。。。。。
。。。。。。。。
In:    serial
Out:   serial
Err:   serial
Hit any key to stop autoboot:  0

NAND read: device 0 offset 1048576, size 3145728 ...
启动到这里会从nandflash的第二个分区读取uimage到加载内存的0x31000000处执行;
wxf2410 # printenv
bootcmd=nand read 0x31000000 0x00100000 0x00300000;bootm 0x31000000
bootargs=noinitrd mem=64M root=/dev/mtdblock2 init=/linuxrc 由环境变量bootargs=noinitrd mem=64M root=/dev/mtdblock2 init=/linuxrc可知设置主文件系统为第三个分区烧写的cramfs文件系统
Reading data from NAND FLASH without ECC is not recommended
VFS: Mounted root (cramfs filesystem) readonly.
Mounted devfs on /dev
Freeing init memory: 96K
Reading data from NAND FLASH without ECC is not recommended
Reading data from NAND FLASH without ECC is not recommended
Reading data from NAND FLASH without ECC is not recommended
Reading data from NAND FLASH without ECC is not recommended
#mount all.......
******************************************************************
                   successful! wxf2410 Rootfs made by wxf, 2009.05
******************************************************************
(none) login: root
Password:
login[24]: root login on 'console'

Processing /etc/profile... Done

~ # cd /etc/
/etc # ls
fstab      init.d     mdev.conf  profile    shadow
group      inittab    passwd     proflie
/etc #


至此,一个完全脱离宿主机的系统成功移植完毕!开发板可以独立运行,自动加载uimage和文件系统!
四,基于nandflash的mtd设备的文件系统与nfs的区别:
1,yaffs,crams,jffs等文件系统是通过tftp第一次下载到开发板内存上面,然后nand write到nand flash的某一分区上面,当下次启动时,就不再需要通过tftp下载,只需要设置一下bootargs将对应的分区设置为rootfs即可!当修改他存在的分区时需要通过nanderase 和nandwrite;可以将其写到不同分区上面!

2,nfs则是通过搭建nfs服务器利用网络来挂载根文件系统,需要有宿主机的存在!不能独立的启动!

五;错误状况及错误分析:
1,使用tftp下载uimage和各种文件系统的映像时,要关闭防火墙。
2,在uboot命令行提示符下显示:如31000000 bad magic number, 则表示擦写nand flash或读nandflash的地址不一致!
3,通过nfs挂载时要注意权限问题!遇到访问拒绝,要修改文件的权限!
4,通过tftp下载时还可能会遇到selinux提供的安全机制问题,导致下载不成,这时进行如下设置:
[root@localhost ~]# getsebool -a|grep tftp
allow_tftp_anon_write --> off
tftpd_disable_trans --> off
[root@localhost ~]# setsebool allow_tftp_anon_write=1
[root@localhost ~]# setsebool tftpd_disable_trans =1


http://blog.chinaunix.net/space.php?uid=14735472&do=blog&id=110947


你可能感兴趣的:(嵌入式系统移植三部曲 王晓峰)