由于Linux2.6.34.2对S3C64xx有了一定的支持,所以采用Linux2.6.34.2版本的内核。
一、 移植环境
主机:VMWare--Fedora 8
开发板:天嵌TQ6410—256M nandflash,Kernel:2.6.34.2
编译器:EABI-4.3.2_V0.1
u-boot:u-boot-2010.08
二、 源码获得
三、 移植步骤:
1.将Linux2.6.34.2内核源码放到工作目录文件夹下,并解压。
#tar xzvf linux2.6.34.2.tar.gz –c /
#pwd
/
# cd linux2.6.34.2
2.修改内核源码根目录下的Makefile文件(CROSS_COMPILE =的值因个人情况而定,其他可以照做,蓝色部分为修改部分。)
#gedit Makefile
......
#SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
# -e s/arm.*/arm/ -e s/sa110/arm/ \
# -e s/s390x/s390/ -e s/parisc64/parisc/ \
# -e s/ppc.*/powerpc/ -e s/mips.*/mips/ )
......
#ARCH ?= $(SUBARCH)
#CROSS_COMPILE ?=
ARCH = arm
CROSS_COMPILE = /usr/local/arm/usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-
3. 对于平台时钟的修改,可以查看内核顶层目录下的arch/arm/mach-s3c64xx/mach-smdk6410.c在smdk6410_mapio()函数中有声明为12000000,而开发板上的外部时钟也是12M所以不用修改。
4. 修改机器码,可以看到在arch/arm/mach-s3c64xx/mach-smdk6410.c中MACHINE_START(SMDK6410,”SMDK6410”)是在uboot引导内核时需要对应的机器码。所以在arch/arm/tools/mach-types文件中找到这个SMDK6410对应的机器码并改为888(uboot中是这样设置的)。
4. 配置内核,由于开始对s3c6410的内核支持结构不是很了解,所以可以采用默认配置内核。(arch/arm/configs/目录下是一般内核的默认配置)
#pwd
#/linux2.6.34.2
#cp –f arch/arm/configs/s3c6400_defconfig .config
可以使用make menuconfig对刚刚配置的内核根据具体的情况进行修改,开始我没有进行修改直接make zImage,最后在arch/arm/boot/目录下生成zImage镜像文件。
5.使用mkimage命令打包zImage并烧写到开发板上。
#mkimage –n ‘linux-2.6.34.2’ -A arm -O linux -C none -a 0xc0008000 -e 0xc0008000 -d zImage uImage
可以看到内核停在Starting kernel ...不能解压内核。
打印信息如下:
Booting image at c0008000 ...Image Name: Linux-2.6.34.2 Created: 2010-08-10 0:13:40 UTC Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 1650092 Bytes = 1.6 MB Load Address: c0008000
Entry Point: c0008000 Verifying Checksum ... OK Starting kernel ...
后来经过对比天嵌原来开发板上的内核是没有上面的打印信息的,在网上查找原因得知是内核引导指令的问题。原来:生成zImage的内核镜像文件可以通过UBOOT提供的go命令,通过mkimage命令,在zImage中加入头文件(镜像头长0x40,真正的内核入口向后偏移了0x40大小),生成uImage镜像文件,该文件就是执行bootm所需的内核镜像文件。以前uboot引导内核都是用bootm指令,这次用的go指令,所以才会出错。看来学习还是要深究啊。
直接烧写zImage系统引导内核成功了。可是对于内核的系统分区还没有添加,内核最后打印信息为: Memory: 126516k/126516k available, 4556k reserved, 0K highmemVirtual kernel memory layout: vector: 0xffff0000 - 0xffff1000 ( 4 kB) fixmap: 0xfff00000 - 0xfffe0000 ( 896 kB) DMA : 0xffc00000 - 0xffe00000 ( 2 MB) vmalloc : 0xc8800000 - 0xe0000000 ( 376 MB) lowmem: 0xc0000000 - 0xc8000000 ( 128 MB) modules : 0xbf000000 - 0xc0000000 (16 MB) .init : 0xc0008000 - 0xc0024000 ( 112 kB) .text : 0xc0024000 - 0xc0300000 (2928 kB) .data : 0xc0300000 - 0xc0324920 ( 147 kB)Please append a correct "root=" boot option; here are the available partitions:Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)Backtrace: [<c0028ab0>] (dump_backtrace+0x0/0x114) from [<c0228780>] (dump_stack+0x18/0x1c) r7:c7c11000 r6:00000000 r5:c0021a08 r4:c0325230[<c0228768>] (dump_stack+0x0/0x1c) from [<c02287d0>] (panic+0x4c/0xc0)[<c0228784>] (panic+0x0/0xc0) from [<c0008fd0>] (mount_block_root+0x1e0/0x220) r3:00000000 r2:00000000 r1:c7c27f60 r0:c02c5f65[<c0008df0>] (mount_block_root+0x0/0x220) from [<c00090d4>] (mount_root+0xc4/0xfc)[<c0009010>] (mount_root+0x0/0xfc) from [<c000927c>] (prepare_namespace+0x170/0x1c8) r5:c0021a08 r4:c0324b60[<c000910c>] (prepare_namespace+0x0/0x1c8) from [<c00084ec>] (kernel_init+0x110/0x14c) r5:00000000 r4:c0324920[<c00083dc>] (kernel_init+0x0/0x14c) from [<c0042fa4>] (do_exit+0x0/0x5a8) r5:00000000 r4:00000000继续努力啊,添加分区