linux2.6.18.3内核移植及问题解决

来源:互联网 发布:java long转timestamp 编辑:程序博客网 时间:2024/05/16 09:00

 

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         //选择支持内核浮点模拟

这样问题就解决了.........

 

原创粉丝点击