nand read.jffs2 0x30007FC0 kernel;

从NAND读出内核:从哪读,从kernel分区

放到哪去   -0x30007FC0

nand read.jffs2 0x30007FC0   0x00200000      0x00060000

device nand0 <nandflash0>, # parts = 4

#: name                        size            offset          mask_flags  0: bootloader          0x00040000      0x00000000      0

1: params              0x00020000      0x00040000      0

2: kernel              0x00200000      0x00060000      0

3: root                0x0fda0000      0x00260000      0

active partition: nand0,0 - (bootloader) 0x00040000 @ 0x00000000

defaults: mtdids  : nand0=nandflash0

mtdparts: mtdparts=nandflash0:256k@0(bootloader),128k(params),2m(kernel),-(root)

.jffs2 方便不用块对齐

bootm 0x30007FC0

flash内的内核,uimage 头部(64k) + 内核 0x30007FC0 是为了使内核的加载地址刚好为0x30008000 节省时间不必再把内核移动到加载地址

(1)根据头部移动内核到加载地址

(2)启动内核do_bootm_linux

   1、u_boot告诉内核一些参数,设置启动阐述

  2、跳到入口地址启动内核

setup_start_tag (bd);
setup_memory_tags (bd_t *bd)
setup_commandline_tag (bd_t *bd, char *commandline)
setup_end_tag (bd_t *bd)

struct tag {

struct tag_header hdr;

union {

 struct tag_core  core;

struct tag_mem32 mem;

struct tag_videotext videotext;

struct tag_ramdisk ramdisk;

struct tag_initrd initrd;

struct tag_serialnr serialnr;

struct tag_revision revision;

struct tag_videolfb videolfb;

struct tag_cmdline cmdline;

/*    * Acorn specific    */   struct tag_acorn acorn;

/*    * DC21285 specific    */   struct tag_memclk memclk;

} u;

struct tag_header {

u32 size;

u32 tag;

};

static void setup_start_tag (bd_t *bd)

{  params = (struct tag *) bd->bi_boot_params; ·  //开始开始存放地址

params->hdr.tag = ATAG_CORE;             //0x54410001

params->hdr.size = tag_size (tag_core);      //tag + size + core >>2 单位为4个字节

params->u.core.flags = 0;

params->u.core.pagesize = 0;

params->u.core.rootdev = 0;

params = tag_next (params);      //指向下一个tag

}

static void setup_memory_tags (bd_t *bd)

{

int i;

for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++)

{            //CONFIG_NR_DRAM_BANKS    1

  params->hdr.tag = ATAG_MEM;     //0x54410002

   params->hdr.size = tag_size (tag_mem32);      //

   params->u.mem.start = bd->bi_dram[i].start;     //0x30000000

   params->u.mem.size = bd->bi_dram[i].size;      //大小为初始化自定值  0x04000000

  params = tag_next (params);

}

}

static void setup_commandline_tag (bd_t *bd, char *commandline)

{

  char *p;                //char *commandline = getenv ("bootargs");

  if (!commandline)        //bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0使用串口0

     return;

  /* eat leading white space */

  for (p = commandline; *p == ' '; p++);

  /* skip non-existent command lines so the kernel will still

    * use its default command line.   */

   if (*p == '\0')   return;

  params->hdr.tag = ATAG_CMDLINE;     //0x54410009

  params->hdr.size =   (sizeof (struct tag_header) + strlen (p) + 1 + 4) >> 2;

  strcpy (params->u.cmdline.cmdline, p);

  params = tag_next (params); }

static void setup_end_tag (bd_t *bd)

{

  params->hdr.tag = ATAG_NONE;

  params->hdr.size = 0;

}

u_boot: 启动内核
1、从flash里读
2、启动
 a、设置启动参数
 b、跳跳到入口地址
 
 theKernel (0, bd->bi_arch_number, bd->bi_boot_params);
   bd->bi_boot_params 参数地址
   bd->bi_arch_number 机器id

