制作YAFFS2文件系统
如果开发板只有Nand Flash,那么选择最合适的文件系统为YAFFS文件系统。mini2440 只有 Nand Flash 没有 Nor Flash,因此选择的文件系统为 YAFFS2 文件系统。
1.制作文件系统时准备的源代码
关于内核源代码和交叉编译器,读者可以根据自己的实际情况选择具体的对应版本, yaffs2.tar.gz 源码是必需的。
2.解压源码
解压内核源码和交叉编译器的源码,并将 yaffs2.tar.gz 复制到内核源码的 fs 目录下进行解压。如果是第一次使用交叉编译器,那么应该在环境变量中添加交叉编译器的路径或者在/etc/profile 中添加交叉编译器路径,并重新启动计算机。文件/etc/profile 中的交叉编译 器的设置,例如:
# Path manipulation
if [ "$EUID" = "0" ]; then
pathmunge /sbin
pathmunge /usr/sbin
pathmunge /usr/local/sbin
pathmunge /usr/local/arm/4.3.2/bin
fi
3.修改内核顶层Makefile
在 Makefile 中设置目标平台为 arm,交叉编译器为 arm-linux。
# vi Makefile
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
修改为
ARCH ?=arm
CROSS_COMPILE ?=arm-linux-
4.修改机器码
在 vivi 启动时如果机器码与设置的不一致会出现提示,在文件 arch/arm/tools/mach-types
中进行下面的修改。
# vi arch/arm/tools/mach-types
s3c2440 ARCH_S3C2440 S3C2440 362
修改为
s3c2440 ARCH_S3C2440 S3C2440 782
5.修改时钟频率
修改 arch/arm/mach-s3c2440/mach-smdk2440.c 中的时钟为 12MHz,具体修改如下:
static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
//s3c24xx_init_clocks(16934400);
s3c24xx_init_clocks(12000000);//将频率设置为 12MHz
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}
6.使内核支持YAFFS2
解压 yaffs2.tar.gz 后进入 YAFFS2 目录,在 YAFFS2 目录下有可执行文件 patch-ker.sh,
执行如下命令:
# ./patch-ker.sh c /usr/local/arm/linux-2.6.29.6
执行该命令后,就会在 fs 的 Kconfig 和 Makefile 中增加对 YAFFS2 的编译选项的支持。
在 fs/Kconfig 会自动添加:
# Patched by YAFFS
source "fs/yaffs2/Kconfig"
在 fs/Makefile 中会自动添加:
# Patched by YAFFS
obj-$(CONFIG_YAFFS_FS) += yaffs2/
注意:这两部分内容也可以进行手动添加。添加的目的是在内核的文件系统选项中增加 对 YAFFS2 的支持选项。
回到内核的一级目录下运行 make menuconfig,对内核进行配置,配置中多了对 YAFFS2 文件系统支持的选项。进入内核配置界面后,依次选择命令 File systems ---> Miscellaneous filesystems --->,进入 Miscellaneous filesystems 配置窗口,选择对 YAFFS2 文件系统的支持
7.使内核支持Mini2440
在内核的 System Type-->ARM system type 选项下,选择 Samsung S3C24xx 系列。如果读者的开发板不是 mini2440,那么就应该选择对应的处理器类型。然后 在 S3C2440 Machines 中选择 Mini2440 支持选项。
8.编译内核映像文件
执行 make zImage 生成内核的映像文件,如果遇到下面的错误可以执行 make distclean 进行清理,然后重新生成映像文件。
# make distclean
# make zImage
9.编译Busybox
编译 Busybox 的配置细节可以参考制作 《Ramdisk 文件系统》。这里可以将 Busybox 交叉编译安装在 _install 文件中,
在/usr/local 目录下新建 yaffs_root 文件夹,将 Busybox 的安装目录_install 中的文件 bin、linuxrc、sbin、usr 复制到 yaffs_root 目录下。
# mkdir /usr/local/yaffs_root
# cd /usr/local/busybox-1.21.1/_install
# cp –rf bin linuxrc sbin usr /usr/local/yaffs_root
10.为YAFFS文件系统准备lib库
将交叉编译器目录下的库文件全部复制到 lib 库目录下,-d 表示复制的时候包括链接 文件一起复制过来。
#cp -d /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/lib/*so* ./lib
11.制作etc目录下必要的文件
etc 目录是文件系统中最重要的目录,系统配置的启动信息都在该目录下,下面分别给出必要的几个文件。
(1)/etc/inittab 文件。
::sysinit:/etc/init.d/rcS #调用系统初始化文件
s3c2410_serial0::askfirst:-/bin/sh #文件 drivers/serial/s3c2410.c 中指定了串口驱动名字 s3c2410_serial
::ctrlaltdel:/sbin/reboot #重启
::shutdown:/bin/umount -a -r #关机
该文件为 init 进程的配置文件。
(2)etc/init.d/rcS 文件。
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mkdir -p /var/lock
/bin/hostname -F /etc/sysconfig/HOSTNAME
该文件为可执行文件,完成后还要修改其权限为可执行。该文件功能包括指定环境变量、运行级别和挂载设备等。
(3)etc/profile 文件。
USER="`id -un`"
LOGNAME=$USER
PS1='[Yaffs_LiuG]# '
PATH=$PATH
HOSTNAME='/bin/hostname'
export USER LOGNAME PS1 PATH
如果不配置 profile,移植完文件系统后,进入系统命令行头为空,效果如下:
# ls
bin home lost+found proc sys var
dev lib mnt root tmp
etc linuxrc opt sbin usr
配置 profile 文件后,其效果如下:
]# ls
bin home lost+found proc sys var
dev lib mnt root tmp
etc linuxrc opt sbin usr
(4)etc/sysconfig/HOSTNAME 文件。
Yaffs@LiuG #指定 HOSTNAME,rcS 中调用该文件
(5)etc/fstab 文件。
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
var /dev tmpfs defaults 0 0
该文件指明需要挂载的文件系统。
12.制作YAFFS映像文件
解压制作文件系统工具 mkyaffs2image.tar,解压后该工具自动安装在目录 usr/sbin/下。 使用 mkyaffs2image 将上面制作的文件系统制作成映像文件。
# tar xvf mkyaffs2image.tar
# mkyaffs2image yaffs_root yaffs_root.img
本文摘自《linux系统移植(第2版)》