嵌入式系统移植基础三部曲 段彦青
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.bz2、arm-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将其挂载在开发板上,开始启动内核;
这种方法需要搭建TFTP和NFS服务器,在开发的过程中这种方法是经常使用的
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