经过多次的修改和实验,终于能够在mini2440开发板上进行各种uboot和kernel的挂载实验了,在此期间学习到了很多知识,也理解了一些知识
1->分区
uboot和kernel的分区表要一致
uboot分区位置:include/configs/mini2440.h
#define MTDIDS_DEFAULT "nand0=nandflash0" #define MTDPARTS_DEFAULT "mtdparts=nandflash0:256k(bootloader)," "128k(params)," "5m(kernel)," "-(root)"
kernel分区位置:arch/arm/mach-s3c2440/mach-mini2440.c
static struct mtd_partition friendly_arm_default_nand_part[] = { [0] = { .name = "supervivi", .size = 0x00040000, /* 256k */ .offset = 0, }, [1] = { .name = "param", .offset = 0x00040000, .size = 0x00020000, /* 128k */ }, [2] = { .name = "Kernel", .offset = 0x00060000, /* 512k */ .size = 0x00500000, }, [3] = { .name = "root", .offset = 0x00560000, .size = 1024 * 1024 * 1024, // }, [4] = { .name = "nand", .offset = 0x00000000, .size = 1024 * 1024 * 1024, // } };
uboot和kernel的分区size一定要相吻合(当然可以随意设置,只要相符即可),不然,在starting kernel时会导致启动不了的错误.
2->内核参数的偏移量
#define CONFIG_ENV_OFFSET 0X60000 /* uboot参数偏移 */ #define CONFIG_ENV_SIZE 0x20000 /* 大小128k,Total Size of Environment Sector */
这个地方很容易被忽略掉,如果此处的设置与uboot以及kernel的分区不一致,也会导致内核启动不了(多数是参数被uboot或kernel覆盖了),一定要注意!!!
3->nfs服务
服务端:防火墙关闭<service iptables stop>,重新绑定rpc服务<service rpcbind restart>,mount nfs服务,最后重启nfs<service nfs restart>
客户端:<mount -t nfs -o nolock 服务端地址:/服务端目录 /开发板挂载目录>
kernel:make menuconfig时要选中开发板支持nfs client
4->nfs挂载kernel和rootfs
将uboot烧写好后,直接用<nfs 30008000 服务端ip:/uImage服务端目录>挂载内核,然后<bootm>启动;启动成功后,可以用nand命令将内核写入到nand中;也可以通过修改bootargs参数来自动挂载根文件系统;参数设置如下:<setenv bootargs "noinitrd console=ttySAC0,115200 init=/init root=/dev/nfs rw nfsroot=服务端ip:rootfs目录 ip=开发板ip:服务端ip:网关:掩码::eth0:off">
5->kernel的入口和装载地址
大家知道可以使用<mkimage -n ‘mini2440‘ -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage uImage>来制作uImage(因为uboot只能识别用mkimage制作好的内核镜像,只因为该镜像头部多了64字节的内核信息),网上流传了很多关于mini2440的入口地址和装载地址的区别,但貌似我没遇到过这样的问题,直接在30008000装载30008040地址的内核镜像,所以流传归流传,正确与否还是要依靠自己去多多做实验,否则就只能是镜中花水中月.
6->小结
调试uboot和kernel不可能一次就成功,失败的越多,那么你就距离成功越近,对arm-linux的理解就越深刻,我自己就失败了很多次,遇到过各种各样的问题,每次查找资料解决后,都会将过程记录在文本文件中,我觉得这是一个很好的学习方式.加油吧!!!