cmd_bootm.c //传递给内核的参数
     int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
          do_bootm_linux  (cmdtp, flag, argc, argv,  addr, len_ptr, verify);
          原型:void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],  ulong addr, ulong *len_ptr, int verify)
               char *commandline = getenv ("bootargs");
               void (*theKernel)(int zero, int arch, uint params); //函数指针
               theKernel = (void (*)(int, int, uint))ntohl(hdr->ih_ep);     //跳转到内核的位置ntohl(hdr->ih_ep)
               setup_start_tag     //tag分为tag_header、union.u两部分组成
params->hdr.tag =  0x54410001     //tag_header为先size后tag组成
                    params->hdr.size = tag_size(tag_core) = 5     //union.u由很多部分组成,详见源文件asm-arm/setup.h
                         #define tag_size(type)    ((sizeof(struct tag_header) + sizeof(struct type)) >> 2)
                              struct tag_header { u32 size;u32 tag;};   //8字节
                              struct tag_core     { u32 flags;u32 pagesize;u32 rootdev;};     //12字节
                              >> 2 //除以4等于5
                    params->u.core.flags = 0;               //struct tag->union.u.tag_core.flags
                    params->u.core.pagesize = 0;         //struct tag->union.u.tag_core.pagesize
                    params->u.core.rootdev = 0;          //struct tag->union.u.tag_core.rootdev
                    params = tag_next(params);            //当前地址修改为下一个tag始地址
                         #define tag_next(t)    ((struct tag *)((u32 *)(t) + (t)->hdr.size))params地址+tag大小(此处大小为unsigned int 所以一个大小为4字节)=20字节
               setup_serial_tag
               setup_revision_tag
               setup_memory_tags
                    params->hdr.tag = 0x54410002     //tag标记
                    params->hdr.size =  tag_size(tag_mem32) = 4     //tag参数个数
                         #define tag_size(type)    ((sizeof(struct tag_header) + sizeof(struct type)) >> 2)
                              struct tag_header { u32 size;u32 tag;};   //8字节
                              struct tag_mem32 { u32    size; u32    start; };     //8字节
                              >> 2 //除以4等于4
                    params->u.mem.start = 0x30000000;
                    params->u.mem.size  = 64*1024*1024;
                    params = tag_next(params);            //当前地址修改为下一个tag始地址
               setup_commandline_tag(char *cmdline)
                    params->hdr.tag = 0x54410009      //tag标记
                    params->hdr.size =  (sizeof (struct tag_header) + strlen(cmdline) + 1 + 3) >> 2 = 未知     //tag参数个数
                        struct tag_header { u32 size;u32 tag;};   //8字节
                        int strlen(char *str){int i = 0; while(str[i]) { i++;} return i;}     //字符串的大小 未知
                        >> 2 //除以4等于未知
                    strcpy(params->u.cmdline.cmdline, cmdline);     //将命令拷贝进结构体存储
                    params = tag_next(params);          //当前地址修改为下一个tag始地址
               setup_videolfb_tag
               setup_end_tag
                    params->hdr.tag = 0x00000000      //tag标记
                    params->hdr.size = 0    //tag参数个数

step2 uboot tag存储主要部分代码的更多相关文章

  1. uboot tag存储主要部分代码

    https://www.cnblogs.com/pokerface/p/5217106.html     cmd_bootm.c //传递给内核的参数      int do_bootm (cmd_t ...

  2. u-boot移植(八)---代码修改---存储控制器--MMU

    一.MMU介绍 1.1 虚拟地址与物理地址 建立两个应用程序,hello1.c和hello2.c,然后运行: hello1.c hello2.c 运行结果如下: 可以看到两个结果打印的地址是一样的,都 ...

  3. u-boot移植(七)---代码修改---存储控制器

    一.CPU访问芯片的条件 CPU通过访问存储控制器,来读取外部设备的数据. CPU想访问一个芯片,需要如下条件(配置信息): 地址线 数据线:8位/16位/32位数据宽度 时钟/频率 其他芯片相关的特 ...

  4. u-boot移植(五)---代码修改---时钟修改、SDRAM

    最开始已经建立了新单板以及配置文件,现在就需要做的是代码的修改,配置成适合目标板使用的u-boot. 一.时钟修改 在代码流程分析中,我们知道,系统的启动是: 设置 CPU 为管理员模式 关闭看门狗 ...

  5. u-boot移植(十)---代码修改---支持nor flash

    一.问题定位 开发板重启后打印了2个提醒和一个错误,caches的提醒先不看,看看flash和nand下面的提醒,bad CRC,Using default enviroment,我们可以定位Usin ...

  6. Git-命令行-使用 Tag 标记你的代码

    前言 正文开始之前,我想我们需要弄明白几个问题: 1.tag 是什么? 2.使用tag 的好处? 3.tag 和 branch 的区别以及使用场景? tag 是什么? tag , 翻译过来是标签的意思 ...

  7. u-boot移植(九)---代码修改---NAND

    一.NAND原理 NAND 无地址空间,地址和数据的发送都依赖于LDATA[0:7]这一串数据总线. 不看随机页编程,看到从高位到低位的页,总共分为64个页面,每个页的组成是2K + 64  个byt ...

  8. u-boot移植(六)---代码修改---串口

    一.代码流程 1.1 串口代码 程序流程图如下: default_serial_console 执行的代码如下: 在JZ2440.H中有如下定义: 则执行结构体s3c24xx_serial0_devi ...

  9. u-boot移植(十三)---代码修改---裁剪及环境变量 二

    一.错误处理 上一节遇到一个错误: print一下: 发现我们在jz2440.h中静态写的网络参数都没有写进去. dm9000 address not set. dm9000的地址未设置. 这里对应两 ...

随机推荐

  1. Android 自定义组件随着手指自动画圆

    首先自定义一个View子类: package com.example.androidtest0.myView; import android.content.Context; import andro ...

  2. ruby面向对象class

    ruby对象是严格封装的:只能通过定义的方法访问其内部状态.方法使用的成员变量在对象外部不能直接访问,不过可以通过getter.setter等访问器方法(accessor),使他们看起来好像是直接访问 ...

  3. zabbix 通过key 获取

    zabbix:/root# zabbix_get -s 192.168.2.224 -k "perf_counter[\Processor(_Total)\% Processor Time] ...

  4. Redhat 安装Oracle DBI和DBD

    Redhat 安装DBI和ORACLE DBD tar -zxvf DBI-1.616.tar.gz cd DBI-1.616 perl Makefile.PL make make install 2 ...

  5. 通过ip获取地理位置信息

    http://ipinfo.io/developers 直接使用get请求  url: http://ipinfo.io/json    即可获得json数据

  6. Android推送通知指南

      Android推送通知指南 在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是 ...

  7. x64 stack walking、调用约定、函数参数识别

    k = <rsp> <rip> <frame_count>x64下manual stack walking与x86不同,x86一般情况下有ebp chain,x64 ...

  8. [JLOI2013]卡牌游戏

    [题目描述 Description] N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡 ...

  9. .net常見面試題(三)

    1, 请你说说.NET中类和结构的区别? 答:结构和类具有大体的语法,但是结构受到的限制比类要多.结构不能申明有默认的构造函数,为结构的副本是又编译器创建和销毁的,所以不需要默认的构造函数和析构函数. ...

  10. replace empty char with new string,unsafe method和native implementation的性能比较

    1: class Program 2: { 3: static void Main(string[] args) 4: { 5: string s = File.ReadAllText(@" ...