Chinaunix首页 | 论坛 | 博客
  • 博客访问: 369417
  • 博文数量: 159
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 182
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-02 10:42
文章分类

全部博文(159)

文章存档

2015年(18)

2014年(132)

2013年(9)

分类: 嵌入式

2014-05-23 08:54:30

 09计应1班   段彦青  0906041001

      

 嵌入式系统移植基础三部曲

 

操作系统centos 5.6

 

准备工作:安装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/

 

 注意:用skyeye-1.2.8_rc1进行实验时,安装时会出现错误,建议用skyeye-1.2.6_rc1

 

以下主要介绍实验过程中出错的地方及应该注意的地方:

第一步引导加载程序Bootloader的移植

准备工作:

1)创建交叉编译环境

下载arm-linux-gcc-2.95.3.tar.bz2arm-linux-gcc-3.4.1.tar.bz2和arm-linux-tools-4.2.1-20070808.tar.gz

解压到/usr/local/arm中

注意:如果未创建交叉编译环境,后边实验过程中会提示错误

 

2)Bootloader:u-boot-1.1.4.tar.bz2

 

注意:下边的一移植过程一定要注意路径问题

 

1. 配置好u-boot-1.1.4 ,编译

[root@localhost u-boot-1.1.4]# make ok2410_config

[root@localhost u-boot-1.1.4]# make

 

2. 配置过程中找不到skyeye.conf文件,应在网上下载,复制到u-boot-1.1.4目录下

 

3.执行skyeye1.2.6

[root@localhost u-boot-1.1.4]# skyeye1.2.6

 

4. 移植完nand flash ,测试u-boot是否可以从nand flash 启动

执行以下命令

[root@localhost u-boot-1.1.4]# skyeye1.2.6

[root@localhost u-boot-1.1.4]# mknandflashdump u-boot.bin nand.dump 0

提示:mknandflashdump:command not found

下载  mknandflashdump.c 文件并编译:

[root@localhost u-boot-1.1.4]# gcc mknandflashdump.c -o mknandflashdump

然后再执行

[root@localhost u-boot-1.1.4]# ./mknandflashdump u-boot.bin nand.dump 0

 

第二步、Linux内核的移植

内核:linux-2.6.14.7

 

1.编辑Makefile文件

ARCH              ?= $(SUBARCH)

CROSS_COMPILE       ?=

改为

ARCH              ?= arm

CROSS_COMPILE       ?= /usr/local/arm/3.4.1/bin/arm-linux-

 

注意:此处/usr/local/arm/3.4.1/bin/arm-linux- 后边无空格,如果多了空格,后边会出现错误

 

2.设置flash 分区

编辑devs.c文件,内容如下:

 

/*nand */

#include

#include

#include

/* NAND Controller */

/************************ 建立Nand Flash分区表 ************************/

/* 一个Nand Flash总共64MB, 按如下大小进行分区 */

/*

name:代表分区名字

size:代表Flash分区大小(单位:字节)

offset:代表Flash分区的起始地址(相对于0x0的偏移)

*/

static struct mtd_partition partition_info[] =

{

    { /* 1MB */

        name: "bootloader",

        size: 0x00100000,

        offset: 0x0,

    },

    { /* 3MB */

        name: "kernel",

        size: 0x00300000,

        offset: 0x00100000,

    },

    { /* 40MB */

        name: "root",

        size: 0x02800000,

        offset: 0x00400000,

    },

    { /* 20MB */

        name: "user",

        size: 0x00f00000,

        offset: 0x02d00000,

    }

};

/************************ 加入Nand Flash分区 ************************/

