嵌入式系统移植三部曲

发布时间:2016-12-10 17:16:00 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"嵌入式系统移植三部曲",主要涉及到嵌入式系统移植三部曲方面的内容,对于嵌入式系统移植三部曲感兴趣的同学可以参考一下。

嵌入式系统移植三部曲   一、           BootLoader的移植 二、           Linux内核的移植 三、           根文件系统的移植 准备工作:安装SkyEye SkyEye可以仿真出多种嵌入式开发板和外设,在安装SkyEye的过程中,就等于是在模拟出一个开发板。 SkyEye的安装过程: 1、下载skyeye-1.2.6_rc1,对其进行解压; [[email protected] Desktop]# tar -xjvf skyeye-1.2.6_rc1.tar.bz2 -C ./ 2、编译安装skyeye-1.2.6; [[email protected] Desktop]# cd skyeye-1.2.6_rc1 [[email protected] skyeye-1.2.6_rc1]# gedit INSTALL       //编译安装信息 [[email protected] skyeye-1.2.6_rc1]# ./configure               //配置 [[email protected] skyeye-1.2.6_rc1]# make                            //编译                                                                       [[email protected] skyeye-1.2.6_rc1]# make install      //安装 [[email protected] skyeye-1.2.6_rc1]# ll /usr/local/bin/skyeye 出现 -rwxr-xr-x 1 root root 2544308 05-17 17:59 /usr/local/bin/skyeye 则安装成功。     一、BootLoader的移植 BootLoader是加电后的第一个运行程序,它可以初始化开发板的硬件设备,将内核映像从硬盘上读到RAM中,从而跳转到linux的内核入口去执行程序,这样就可以启动操作系统了。由于BootLoader是第一个执行的程序,所以它和开发板的体系结构有很大的关系。   BootLoader的移植过程: 所需文件:交叉编译器:arm-linux-gcc2.95.3.tar.bz2, Bootloader:u-boot-1.1.4.tar.bz2 1.解压u-boot-1.1.4.tar.bz2 和gcc2.95.3编译器 [[email protected] Desktop]# tar -xjvf u-boot-1.1.4.tar.bz2  -C ./ [[email protected] Desktop]# tar -xjvf arm-linux-gcc-2.95.3.tar.bz2 -C /usr/local/arm   2.编辑u-boot根目录中的Makefile文件    [[email protected] u-boot-1.1.4]# gedit Makefile    将 ifeq ($(ARCH),arm) CROSS_COMPILE = arm-linux- endif 改为 ifeq ($(ARCH),arm) CROSS_COMPILE=/usr/local/arm/2.95.3/bin/arm-linux- endif   在 smdk2410_config       :       unconfig               @./mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24x0 后面添加 ok2410_config       :       unconfig               @./mkconfig $(@:_config=) arm arm920t ok2410 NULL s3c24x0 3.复制必要的文件,编辑ok2410.h头文件 [[email protected] u-boot-1.1.4]# mkdir board/ok2410 [[email protected] u-boot-1.1.4]# cp board/smdk2410/* board/ok2410/ [[email protected] u-boot-1.1.4]# mv board/ok2410/smdk2410.c board/ok2410/ok2410.c [[email protected] u-boot-1.1.4]# cp include/configs/smdk2410.h include/configs/ok2410.h [[email protected] u-boot-1.1.4]# gedit include/configs/ok2410.h    将 #define       CFG_PROMPT              "SMDK2410 # "       /* Monitor Command Prompt       */ 改为 #define       CFG_PROMPT              "OK2410 # "       /* Monitor Command Prompt       */ 4.编辑board/ok2410/Makefile文件 [[email protected] u-boot-1.1.4]# gedit board/ok2410/Makefile 将 OBJS       := smdk2410.o flash.o 改为 OBJS       := ok2410.o flash.o 5.配置、编译u-boot    [[email protected] u-boot-1.1.4]# make ok2410_config    [[email protected] u-boot-1.1.4]# make 6.编辑skyeye.conf文件   [[email protected] u-boot-1.1.4]# gedit skyeye.conf # skyeye config file for S3C2410X cpu: arm920t mach: s3c2410x # physical memory mem_bank: map=M, type=RW, addr=0x00000000, size=0x00800000, file=./u-boot.bin ,boot=yes mem_bank: map=M, type=RW, addr=0x30000000, size=0x00800000 mem_bank: map=M, type=RW, addr=0x30800000, size=0x00800000 mem_bank: map=M, type=RW, addr=0x31000000, size=0x03000000 # 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=08:00:3E:26:0A:5B, ethmod=tuntap, hostip=10.0.0.1 nandflash: type=s3c2410x,name=K9F1208U0B,dump=./nand.dump #lcd:type=s3c2410x, mod=gtk dbct:state=on 7.执行skyeye1.2.6 [[email protected] 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 OK2410 # 8.移植nand [[email protected] u-boot-1.1.4]# gedit cpu/arm920t/start.S 9.修改board/ok2410/Makefile [[email protected] u-boot-1.1.4]# gedit board/ok2410/Makefile 将 OBJS       := ok2410.o flash.o 改为 OBJS       := ok2410.o flash.o nand_read.o 10.创建board/ok2410/nand_read.c文件 [[email protected] u-boot-1.1.4]# gedit board/ok2410/nand_read.c 11.编辑include/configs/ok2410.h文件 [[email protected] u-boot-1.1.4]# gedit include/configs/ok2410.h 12.编译u-boot,测试u-boot是否可以从nand启动  [[email protected] u-boot-1.1.4]# make [[email protected] u-boot-1.1.4]# skyeye1.2.6 //再次执行skyeye1.2.6 13.对u-boot添加nand指令的支持 [[email protected] u-boot-1.1.4]# gedit include/configs/ok2410.h [[email protected] u-boot-1.1.4]# gedit board/ok2410/ok2410.c [[email protected] u-boot-1.1.4]# gedit common/cmd_nand.c 14.编译、测试 [[email protected] u-boot-1.1.4]# make [[email protected] u-boot-1.1.4]# ./mknandflashdump u-boot.bin nand.dump 0 [[email protected] u-boot-1.1.4]# skyeye1.2.6   出现如第7步结果; 到目前为止,BootLoader的移植完毕; 二、Linux内核的移植    内核作为操作系统的核心,管理系统的进程、存储设备、文件系统等。内核移植是至关重要的一部分; linux内核移植的过程: 需要文件:linux-2.6.14.7.tar.bz2  cs8900.c和cs8900.h         arm-linux-gcc3.4.1.tar.bz2 在移植之前要搭建tftp服务器: 查看tftp的配置文件: [[email protected] Desktop]# gedit /etc/xinetd.d/tftp [[email protected] Desktop]#chmod -R 755 /tftpboot [[email protected] Desktop]#service xinetd restart 1.解压linux-2.6.14.7.tar.bz2 [[email protected] Desktop]# tar -xjvf linux-2.6.14.7.tar.bz2 -C ./ [[email protected] Desktop]#tar -xjvf arm-linux-gcc3.4.1.tar.bz2 -C ./ 2.编辑Makefile文件 [[email protected] Desktop]# cd linux-2.6.14.7 [[email protected] linux-2.6.14.7]# gedit Makefile 将 ARCH              ?= $(SUBARCH) CROSS_COMPILE       ?= 改为 ARCH              ?= arm CROSS_COMPILE       ?= /usr/local/arm/3.4.1/bin/arm-linux- 3、对cs8900网卡的移植 [[email protected] linux-2.6.14.7]# cp ../cs8900/cs8900.c drivers/net/arm/ [[email protected] linux-2.6.14.7]# cp ../cs8900/cs8900.h drivers/net/arm/ [[email protected] linux-2.6.14.7]# gedit drivers/net/arm/Kconfig [[email protected] linux-2.6.14.7]# gedit drivers/net/arm/Makefile 4.编辑arch/arm/mach-s3c2410/mach-smdk2410.c文件 [[email protected] linux-2.6.14.7]# gedit arch/arm/mach-s3c2410/mach-smdk2410.c 5.在include/asm-arm/arch-s3c2410/目录下创建smdk2410.h文件 [[email protected] linux-2.6.14.7]# gedit include/asm-arm/arch-s3c2410/smdk2410.h 6.设置Flash分区 要编辑3个文件:devs.c、mach-smdk2410.c、s3c2410.c。 [[email protected] linux-2.6.14.7]# gedit arch/arm/mach-s3c2410/devs.c [[email protected] linux-2.6.14.7]# gedit arch/arm/mach-s3c2410/mach-smdk2410.c [[email protected] linux-2.6.14.7]# gedit drivers/mtd/nand/s3c2410.c 将               chip->eccmode           = NAND_ECC_SOFT; 改为               chip->eccmode           = NAND_ECC_NONE; 7.配置内核 [[email protected] linux-2.6.14.7]# gedit fs/Kconfig [[email protected] linux-2.6.14.7]# cp arch/arm/configs/smdk2410_defconfig .config [[email protected] linux-2.6.14.7]# make smdk2410_defconfig [[email protected] linux-2.6.14.7]# make menuconfig 8.编译内核,创建uImage,将uImage复制到tftp服务器的根目录(/tftpboot/) [[email protected] linux-2.6.14.7]# make [[email protected] linux-2.6.14.7]# cp arch/arm/boot/compressed/vmlinux ../u-boot-1.1.4/tools/ [[email protected] linux-2.6.14.7]# cd ../u-boot-1.1.4/tools/ [[email protected] tools]# ./mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008000 -n linux-2.6.14.7 -d vmlinux uImage [[email protected] tools]# cp uImage  ../ [[email protected] tools]# cp initrd.img  ../ [[email protected] tools]# cp uImage /tftpboot/ [[email protected] tools]# cp initrd.img /tftpboot/ [[email protected] tools]# cp ../u-boot.bin /tftpboot/ [[email protected] tools]# cp initrd.img /tmp/nfs/ [[email protected] tools]# iptables -F [[email protected] tools]# cd .. 9.执行skyeye1.2.6,通过u-boot-1.1.4引导linux-2.6.14.7 [[email protected] 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. arch: arm       //省略部分信息; *** Warning - bad CRC, using default environment In:    serial Out:   serial Err:   serial Hit any key to stop autoboot:  0 OK2410 #setenv bootargs noinitrd mem=64M root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200 OK2410 # tftp 0x31000000 uImage OK2410 # bootm 31000000 ## Booting image at 31000000 ... //此时应该进行第三步,根文件系统的移植;   三、根文件系统的移植   linux启动后第一个必须挂载的是根文件系统,若不能挂载根文件系统,则系统会出错自动退出;   根文件系统移植的过程: 移植根文件系统所需文件:busybox-1.13.4.tar.bz2 1.解压busybox-1.13.4.tar.bz2 [[email protected] Desktop]# tar -xjvf busybox-1.13.4.tar.bz2 -C ./ 2.编辑Makefile文件 [[email protected] busybox-1.13.4]# gedit Makefile 将 CROSS_COMPILE ?= 改为 CROSS_COMPILE ?=/usr/local/arm/3.4.1/bin/arm-linux- 将 ARCH ?= $(SUBARCH) 改为 ARCH ?= arm 3.进行默认配置 [[email protected] busybox-1.13.4]# make defconfig       //恢复默认配置 4.对配置信息进行修改 [[email protected] busybox-1.13.4]# make menuconfig 5.编译 [[email protected] busybox-1.13.4]# make 6.对配置信息进行修改 1)在/tmp/nfs中创建所需的目录 [[email protected] nfs]# mkdir -p bin sbin lib/modules etc/init.d dev usr/bin usr/sbin usr/lib proc sys  home root boot mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp var/lib var/lock var/log var/run var/tmp tmp 注意:其中bin、dev、etc、lib、proc、sbin、sys、usr是必备的8个目录。 [[email protected] nfs]# chmod 1777 tmp [[email protected] nfs]# chmod 1777 var/tmp [[email protected] dev]# mknod -m 600 console c 5 1 [[email protected] dev]# mknod -m 666 null c 1 3 (2)复制文件到/tmp/nfs中 [[email protected] _install]# cp -a bin /tmp/nfs/ [[email protected] _install]# cp -a sbin /tmp/nfs/ [[email protected] _install]# cp -a linuxrc /tmp/nfs/ [[email protected] _install]# cd .. [[email protected] busybox-1.13.4]# cp -a examples/bootfloppy/etc/* /tmp/nfs/etc/ 7.创建配置文件 (1)编写etc/inittab文件、修改其权限 [[email protected] nfs]# gedit etc/inittab [[email protected] nfs]# chmod 755 etc/inittab (2)编写etc/init.d/rcS文件、修改其权限 [[email protected] nfs]# gedit etc/init.d/rcS [[email protected] nfs]# chmod 755 etc/init.d/rcS (3)编写etc/fstab文件、修改其权限 [[email protected] nfs]# gedit etc/fstab [[email protected] nfs]# chmod 755 etc/fstab (4)编写etc/proflie文件、修改其权限 [[email protected] nfs]# gedit etc/proflie (5)创建密码文件、修改其权限 [[email protected] nfs]# cp /etc/passwd etc/ ;cp /etc/shadow etc/ ;cp /etc/group etc/ [[email protected] nfs]# chmod 600 etc/shadow [[email protected] nfs]# gedit etc/passwd [[email protected] nfs]# gedit etc/shadow (6)为mdev创建配置文件 [[email protected] nfs]# gedit etc/mdev.conf (7)删除备份文件 [[email protected] nfs]# rm etc/*~ etc/init.d/*~ 8.复制常用的库文件 编写脚本文件copy_lib.sh。 [[email protected] nfs]# gedit copy_lib.sh [[email protected] nfs]# chmod a+x copy_lib.sh [[email protected] nfs]# cp copy_lib.sh /usr/local/arm/3.4.1/arm-linux/lib/ [[email protected] nfs]# cd /usr/local/arm/3.4.1/arm-linux/lib/ [[email protected] lib]# ./copy_lib.sh [[email protected] lib]# cd -   完整的启动过程: 通过tftp将操作系统内核下载到开发板,内核引导时通过NFS挂载根文件系统。 (1)重启tftp服务器 [[email protected] Desktop]# service xinetd restart (2)编辑/etc/exports文件 [root@localhost Desktop]# gedit /etc/exports /tmp/nfs *(rw,sync,no_root_squash) (3)重启NFS服务器 [root@localhost u-boot-1.1.4]# service nfs restart [root@localhost u-boot-1.1.4]# exportfs [root@localhost u-boot-1.1.4]# exportfs -ra       //重新扫描配置文件 (4)完整的启动过程(u-boot、内核、文件系统、用户程序),使用NFS文件系统 [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. ***************************************************************** ……                     //省略部分信息; Hit any key to stop autoboot:  0 OK2410 # run bootcmd TFTP from server 10.0.0.1; our IP address is 10.0.0.110    //省略部分信息; Freeing init memory: 92K #mount all....... ******************************************************************                    OK 2410 Rootfs made by yql, 2011,06 ****************************************************************** 10.0.0.110 login: root login[25]: root login on 'console'  Processing /etc/profile... Set search library path in /etc/profile Set user path in /etc/profile Configure net done All Done [root@10 root]# 以上所述是通过tftp将操作系统内核下载到开发板,内核引导时通过NFS挂载根文件系统      ;另一种启动方式即将uImage烧写到nand flash上,烧写过程如下面所述的两种启动方式的第二种。 四、错误分析 BootLoader移植过程中: 1、在第2步中:     ①将 ifeq ($(ARCH),arm) CROSS_COMPILE = arm-linux- Endif 改为 ifeq ($(ARCH),arm) CROSS_COMPILE=/usr/local/arm/2.95.3/bin/arm-linux- Endif    因为这里交叉编译器指定为 CROSS_COMPILE=/usr/local/arm/2.95.3/bin/arm-linux- ,所以要安装arm-linux-gcc-2.95.3; 因为没有事先安装,所以在配置、编译u-boot时出错; linux内核的移植: 1、在第3步中:编辑Makefile文件 [root@localhost linux-2.6.14.7]# gedit Makefile 将 ARCH              ?= $(SUBARCH) CROSS_COMPILE       ?= 改为 ARCH              ?= arm CROSS_COMPILE       ?= /usr/local/arm/3.4.1/bin/arm-linux-       //linux2.6.14的交叉编译器为gcc-3.4.1 在改写过程中CROSS_COMPILE       ?= /usr/local/arm/3.4.1/bin/arm-linux- 注意交叉编译环境改写; 2、第10步中:配置内核    需要安装yaffs文件系统; 3、tftp服务器搭建的过程中:   [root@localhost Desktop]#chmod -R 755 /tftpbooot 4、启动时注意防火墙的设置;    五、启动的两种方式: 1、通过nfs    内核文件在宿主机上,开发板(skyeye)启动时,通过tftp将操作系统内核下载到开发板,内核引导时通过NFS挂载根文件系统      ,这种方法需要tftp和nfs服务器的支持,在开发的过程中这种方法是经常使用的。     上面所述的过程即是通过这种方式启动的; 2、通过nand flash,开发板自行启动 这种方法需要将内核文件烧写到开发板上,当然这需要在开发板上建立文件系统,建立文件系统的过程如298页创建的Cramfs文件系统。(其他的文件系统也可) 建立文件系统后,开始内核烧写: OK2410 # tftp 0x31000000 uImage OK2410 # nand erase 0x00100000 0x00300000 OK2410 # nand write 0x31000000 0x00100000 0x00300000 OK2410 # setenv bootcmd‘nand read 0x31000000 0x00100000 0x00300000;bootm 0x31000000’ OK2410 # saveenv 烧写到nand flash上后,再次启动skyeye时就会自行显示是在nand flash上启动,而不需要在从宿主机传送;

上一篇:在安卓中对应用进行单元测试
下一篇:基于asp.net + easyui框架,一步步学习easyui-datagrid——界面(一)

相关文章

相关评论