Bootloader(vivi)修改
由于linux-2.6的内核编译出来常常大于1M ,而ARM2410开发板默认的kernel分区只有832K,所以要重新对flash进行分区,并修改vivi中flash分区信息,然后重新编译烧写。
原 NAND Flash分区:
名称
地址空间
存储空间
vivi
0x00000000----0x00020000
128K
Param
0x00020000----0x00030000
64K
Kernel
0x00030000----0x00100000
832K
Root
0x00100000----0x00300000
2M
jffs2
0x00300000----0x04000000
61M
修改为:
名称
地址空间
存储空间
vivi
0x00000000----0x00020000
128K
Param
0x00020000----0x00030000
64K
Kernel
0x00030000----0x00300000
2M+832K
Root
0x00300000----0x00600000
3M
jffs2
0x00600000----0x04000000
58M
要达到此目的,需要修改arch/s3c2410/smdk.c文件中的default_mtd_partitions[]。修改后的内容为:
mtd_partition_t default_mtd_partitions[] = {
{
name: "vivi",
offset: 0,
size: 0x00020000,
//vivi size 128k
flag: 0
}, {
name: "param",
offset: 0x00020000,
size: 0x00010000,
//param size 64k
flag: 0
}, {
name: "kernel",
offset: 0x00030000,
size: 0x002d0000,
//kernel size 2m+832k
flag: 0
}, {
name: "root",
offset: 0x00300000,
size: 0x00300000,
//root size 3m
flag: MF_BONFS
}, {
name: "jffs2",
offset: 0x00600000,
size: 0x04000000,
//user size 58m
flag: MF_JFFS2
}
};
将此文件中的linux_cmd[ ]改为
char linux_cmd[] = "noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0";
noinitrd:不使用initrd文件
root=/dev/mtdblock3:代表nand flash的第4个分区,作为rootfs
init=/linuxrc:启动初始化文件位置
console=ttySAC0:控制台使用串口1
配置交叉编译vivi ,用arm-linux-gcc4.1交叉编译工具编译不能通过,用2.95版本可以编译,在vivi目录下生成vivi程序。
#make distclean
#make menuconfig
#make
内核修改编译
交叉编译器arm-linux-gcc (4.1.0)
1.修改MTD分区信息
修改linux-2.6.18.3/arch/arm/mach-s3c2410/common-smdk.c 文件中的分区信息,必须与开发板上的flash分区信息一致。
/* NAND parititon from 2.4.18-swl5 */
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "vivi",
.size = SZ_128K,
.offset = 0,
},
[1] = {
.name = "param",
.offset = SZ_128K,
.size = SZ_64K,
},
[2] = {
.name = "kernel",
.offset = SZ_128K + SZ_64K,
.size = SZ_2M + SZ_64K * 13,
},
[3] = {
.name = "root",
.offset = SZ_1M * 3,
.size = SZ_1M * 3,
},
[4] = {
.name = "jffs2",
.offset = SZ_1M * 6,
.size = SZ_1M * 58,
},
/*
[5] = {
.name = "S3C2410 flash partition 5",
.offset = SZ_1M * 14,
.size = SZ_1M * 10,
},
[6] = {
.name = "S3C2410 flash partition 6",
.offset = SZ_1M * 24,
.size = SZ_1M * 24,
},
[7] = {
.name = "S3C2410 flash partition 7",
.offset = SZ_1M * 48,
.size = SZ_16M,
}
*/
};
2.去掉nand flash 的ECC
打开drivers/mtd/nand/s3c2410.c
搜索关键字NAND_ECC_SOFT,在s3c2410_nand_init_chip函数里
修改NAND_ECC_SOFT为NAND_ECC_NONE
3.支持启动时挂载devfs
打开fs/ Kconfig文件
找到menu “Pseudo filesystem”
在其中添加:
config DEVFS_FS
bool “/dev file system support (OBSOLETE)”
default y
config DEVFS_MOUNT
bool “Automatically mount at boot”
default y
depends on DEVFS_FS
注意:bool default 与 depends前面是Table键
4.修改Makefile文件
ARCH ?=arm
CROSS_COMPILE ?=arm-linux-
注意:要将arm-linux-gcc所在文件夹的路径添加到PATH环境变量中,或者直接使用绝对路径。
5.配置内核产生.config文件
为简化配置内核文件的复杂度,先复制到arch/arm/configs/smdk2410_defconfig到内核根目录下。
#cp arch/arm/configs/smdk2410_defconfig .config
#make menuconfig
smdk2410_defconfig是内核源码中提供的一个s3c2410平台的配置信息,基本上是可以直接用的,也可以在这个配置的基础上加上自己需要的配置。
内核配置:
Boot options
Default kernel command string
改成:
noinitrd root=/dev/mtdblock3 init=/linuxrcconsole=ttySAC0,115200
FileSystems 里面要支持jffs2 和 cramfs 文件系统。
其他的选项可以根据自己的要求进行增减。
6.编译内核
#make zImage
文件系统制作
1. 编译busybox-1.6.0
交叉编译器:arm-linux-gcc (4.1.1)
修改Makefile
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
#make defconfig
#make xconfig
Build Options
[*]Build BusyBox as a static binary
//选此项静态编译。
Miscellaneous Utilities
[]taskset //选了就会出错
[*]Don’t use /usr //这项也要选中
#make
#make install
在 busybox-1.5.1/_install/目录生成需要的 bin sbin usr 目录及相关文件。
2.创建根文件系统必要的目录,编写相关的配置文件
#mkdir myrootfs
以myrootfs为目标根文件系统的根目录
#cd myrootfs
#mkdir dev etc home lib mnt proc sbin sys tmp root usr
#mkdir etc/init.d
#touch linuxrc
将编译busybox生成的usr sbin bin三个目录拷贝到myrootfs下
编写myrootfs目录下的linuxrc 脚本
#!/bin/sh
echo "mount /etc as ramfs"
/bin/mount -n -t ramfs ramfs /etc
/bin/cp -a /mnt/etc/* /etc/
echo "re-create the /etc/mtab entries"
/bin/mount -f -t cramfs -o remount,ro /dev/mtdblock/3 /
/bin/mount -f -t ramfs ramfs /etc
/bin/cp -a /mnt/etc/* /etc/
exec /sbin/init
#chmod 775 linuxrc
进入etc目录,编辑inittab 文件
#cd etc
#vi inittab
::sysinit:/etc/init.d/rcS
::askfirst:/bin/sh
tty2::askfirst:-/bin/sh
tty3::askfirst:-/bin/sh
tty4::askfirst:-/bin/sh
tty0::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/init
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
编辑 fstab 文件
#vi fstab
devpts /dev/pts devpts mode=620 0 0
tmpfs /dev/shm tmpfs defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
进入etc/init.d目录,编辑rcS 脚本
#cd init.d
#vi rcS
echo "mount tmpfs /dev"
/bin/mount -t tmpfs mdev /dev
echo "mount devpts /dev/pts"
/bin/mkdir /dev/shm
/bin/mkdir /dev/pts
/bin/mount -t devpts devpts /dev/pts
echo "mount sysfs /sys"
/bin/mount -t sysfs sysfs /sys
echo /bin/mdev > /proc/sys/kernel/hotplug
echo "mdev -s"
/bin/mdev -s
echo "yaffs is mounted"
/bin/mount -t yaffs /dev/mtdblock/4 /mnt/yaffs
/bin/mount -a
#chmod 775 rcS
在dev 下建立console 和 null设备节点
# mknod console c 5 1
#mknod null c 1 3
#chmod 660 console
#chmod 660 null
将PC机系统中etc目录下的 passwd shadow group profile hosts services 等配置文件拷贝到myrootfs的etc目录下,将etc目录拷贝到mnt目录下,在mnt目录下建立yaffs目录
3.生成cramfs 文件
#mkcramfs myrootfs root.cramfs
以上文章转载于:http://hi.baidu.com/victor_tlh/blog/item/8aaadaee89ea0effb2fb95ae.html
但是,我依据他的做法,烧写到flash后,无法启动,出现了Freeing init memory: 96K就卡住了,移植以为是文件系统有问题.....后来参考网上资料,发现在内核编译时要选择
Floating point emulation------->
[*]NWFPE math emulation //选择支持内核浮点模拟
这样问题就解决了.........