SEP4020中RAMDISK的加载
文档修订记录
版本 | 时间 | 修订者 | 修订内容 |
1.0 | 2010-4-26 | 沈立 | 创建文档 |
2.0 | 2010-4-27 | 沈立 | 指导:刘伟民 修改一些具体细节 添加RAMDISK制作意义 |
一、 文件系统制作
1. 用BusyBox制作简易的根文件目录系统
Ø 创建根文件系统目录:新建文件夹并命名为fs
cd /home/project
mkdir /home/project/fs
cd fs
Ø 利用shell脚本在fs文件夹下创建根文件系统目录
n 在fs文件夹下创建一个名为mkrootfsdir.sh的shell脚本文件,复制以下内容到文件中。
#!/bin/sh
echo "Makeing rootfs_dir"
mkdir rootfs
cd rootfs
echo "Makeing dir:bin dev etc lib proc sbin sys usr"
mkdir bin dev etc lib proc sbin sys usr
mkdir usr/bin usr/lib usr/sbin lib/modules
echo "Makeing initial console"
mknod dev/console c 5 1
mknod dev/null c 1 3
echo "Makeing dir:mnt tmp var"
mkdir mnt tmp var
chmod 777 tmp
mkdir mnt/cramfs mnt/yaffs mnt/nfs
echo "Makeing dir:home root boot"
mkdir home root boot
echo "Done"
n 保存该脚本文件并运行
[root@localhost fs]# source mkrootfsdir.sh
n 进入rootfs目录查看所创建的文件夹
[root@localhost rootfs]# ls
bin boot dev etc home lib mnt proc root sbin sys tmp usr var
Ø 复制/dev目录下的设备节点到/home/project/fs/rootfs/dev 中
[root@localhost ~]# cp -dpR /dev /home/project/fs/rootfs/
2. 交叉编译busybox工具
Ø 将busybox-1.15.3.tar.bz2解压并进行menuconfig配置
n [root@localhost fs]# tar -jxvf busybox-1.15.3.tar.bz2
n [root@localhost fs]# cd busybox-1.15.3
n [root@localhost busybox-1.15.3]# make menuconfig
Ø 默认编译interface.c文件时会报错,需要做如下调整:
n coreutils/fsync不选
n miscellaneous/ionice不选
n Linux System Utilities/mkfs_vfat不选
Ø 修改busybox-1.15.3/networking/interface.c文件,添加:
n #define ARPHRD_INFINIBAND 32 /* InfiniBand */
Ø 修改好后进行编译命令如下
n [root@localhost busybox-1.15.3]#make ARCH=arm
n CROSS_COMPILE=arm-linux-
n CONFIG_PREFIX=/home/project/fs/rootfs/ all
n Install
正确指令:make ARCH=arm CROSS_COMPILE=arm-linux- CONFIG_PREFIX=/home/project/fs/rootfs/all install
Ø 复制常用的arm的lib库到rootfs 中(脚本实现)
#!/bin/sh
cd /usr/local/arm/3.4.1/arm-linux/lib
for file in libc libcrypt libdl libm libpthread libresolv libutil
do
cp $file-*.so /home/project/fs/rootfs/lib/
cp -d $file.so.[*0-9] /home/project/fs//rootfs/lib/
done
cp -d ld*.so* /home/project/fs/rootfs/lib/
Ø 建立系统配置文件
n 将busybox-1.15.3/examples/bootfloppy/etc 文件夹中的4 个文件复制到/home/project/fs/rootfs/etc下
n 修改inittab
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::restart:/sbin/init
tty2::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff
n 修改fstab
none /proc proc defaults 0 0
none /dev/pts devpts mode=0622 0 0
tmpfs /dev/shm tmpfs defaults 0 0
Ø 根文件目录系统制作完成,所得简单文件系统rootfs
二、 制作RAMDISK形式的文件镜像及其内核镜像
1. 创建RAMDISK格式文件系统目录initrd
Ø 将rootfs目录下所有内容拷贝到initrd目录
#mkdir initrd
#dd if=/dev/zero of=initrd.img bs=1k count=4096 //确定大小(4M)
#/sbin/mke2fs -F -v -m0 initrd.img
#mount -o loop initrd.img initrd
#cp -av /home/project/fs/rootfs/* initrd
#umount initrd
#gzip -9 initrd.img
在当前目录下得到一个名为initrd.img.gz的ramdisk的文件系统镜像(压缩)。
Ø 如上操作所得
n initrd.img(RAMDISK镜像)大小为先前设定的4M
n initrd.img.gz大小为880K左右
2. 4020内核镜像制作
Ø 内核编译时要选上相应的内核选项来支持
n 在device driver->block device中选中中间四个
DEFAULT RAM DISK SIZE (KBYTES)值要比实际RAMDISK(解压后)大或者一致。注: initrd.img为4M,则此处必须大于或者等于4M。
n 进入file system中,选中ext2文件系统的支持
Ø 将上面所得的initrd.img.gz放到内核包顶级目录下
内核编译所用交叉编译工具GCC-3.4.1
Ø #make bootpImage INITRD_PHYS=0x31000000 INITRD=./initrd.img.gz PARAMS_PHYS=0x30000100,(arch/arm/boot下)
n zImage文件可直接用于启动内核
n bootpimage文件用于与RAMDISK合并其中
n 命令解析:INITRD_PHYS是文件系统的起始物理地址,PARAMS_PHYS是uboot存放启动参数列表的地方。这两个必须要,因为在/arch/arm/boot/bootp/init.s中会用到这两个参数。
Ø [root@localhost linux-v3.3]#mkimage -n "Kernel 2.6.16" -A arm -O linux -T kernel -C none -a 30007fc0 -e 30008000 -d ./arch/arm/boot/bootpImage vmlinux.img。这样生成的vmlinux.img就是一个uImage镜像
三、 内核及RAMDISK的烧写
1. 在不与内核镜像合并烧写的情况下
Ø 传内核镜像
SEP4020=>tftp 31000000 zImage //zImage镜像启动地址
SEP4020=>nand erase 0x00100000 0x00200000
SEP4020=>nand write 0x31000000 0x00100000 0x00200000
SEP4020=>set bootcmd nand read 0x30008000 0x00100000 0x00200000/;bootm 0x30008000
SEP4020=>saveenv
SEP4020=>reset
Ø 传文件系统
SEP4020=>tftp 31000000 initrd.img.gz
SEP4020=>nand erase 0x600000 0x1e00000
SEP4020=>nand write 0x31000000 0x600000 0x1e00000
SEP4020=>set bootargs root=/dev/ram0 rw console=ttyS0,115200 initrd=0x31000000,10mb mem=32mb //此处必须大于实际的RAMDISK 文件大小
SEP4020=>saveenv
SEP4020=>reset
注:分开烧写未进行验证,具体烧写位置参考有关4020手册
2. 合并情况下的烧写
SEP4020=>set bootargs root=/dev/ram0 rw console=ttyS0,115200 initrd=0x31000000,10mb mem=32mb
SEP4020=>save
SEP4020=>reset
SEP4020=> tftp 30007fc0 vmlinux.img;bootm 30007fc0
3. 至此SEP4020的RAMDISK加载结束(启动效果图)
四、 制作过程中的问题及制作意义
1. 新制作的文件系统不能超过UBOOT设定的initrd的范围。
2. 注意文件系统中/etc下的inittab文件,同时/dev下console的节点也要设置好,不然会出现警告。
创建节点:Rootfs /dev
mknod -m 660 console c 5 1
mknod -m 660 null c 1 3
3. 文件系统中库文件也要加载完全,不然会出现#重叠。
4. 制作RAMDISK形式的文件系统的意义
Ø Ramdisk是将一部分固定大小的内存(RAM)当作分区来使用。它并非一个实际的文件系统,而是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统。将一些经常被访问而又不会更改的文件(如只读的根文件系统)通过Ramdisk放在内存中,可以明显地提高系统的性能。但缺点也很明显:不具有永久性、断电后无法保存、大小不可更改、浪费ram等。
Ø 在内核缺少网络支持不能使用NFS的情况下方便驱动及程序调试:将镜像放至ROOFS相应目录下做成RAMDISK镜像,待RAMDISK文件系统加载后作驱动或应用程序的的调试。