uboot启动内核(3)的更多相关文章

  1. UBOOT启动内核过程

    1.摘要 (1).启动4步骤第一步:将内核搬移到DDR中第二步:校验内核格式.CRC等第三步:准备传参第四步:跳转执行内核(2).涉及到的主要函数是:do_bootm和do_bootm_linux(3 ...

  2. U-boot 启动内核

    1:什么是UBOOT,为什么要有UBOOT? UBOOT的主要作用是用来启动linux内核,因为CPU不能直接从块设备中执行代码,需要把块设备中的程序复制到内存中,而复制之前还需要进行很多初始化工作, ...

  3. linux的几个内核镜像格式Image 和 u-boot启动内核和文件系统时的一些环境变量的设置

    关于编译powerpc linux的几个Image参考原文 http://blog.sina.com.cn/s/blog_86a30b0c0100wfzt.html 转载▼   PowerPC架构 L ...

  4. 嵌入式linux开发uboot启动内核的机制(二)

    一.嵌入式系统的分区 嵌入式系统部署在Flash设备上时,对于不同SoC和Flash设备,bootloader.kernel.rootfs的分区是不同的.三星S5PV210规定启动设备的分区方案如下: ...

  5. 【转】UBOOT——启动内核

    转自:https://www.cnblogs.com/biaohc/p/6403863.html 1:什么是UBOOT,为什么要有UBOOT? UBOOT的主要作用是用来启动linux内核,因为CPU ...

  6. 嵌入式Linux驱动学习之路(六)u-boot启动内核

    内核启动是需要必要的启动参数.不能开机自动完全从0开始启动,需要uboot帮助内核实现重定位并提供参数. 首先,uboo会从Kernel分区中读取bootcmd环境变量,根据环境变量可自动启动. 分区 ...

  7. 使用Uboot启动内核并挂载NFS根文件系统

    配置编译好内核之后,将生成的内核文件uImage拷贝到/tftpboot/下,通过tftp服务器将内核下载到开发板,使用命令:tftp 31000000 uImage.下载完成之后配置bootargs ...

  8. uboot启动内核的实现

    前面我们分析了uboot 的整个流程,我们知道uboot启动以后所有功能都是通过命令来实现的,启动kernel就是执行了bootcmd里面的命令.命令执行过程在uboot中是非常重要的现在我们就来看u ...

  9. tiny4412学习(一)之从零搭建linux系统(烧写uboot、内核进emmc+uboot启动内核)【转】

    本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/74080109 版权声明:本文为博主原创文章,转载请注明http://blog.c ...

  10. u-boot学习(五):u-boot启动内核

    u-boot的目的是启动内核.内核位于Flash中,那么u-boot就要将内核转移到内存中.然后执行命令执行之.这些操作是由bootcmd命令完毕的. bootcmd=nand read.jffs2 ...

随机推荐

  1. (转)Java + Excel 接口自动化

    最近项目比较悠闲,想找点事干,写了个 Excel 接口测试的 "框架" 以前用 python 写过一个,这次用 java, 应该说框架都不算,反正就是写了,能帮我解决问题就行. 当 ...

  2. Oracle Regexp_substr

    Oracle中REGEXP_SUBSTR函数   Oracle中REGEXP_SUBSTR函数的使用说明:   题目如下: 在oracle中,使用一条语句实现将'17,20,23'拆分成'17','2 ...

  3. 一次tomcat服务器被入侵解决办法

    突然tomcat目录下莫名其妙的多了几个war文件,里面内容只有一个index.jsp,打开控制台发现多了几个应用,我可以确定不是我部署上去的,顺着应用访问竟然看到了

  4. fibonacci 斐波那契数列

    1.小兔子繁殖问题  (有该问题的详细来由介绍) 2.台阶问题 题目:一个人上台阶可以一次上一个或者两个,问这个人上n层的台阶,一共有多少种走法. 递归的思路设计模型: i(台阶阶数)         ...

  5. spring+redis实现缓存

    spring + redis 实现数据的缓存 1.实现目标 通过redis缓存数据.(目的不是加快查询的速度,而是减少数据库的负担) 2.所需jar包 注意:jdies和commons-pool两个j ...

  6. _CRT_NONSTDC…与_CRT_SECURE…

    目录 第1章说明    1 1.1 _CRT_NONSTDC_NO_WARNINGS    1 1.2 _CRT_NON_CONFORMING_SWPRINTFS    2 1.3 _CRT_SECU ...

  7. navigator.userAgent.indexOf来判断浏览器类型

    navigator.userAgent.indexOf来判断浏览器类型 (2011-03-03 11:30:40) 转载▼ 标签: 杂谈   来源:http://xtaai5233.blog.163. ...

  8. eclipse导入git项目(转)

    1.首先在github.com上申请一个账号2.Eclipse需要安装egit插件,在Eclipse中选择help->Marketplace,在search中输入egit,找到后安装即可 3.从 ...

  9. 根据不同的屏幕宽度引入不同的css文件

    <link rel="stylesheet" href="css/jl_public.css?v=11"/> <link rel=" ...

  10. HTML5自学笔记[ 3 ]表单验证反馈

    表单控件对象的validity对象可以设置或返回相关的验证信息(在invalid事件处理中获取validity对象): 属性valid:为true所有验证通过,为False至少有一种验证失败. 属性v ...