一, 下载安装交叉编译环境
1)下载安装交叉编译器 ,将其解压到根目录下 :
# tar jxvf arm-linux-gcc-4.3.2.tgz -C /
2)修改主用户目录 .bashrc 文件,将交叉编译器的路径添加到环境变量PATH,在.bashrc添加 :
export PATH=$PATH:/usr/local/arm/4.3.2/bin
这样下次电脑启动后直接就可以在shell中使用交叉开发工具了,但目前环境变量还没有生效,使用命令
#source .bashrc
之后输入
#arm-linux-gcc -v
可以查看交叉环境是否成功建立。
二、准备源码包
1)Linux 2.6.30.4的下载地址:
2)yaffs2文件系统的下载地址:
点击Download GNU tarball,下载cvs-root.tar.gz
请把linux-2.6.30.4.tar.bz2和cvs- root.tar.gz放在同一目录内!
三、移植内核
1)解压内核源码包
# tar jxvf linux-2.6.30.4.tar.bz2
2)进入内核目录
# cd linux-2.6.30.4
3)修改顶层Makefile
# gedit Makefile
在 193行
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
修改为
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
4)修改机器码
# gedit arch/arm/tools/mach-types
在379行
s3c2440 ARCH_S3C2440 S3C2440 362
修改为
s3c2440 ARCH_S3C2440 S3C2440 1999
与 supervivi 传入的机器码参数一致即可!(注意此时的机器码不同的机器可能不一样,它对应于所使用的 vivi 源码中的include/platform/smdk2440.h文件中的MACH_TYPE,我的是1999)
5)修改时钟频率
# gedit arch/arm/mach-s3c2440/mach-smdk2440.c
在160行
static void __init smdk2440_map_io(void) { s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc)); //s3c24xx_init_clocks(16934400); //注释这句,加入下一句 s3c24xx_init_clocks(12000000); s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs)); } |
6)修改Nand Flash分区
首先将开发板从nor flash启动,输入q进入supervivi命令行界面,输入
part show
以查看Nand Flash的分区情况,根据分区情况修改comman-smdk.c文件
比如我的分区情况为
name : offset size flag
--------------------------------------------------------------------------
vivi : 0x00000000 0x00040000 0
param : 0x00040000 0x00020000 0
kernel : 0x00060000 0x00500000 0
root : 0x00560000 0x3fa80000 0
# gedit arch/arm/plat-s3c24xx/common-smdk.c
在109行
static struct mtd_partition smdk_default_nand_part[] = { [0] = { .name = "vivi", .size = 0x00040000, .offset = 0x00000000, }, [1] = { .name = "param", .offset = 0x00040000, .size = 0x00020000, }, [2] = { .name = "kernel", .offset = 0x00060000, .size = 0x00500000, }, [3] = { .name = "root", .offset = 0x00560000, .size = 0x3fa80000, }
};
|
四、配置内核
# cp arch/arm/configs/s3c2410_defconfig .config
# make menuconfig
机 器类型只选以下三项:
System Type ---> S3C2410 Machines ---> [*] SMDK2410/A9M2410 S3C2440 Machines ---> [*] SMDK2440 [*] SMDK2440 with S3C2440 CPU module |
内核特性加上以下两项:
Kernel Features ---> [*] Use the ARM EABI to compile the kernel [*] Allow old ABI binaries to run with this(EXPERIMENTA) kernel |
如果你想 了解每个配置选项的意义,请点击:
五、编译内核
# make zImage
六、下载、烧写内核镜像
先使用友善之臂公司提供的yaffs2根文件系统镜像做测试,可以运行到这里:
FAT: unable to read boot sector VFS: Cannot open root device "mtdblock2" or unknown-block(31,2) Please append a correct "root=" boot option; here are the available partitions: 1f00 192 mtdblock0 (driver?) 1f01 2048 mtdblock1 (driver?) 1f02 63152 mtdblock2 (driver?) Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,2) [<c002c700>] (unwind_backtrace+0x0/0xdc) from [<c02a7d2c>] (panic+0x40/0x110) [<c02a7d2c>] (panic+0x40/0x110) from [<c0008fcc>] (mount_block_root+0x1d0/0x210) [<c0008fcc>] (mount_block_root+0x1d0/0x210) from [<c0009264>] (prepare_namespac) [<c0009264>] (prepare_namespace+0x164/0x1bc) from [<c0008598>] (kernel_init+0xb) [<c0008598>] (kernel_init+0xb4/0xe0) from [<c004812c>] (do_exit+0x0/0x578) [<c004812c>] (do_exit+0x0/0x578) from [<00000001>] (0x1) |
七、加入对yaffs2文件系统的支持
1) 回到上级目录
# cd ..
2)解 压yaffs2文件系统源码包
# tar zxvf cvs-root.tar.gz
3)进入yaffs2源码目录
# cd cvs/yaffs2
4)打补丁
# ./patch-ker.sh c ../../linux-2.6.30.4
Updating ../../linux-2.6.30.4/fs/Kconfig
Updating ../../linux-2.6.30.4/fs/Makefile
5) 回到内核目录
# cd ../../linux-2.6.30.4
6) 重新配置
# make menuconfig
选 上以下一项:
File systems ---> [*] Miscellaneous filesystems ---> <*> YAFFS2 file system support
|
7)重新编译内核
# make zImage
八、移植文件系统到开发板
1) 编译Busybox
从下载busybox-1.15.tar.bz2 ,解压后进入busybox 目录,执行
#make menuconfig
在编译/链接选项中使用静态链接:
Buld Options ---->
[*] Build Busybox as a static binary (no shared libs)
然后修改Makefile文件:
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
保存后,执行
# make CONFIG_PREFIX={yourdir} install
其中yourdir为你选择的busybox安装目录,编译成功后busybox就安装到yourdir目录中了。
2) 构建根文件系统
构建etc目录
在busybox 的安装目录中rootfs中创建etc文件夹(这里假设busybox被安装到rootfs文件夹),在etc目录下新建inittab文件,内容如下
# /etc/inittab
::sysinit:/etc/init.d/rcS
ttySAC0::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
在etc目录创建文件夹init.d,然后在init.d文件夹中新建一个脚本文件rcS ,添加内容
#! /bin/sh
mount -a
这个脚本是内核启动后希望执行的动作,此脚本由/bin/sh解析,你看添加自己希望启动的程序,另外还有给此脚本添加可执行属性:
chmod +x rcS
在etc目录下创建fstab文件,添加如下内容:
# device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
返回busybox的安装目录rootfs,创建dev目录,并静态创建设备文件
# cd dev
# sudo mknod console c 5 1
# sudo mknod null c 1 3
# sudo mknod ttySAC0 c 204 64
# sudo mknod mtdblock0 b 31 0
# sudo mknod mtdblock1 b 31 1
# sudo mknod mtdblock2 b 31 2
构建其它目录
mkdir proc mnt tmp sys root返回rootfs的上层目录,然后使用 mkyaffs2image-128M 生成文件系统镜像
# mkyaffs2image rootfs rootfs.img
将此rootfs.img 烧写到开发板的即可在串口控制终端进入linux的命令行界面。