关于uboot和kernel的一些理解

Posted foggia2004

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于uboot和kernel的一些理解相关的知识,希望对你有一定的参考价值。

经过多次的修改和实验,终于能够在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的理解就越深刻,我自己就失败了很多次,遇到过各种各样的问题,每次查找资料解决后,都会将过程记录在文本文件中,我觉得这是一个很好的学习方式.加油吧!!!

以上是关于关于uboot和kernel的一些理解的主要内容,如果未能解决你的问题,请参考以下文章

请问android uboot 和 little kernel是啥关系?

[uboot] uboot启动kernel篇——bootm跳转到kernel的流程

uboot和kernel波特率不同...

[RK3288][Android6.0] 关于uboot中logo相关知识点小结

嵌入式 hi3518c裸板uboot烧写kernel烧写fs烧写小结

如何将uboot里面的参数传给recovery或kernel