Chinaunix首页 | 论坛 | 博客
  • 博客访问: 202963
  • 博文数量: 71
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-11 22:28
个人简介

一个懒惰的文艺工程师!

文章分类

全部博文(71)

文章存档

2015年(1)

2014年(7)

2013年(63)

我的朋友

分类: LINUX

2014-12-29 19:05:24

原文地址:内核和文件系统移植 作者:genehang

一, 下载安装交叉编译环境
 
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的命令行界面。
阅读(1516) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~