Chinaunix首页 | 论坛 | 博客
  • 博客访问: 917918
  • 博文数量: 84
  • 博客积分: 4334
  • 博客等级: 上校
  • 技术积分: 1610
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-27 07:49
文章分类

全部博文(84)

文章存档

2012年(5)

2011年(21)

2010年(58)

分类: 嵌入式

2010-11-05 18:28:54

目前为止最新的稳定内核是linux-2.6.36.趁着成功移植了u-boot之际,趁热打铁地移植了内核.
移植步骤:
1.下载解压内核修改Makefile使之编译成ARM平台

#tar xjvf linux-2.6.36.tar.bz2
#cd linux-2.6.36
#gedit Makefile


2.修改机器码以匹配u-boot,默认值为1008刚好和u-boot里的机器码一致.

#gedit arch/arm/tools/mach-types

smdk2440        MACH_SMDK2440        SMDK2440        1008

修改kernel的MACH_TYPE代码引用部分 ,确定kernel的MACH_TYPE.如下:

#gedit arch/arm/mach-s3c2440/mach-smdk2440.c   //修改文件最后面

//MACHINE_START(S3C2440, "SMDK2440")
改为:
MACHINE_START(SMDK2440, "SMDK2440")

3.修改系统平台时钟为12MHz(即:12000000)

#gedit arch/arm/mach-s3c2440/mach-smdk2440.c

static void __init smdk2440_map_io(void)
{
    s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
    s3c24xx_init_clocks(12000000);
    s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}


4. 修改Nand Flash分区。这里只创建三个分区,其他多余的分区屏蔽掉

#gedit arch/arm/plat-s3c24xx/common-smdk.c


/* NAND parititon from 2.4.18-swl5 */

static struct mtd_partition smdk_default_nand_part[] = {
    [0] = {
        .name    = "mxh_uboot",
        .size    = 0x60000,//大小对应与u-boot里的分区大小384k
        .offset    = 0,
    },
    [1] = {
        .name    = "mxh_kernel",
        .offset = 0x100000,
        .size    = 0x400000,//内核区间的大小给4M,起始地址为0x100000,结束地址为0x500000,那么0x60000-->0x100000这段哪里去了?在u-boot里60000-->80000是给param参数区了,我将80000-->100000这段空闲起来了
    },
    [2] = {
        .name    = "mxh_root_yaffs2",
        .offset = 0x500000,
        .size    = 0xfb00000,// nandflash的剩余大小为251M
    }
};


5. 配置内核选项
#make menuconfig

首先加载s3c24xx系列的通用配置,然后在此基础上修改

各配置选项如下。这里只列出了要修改的项,其他的默认

配置完后将配置文件保存为.config,这样方便下次make menuconfig时默认加载上次配置过的文件

6. 交叉编译内核

#make zImage

如果没有任何错误,编译出来的内核在arch/arm/boot/目录下,文件zImage即是。为了方便我们可以修改arch/arm/boot/下面的Makefile文件,在其58行加上"@cp -f arch/arm/boot/zImage zImage"

$(obj)/zImage:    $(obj)/compressed/vmlinux FORCE
    $(call if_changed,objcopy)
    
@cp -f arch/arm/boot/zImage zImage
    @echo ' Kernel: $@ is ready'


这样的话,每次编译都会在内核根目录下面生成zImage,对应在顶层的Makefile里面添加make clean部分删除zImage:rm zImage总共有3个地方:
(1).1136行

        -o -name '*.gcno' \) -type f -print | xargs rm -f rm zImage

(2).1162行

        -type f -print | xargs rm -f rm zImage

(3).1346行

        -o -name '*.gcno' \) -type f -print | xargs rm -f rm zImage


7. u-boot支持uImage,不直接支持zImage,因此还要将zImage转换成uImage格式:

经过编译后的u-boot在根目录下的tools目录中,会有个叫做mkimage的工具,他可以给zImage添加一个header,也就是说使得通常我们编译的内核zImage添加一个数据头信息部分,我们把添加头后的image通常叫uImageuImage是可以被u-boot直接引导的内核镜像。

mkimage工具的使用介绍如下:

使用: 中括号括起来的是可选的

mkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image

选项:
-A
set architecture to 'arch'       //用于指定CPU类型,比如ARM
-O
set operating system to 'os'     //用于指定操作系统,比如Linux
-T
set image type to 'type'         //用于指定image类型,比如Kernel
-C
set compression type 'comp'      //指定压缩类型
-a
set load address to 'addr' (hex) //指定image的载入地址
-e
set entry point to 'ep' (hex)    //内核的入口地址,一般为image的载入地址+0x40(信息头的大小)
-n
set image name to 'name'         //image在头结构中的命名
-d
use image data from 'datafile'   //无头信息的image文件名
-x
set XIP (execute in place)       //设置执行位置

先将u-boot下的tools中的mkimage复制到主机的/usr/local/bin目录下,这样就可以在主机的任何目录下使用该工具了。现在我们进入kernel生成目录(一般是arch/arm/boot目录),然后执行如下命令,就会在该目录下生成一个uImage.img的镜像文件,把他复制到tftp目录下,这就是我们所说的uImage

mkimage -'linux-2.6.36' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage uImage

为了方便我们可以把上面这句写成一个脚本叫做mkkernel.sh,并给它加上可执行权限

#vi mkkernel.sh

mkimage -n 'linux-2.6.36' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage uImage

#chmod +x mkkernel.sh


8. 下载uImage运行

由于还没有移植文件系统,所以出现最下面的乱码,However,内核是被引导了的!
阅读(3845) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~