/*

注意:此处应注意每个分区的起始地址及大小,这些代码必须复制到头文件下边,不然运行时会出错

 

3.配置内核,出现如下情况

执行#make menuconfig命令配置时,选项中没有<*> YAFFS2 file system support,原因是没有建立YAFFS2根文件系统。

先安装busybox ,建立根文件系统,系统根目录为/tmp/nfs。

下载yaffs2.tar.gz,编辑并配置内核,然后执行

[root@localhost linux-2.6.14.7]# cd ../u-boot-1.1.4/tools/

[root@localhost tools]# ./mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008000 -n linux-2.6.14.7 -d vmlinux uImage

 

此步是用mkimage 工具将vmlinux 制作成U-boot可以引导的linux内核映像uImage

 

4.搭建TFTP服务器TFTF服务器用于将uImage 下载到开发板内存

将uImage 复制到tftp服务器根目录下(/tftp), 这样可以通过tftp协议将其下载到开发板上。

 

权限需注意:

  [root@localhost Desktop]#chmod -R 755 /tftpbooot

 

5.执行skyeye1.2.6,通过u-boot-1.1.4 引导linux-2.6.14.7

 

[root@localhost u-boot-1.1.4]# skyeye1.2.6

.

.

OK2410 # printenv

bootargs=noinitrd root=/dev/nfs rw nfsroot=10.0.0.1:/tmp/nfs ip=10.0.0.110:10.0.0.1:10.0.0.1:255.255.255.0 init=linuxrc console=ttySAC0,115200  mem=64M

bootcmd=tftp 0x31000000 uImage;bootm 0x31000000        //要记住该环境变量,后面的实例中会用到

bootdelay=3

baudrate=115200

ipaddr=10.0.0.110

serverip=10.0.0.1

netmask=255.255.255.0

stdin=serial

stdout=serial

stderr=serial

ethaddr=08:00:3E:26:0A:5B

 

Environment size: 341/65532 bytes

OK2410 #

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 ...

   Image Name:   linux-2.6.14.7

中间内容略去

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

 

此处为硬伤,继续下边的步骤

 

三、根文件系统的移植

1.编写etc/proflie文件、修改其权限

[root@localhost nfs]# gedit etc/proflie

文件内容如下

 

# /etc/profile: system-wide .profile file for the Bourne shells

echo

echo -n "Processing /etc/profile... "

# no-op

# Set search library path

echo "Set search library path in /etc/profile"

export LD_LIBRARY_PATH=/lib:/usr/lib

 

# Set user path

echo "Set user path in /etc/profile"

export PATH=/bin:/sbin:/usr/bin:/usr/sbin        #设置命令搜索路径

export HISTSIZE=100

export PS1='[\u@\h \W]\$ '

alias ll='ls -l'

 

#/sbin/ifconfig eth0 192.168.1.22 netmask 255.255.255.0

/sbin/ifconfig lo 127.0.0.1

echo "Configure net done"

ll Done"

echo "A

Echo

 

将以下2行复制到profile中可以改变命令提示符为[root@ dyq/root]

export PS1='[\u@\h \W]\$ '

alias ll='ls -l'

 

2.创建密码,修改其权限

 

[root@localhost nfs]# cp /etc/passwd etc/ ;cp /etc/shadow etc/ ;cp /etc/group etc/

[root@localhost nfs]# chmod 600 etc/shadow

[root@localhost nfs]# gedit etc/passwd

内容是:root:x:0:0:root:/root:/bin/sh

[root@localhost nfs]# gedit etc/shadow

内容是:root:$1$zs2zr2N4$15U99ll5tUm3DwOvKnCVV1:14335:0:99999:7:::

[root@localhost nfs]# gedit etc/group

内容是:root:x:0:root

 

注意:一定要将最后的bash改为sh

注意如果不要密码,把/etc/passwd 第一行的X去掉即可

至此,一个基本的根文件系统(通过nfs挂载)构建完成

 

3.完整的启动过程(u-boot、内核、文件系统)

 

注意:在嵌入式系统开发的过程中,一般的做法是通过tftp将操作系统内核下载到开发板,内核引导时通过NFS挂载根文件系统

 

OK2410#run bootcmd

login:root

[root@dyq /root]# printenv

内容省略

测试:

[root@dyq /root]# ./test

===== main =====

Hello world!

argv[0]=./test

==== exit main ====

[root@dyq /root]# ./test as sdfasdf asdfasf

===== main =====

Hello world!

argv[0]=./test

argv[1]=as

argv[2]=sdfasdf

argv[3]=asdfasf

==== exit main ====

 

测试成功,即用skyeye模拟的一个嵌入式开发环境已经建立成功了。

 

NFS与MTD两种方法的对比

1.通过NFS服务器挂载根文件系统

在u-boot启动skyeye1.2.6,通过TFTP服务器将uImage下载到开发板上,用NFS将其挂载在开发板上,开始启动内核;

       这种方法需要搭建TFTPNFS服务器,在开发的过程中这种方法是经常使用的

2.将uImage 烧写到 nand flash中

这种方法将uImage烧写到开发板上,需要建立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 启动内核



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




阅读(457) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~