内核无法正常启动,我的实验是在基于NANDflash的uboot基础上进行的,利用nfs服务器,使用#tftp 31000000 uImage下载内核镜像到内存中运行。
提供以下解决办法供参考:
Linux的机器码一定要与bootloader的机器码一致,否则会出现内核启动不了。
1、在u-boot和kernel中都会有一个机器码(即:MACH_TYPE),只有这两个机器码一致时才能引导内核。
2、uboot机器码路径:arch/arm/include/asm/mach-types.h
第375行
#define MACH_TYPE_S3C2440 362
板子初始化时指定的MACH-TYPE路径
board/samsung/smdk2440/smdk2440.c
第126行
gd->bd->bi_arch_number = MACH_TYPE_S3C2440;
gd->bd->bi_boot_params = 0x30000100;
3、内核机器码路径
arch/arm/tools/mach-types
第379行
s3c2440 ARCH_S3C2440 S3C2440 362
内核启动时指定的MACH-TYPE路径
arch/arm/mach-s3c2440/mach-smdk2440.c
第331行
MACHINE_START(S3C2440, "SMDK2440")
按照此步骤进行查看,看是否是机器码不匹配,如果不匹配进行相应的修改。还应特别注意的是,在移植过程中有些文件时直接复制过来,虽然按照这种方法验证了不存在问题,但可能问题还是不能解决,有可能是被编译的文件是基于该文件修改过的。
譬如:我按照上面的办法验证,没有问题,但是还是不能启动内核,仔细查看之后,发现被编译的是由mach-smdk2440.c直接copy过去的mach-mini2440.c文件,而该文件中机器码对应的是MACH_TYPE_MINI2440。因此,进入uboot目录,修改了gd->bd->bi_arch_number = MACH_TYPE_MINI2440,(MACH_TYPE_MINI2440对应1999,这个和内核机器码匹配)。再重新编译了uboot,利用norflash中vivi,下载到nandflash中,启动后下载内核到内存,能正常运行了。
这个问题困扰我很多天,一开始无从下手,以为是uboot不能传递参数,或者是编译错误、串口驱动没有配置,所以走了很多弯路,网上的很多资料对我帮助很大,很是感谢。尤其是CSDN的转角遇到嵌入式http://blog.csdn.net/IT_114/archive/2011/03.aspx。