DATE:2011-9-13
目标:
熟练u-boot、linux系统、文件系统的优化裁剪;精通系统移植;精通linux系统、文件系统、uboot原理等。
第一天,尝试在AT91SAM9260 上进行linux系统移植,以前移植系统总希望所有的东西都是自己打造的,所以,移植时总时从0开始进行定制。由于自身知识、经验的不足,导致在mini2440上的移植直到现在都没有成功。严重影响了学习的积极性以及进度,所以,从今天起要改变学习的方法,从简入手,先从最简单的开始。
今天,利用系统自带的u-boot、linux内核映像,自己定制jffs2文件系统,学习文件系统的定制方法。
按照厂家提供的方法,如下:
SecureCRT ssh 到 ubuntu。
cd /home/works
cp newmsg/tools/arm-2007-01-21.iso ./
mkdir tmp
chmod 777 tmp
mount -o loop mount –o loop arm-2007-01-21.iso ./tmp/
cd tmp
./install –d ../eldk41gcc40
vi ~/.bashrc
最后一行添加以下路径,
export PATH=$PATH:/home/newmsg/works/tools/eldk41gcc40/usr/bin
重新登录,使环境变量生效:
exit
sudo su
查看交叉编译工具版本,测试路径是否正确,如下:
arm-linux-gcc –v
本篇根文件系统使用 busybox 制作,busybox 以小巧著称,适合于嵌入式设备的linux 文件系统,下面是详细的制作过程:
SecureCRT ssh 到 ubuntu,切换到 root。
1>准备源码
cd /home/newmsg/works
tar –xzvf busybox-1.15.3.tar.gz
cd busybox-1.15.3
make clean distclean
make menuconfig 对busybox进行配置,去掉不需要的项目,最后生成.config文件。
2>交叉编译
make ARCH=arm CROSS_COMPILE=arm-linux- install
1>创建根文件系统基本架构
cd /home/newmsg/works/nfsroot
mkdir root usr mnt proc tmp var opt etc dev lib sys
cp -a ../busybox-1.15.3/_install/* ./
2>添加必要的库文件
将arm-linux-gcc的库文件全部拷贝到lib目录里,例如我的arm-linux-gcc的安装路径为:/opt/arm_linux_gcc/usr/bin/arm-linux-gcc 则执行如下命令:
cp -a /opt/arm_linux_gcc/arm/lib/* ./lib/
3>添加必要设备文件
mknod ./dev/console c 5 1
mknod ./dev/null c 1 3
mknod ./dev/zero c 1 5
说明:如果在配置了busybox中的mdev选项,这些节点系统会自动生成,但是如果文件系统创建前如果不显式的创建这些节点,系统启动时会报如下警告:
Warning: unable to open an initial console.
**原因:**mdev 是通过 init 进程来启动的,在使用 mdev 构造 /dev 目录之前,init 至少要用到设备文件/dev/console、 /dev/null ,所以需要事先建立这两个设备文件。
注意:
本来console的主次设备号应为5和1。但是因为init在执行完/etc/init.d/rcS脚本后,就会在一个控制台上,按照inittab的指示开一个shell(或者是开getty+login,这样用户就会看到提示输入用户名的提示符)。
在mdev -s未执行之前,/dev目录下只有我们创建的/dev/null和/dev/console,也就是说,没有控制台可供init用来按照inittab 的指示开一个shell。
4>添加基本配置文件
cd etc
mkdir init.d
touch inittab init.d/rcS profile fstab
vi inittab
添加以下内容(以下内容的原理和详细解释会在威步出品的同系列的手册中找到,查看《手册使用介绍》即可找到相应手册) :
::sysinit:/etc/init.d/rcS
ttyS0::respawn:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/bin/umount -a –r
vi profile
添加以下内容:
PATH=/bin:/sbin
PS1='[\u@\h: \W]\$ '
说明:试验中发现,如果配置busybox时没有配置
Busybox Settings --->
Busybox Library Tuning --->
[*] Username completion
[*] Fancy shell prompts
上面两项,文件系统是不会正确识别PS1这个环境变量的参数的。
vi fstab
添加以下内容:
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
vi init.d/rcS
添加以下内容:
/bin/mount -n -t proc /proc proc
/bin/mount -n -o remount,rw /
/bin/mount -av
/bin/hostname NewMsg
/bin/mount -t tmpfs mdev /dev
mkdir /dev/pts
/bin/mount -t devpts devpts /dev/pts
echo /sbin/mdev>/proc/sys/kernel/hotplug
/sbin/mdev –s
给 rcS 脚本可执行权限:
chmod 777 init.d/rcS
以上几步,基本的根文件系统已经构建完成,接下来就是制作文件系统镜像。
cd /home/newmsg/works
制作成 jffs2 格式镜像:
针对 64M 的 nand flash 用户:
mkfs.jffs2 –r ./nfsroot –o rootfs.jffs2 –e 0x4000 –n –p
针对 128M 的 nand flash 用户:
mkfs.jffs2 –r ./nfsroot –o rootfs.jffs2 –e 0x20000 –n -p
本试验为128M的nand flash 。
1>进入uboot,先设置以下参数:
setenv bootargs console=ttyS0,57600 root=/dev/nfs nfsroot=192.168.0.154:/home/nfsroot ip=192.168.0.219:192.168.0.154:192.168.0.1:255.255.255.0:::eth0:off
setenv ipaddr 192.168.0.219
setenv serverip 192.168.0.*
setenv gatewayip 192.168.0.1
注:上面的serverip指是服务器的ip,可自己设置, 一般在自己本机上运行tftp32.exe 即可当作一个ftp服务器, 并把内核文件(uImage_v1.*)放在tftp32.exe所在的目录, 并将内核文件的名字都改为uImage.
2>烧写内核文件
内核文件放在服务器的Kernel目录下,其中有各个版本,详见版本信息 在uboot中执行以下命令,( 直接粘贴即可 )
tftp 0x22000000 uImagenand erase 0xa0000nand write 0x22000000 0xa0000 0x200000
3>烧写文件系统
tftp 0x20000000 rootfs_128.jffs2
nand erase 0x400000
nand write 0x20000000 0x400000 0xxxxxxxxx
烧写完毕重新启动即可。
经过一天的忙碌,终于取得了以上成就,但是,还有很多疑问需要处理:
1> uboot 命令,烧写位置是根据什么确定的?
2> mkfs.jffs2 工具的使用方法
3> busybox各个选项的意义
4> nfs文件系统的搭建,如何通过nfs登陆服务器进行开发,系统烧写
5> yaffs2文件系统的移植,烧写
6> linux系统移植
7> u-boot的修改
8> mdev
9> 嵌入式linux系统 登录密码 账号 管理