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

时间: 2024-10-28 10:41:36

关于uboot和kernel的一些理解的相关文章

嵌入式 uboot引导kernel,kernel引导fs【转】

转自:http://www.cnblogs.com/lidabo/p/5383934.html#3639633 1.uboot引导kernel: u-boot中有个bootm命令,它可以引导内存中的应用程序映像(Kernel),bootm命令对应 common/cmd_bootm.c中的do_bootm()函数,此函数实现下面几个功能: 1)读flash中的内核映像文件 2)解压内核 3)校验内核 4)跳到内核执行(调用do_bootm_linux()函数) { 1.Stage1 start.S

uboot向kernel的传参机制——bootm与tags

最近阅读代码学习了uboot boot kernel的过程以及uboot如何传参给kernel,记录下来,与大家共享: U-boot版本:2014.4 Kernel版本:3.4.55 一 uboot 如何启动 kernel 1 do_bootm uboot下使用bootm命令启动内核镜像文件uImage,uImage是在zImage头添加了64字节的镜像信息供uboot解析使用,具体这64字节头的内容,我们在分析bootm命令的时候就会一一说到,那直接来看bootm命令. 在common/cmd

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

一.bootm说明 bootm这个命令用于启动一个操作系统映像.它会从映像文件的头部取得一些信息,这些信息包括:映像文件的基于的cpu架构.其操作系统类型.映像的类型.压缩方式.映像文件在内存中的加载地址.映像文件运行的入口地址.映像文件名等. 紧接着bootm将映像加载到指定的地址,如果需要的话,还会解压映像并传递必要有参数给内核,最后跳到入口地址进入内核. 这里的描述参考(http://blog.chinaunix.net/uid-20799298-id-99666.html) 需要打开的宏

嵌入式系统烧写uboot/bootloader/kernel的一般方法

本文介绍了在嵌入式系统中烧写uboot/bootloader/kernel 的一般方法,以及如果uboot或者内核出现错误,  www.2cto.com 引导失败等情况时如何重新烧写uboot/kernel. 烧写uboot/kernel的方式一般有两种,一种是在linux本身(shell中),直接将uboot/kernel的影像文件(二进制文件)使用操作烧写flash的命令烧写到flash特定分区上, 另一种是在uboot界面上,通过配置serverip,ipaddr,使用tftp命令下载ub

3、将uboot,kernel,rootfs下载到开发板上

将uboot,kernel,rootfs下载到开发板上 1.为什么要下载 所谓下载,也称烧录,部署. 1.1.什么是u-boot Hi3518EV200 单板的 Bootloader 采用 U-boot. u-boot是一种普遍用于嵌入式系统中的Bootloader,Bootloader是在操作系统运行之前执行的一小段程序,通过它,我们可以初始化硬件设备.建立内存空间的映射表,从而建立适当的软硬件环境,为最终调用操作系统内核做好准备.Boot Loader的主要运行任务就是将内核映象从硬盘上读到

嵌入式开发软件环境:uboot、kernel、rootfs、data布局分析

uboot+linux的整体方案 开发板的datasheet中都有详细的地址空间的划分,其中比较重要的两块是:DDR地址空间和Flash地址空间.DDR空间是系统和应用的运行空间,一般由linux系统自身进行使用和管理:Flash空间是系统和应用载体的存放空间,一般需要在使用前进行划分,由应用开发者进行管理. 简单的示例和说明. 其中,Flash的整体地址空间为:0x34000000~0x34FFFFFF,共16MB,使用的是Nor Flash芯片.布局需要做的工作是: 确定uboot二进制文件

嵌入式 hi3518c平台网卡模式MII与RMII模式在Uboot和kernel中切换小结

由于公司项目的需要,我们需要在原有的MII的基础上,修改为RMII模式,针对hi3518c平台,我的网卡是LAN8701需要修改的地方有如下几个: 首先我的uboot中env是: bootargs=mem=64M console=ttyAMA0,115200 root=/dev/mtdblock4 rootfstype=jffs2 mtdparts=hi_sfc:256k(boot)ro,128k(env),128k(config),3072k(kernel),11264k(rootfs)boo

u-boot、kernel源码获取

在嵌入式开发中,linux操作系统已经是主流了,但是在开发初期需要移植u-boot和linux内核等. 下面是linxu和u-boot源码的获取方式: 一.u-boot源码: 1.通过ftp服务器 ftp://ftp.denx.de/pub/u-boot/ 2.需要安装git,windows和linux操作系统都可以. git clone git://www.denx.de/git/u-boot.git 二.linux内核源码: git clone git://git.kernel.org/pu

u-boot、kernel、root系统烧写和挂载命令命令

一.uboot 环境变量: 1. 打印环境变量:# print 2. 设置启动参数# set bootargs noinitrd init=/linuxrc console=ttySAC0,115200 root=/dev/nfs nfsroot=192.168.1.103:/work/nfs_root/1.20_fs ip=192.168.1.105:192.168.1.103:192.168.1.1:255.255.255.0::eth0:off# set bootargs console=