制作 ARM 版 linux
一、 修改顶层 Makefile ,确定内核要移植到的目标架构及使用的交叉编译器。
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
二、 修改平台的输入时钟频率为 12M 。
arch/arm/mach-s3c2440/mach-smdk2440.c 文件,在函数 static void __init smdk2440_map_io(void) 中,修改成 s3c24xx_init_clocks(12000000) 。
三、 修改 Nand flash 分区信息,使其与 bootloader 对 Flash 的分区设置保持一致
arch/arm/plat-s3c24xx/common-smdk.c 文件
static struct mtd_partition smdk_default_nand_part[] =
{
[0] = {
.name = "supervivi",
.offset = 0x00000000,
.size = 0x00040000,
},
[1] = {
.name = "kernel",
.offset = 0x00060000,
.size = 0x00200000,
},
[2] = {
.name = "root",
.offset = 0x00260000,
.size = 0x3fd80000,
}
};
四、 修改 mach_type 。 Bootloader 传递的 mach_type 需要与内核中的某个 mach_type 匹配
方法一: 修改 bootloader 传递给内核的启动参数
方法二: arch/arm/tools/mach-types 文件中,
s3c2440 ARCH_S3C2440 S3C2440 362
修改为:
s3c2440 ARCH_S3C2440 S3C2440 1999
其中 1999 为 supervivi 默认的 mach_type ,也是 mini2440 的 mach_type ,发生冲突,但只要不加入 mini2440 的配置就不会出问题
五、 给内核打上 yaffs2 文件系统的补丁
六、 配置内核,主要是添加对 s3c2440 、 yaffs2 文件系统的支持
七、 make zImage 编译内核得到 zImage 文件
制作根文件系统
一、 建立 bin 、 linuxrc 、 sbin 、 usr 目录
通过安装 Busybox 来建立这些目录
( 1 )修改 Busybox 根目录下的 Makefile
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
( 2 )执行“ make menuconfig ”后退出
( 3 )执行“ make” 编译 Busybox
( 4 )执行“ make CONFIG_PREFIX=/work/rootfs install ”,将 Busybox 安装在 rootfs 目录下
此时在 rootfs 目录下建立了 bin 、 linuxrc 、 sbin 、 usr 目录
二、 建立 lib 目录 ( 程序运行所需要的动态链接库的目录 )
mkdir /work/rootfs/lib
cp -rfd /work/root_qtopia/lib/* /work/rootfs/lib/
此时在 rootfs 目录下建立了 lib 目录
三、 建立 etc 目录
mkdir rootfs/etc
( 1 )建立 etc/inittab
gedit etc/inittab ,内容为:
# /etc/inittab
::sysinit:/etc/init.d/rcS
s3c2410_serial0::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a –r( 2 )建立 etc/init.d/rcS
mkdir init.d
gedit rcS ,内容为:
#!/bin/sh
ifconfig eth0 192.168.1.17
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s另外,还要改变它的属性使它能够执行。
chmod +x etc/init.d/rcS(3)建立etc/fstab文件
gedit fstab ,内容为:
#device mount-point type options dump fack order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0(4)构建其他必要的目录,但它们可以是空的
mkdir proc mnt tmp sys root
(5)另外,mdev(udev的简化版)是通过init进程来启动的,在使用mdev构造/dev目录之前,init进程至少要用到设备文件/dev/console、/dev/null,所以必须先建立这两个设备文件:
mkdir rootfs/dev
# mknod -m 660 dev/console c 5 1
# mknod -m 660 dev/null c 1 3至此,生成的目录和文件为: bin 、 linuxrc 、 sbin 、 usr 、 lib 、 etc 、 proc 、 mnt 、 tmp 、 sys 、 root
此时的 rootfs 就是一个非常小的根文件系统。开发板可以将它作为网络根文件系统直接启动,或者制作成文件系统映像文件存储到 Flash 中。