https://www.cnblogs.com/pokerface/p/5217106.html
 
 
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 + 4) >> 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始地址
 
params->hdr.size = (sizeof(struct tag_header)+strlen(cmdline)+1+4)>>2; //’+1’表示字符结束标志’\0’, ‘+4’表示除以4转换成整型时向上取整
 
               setup_videolfb_tag
               setup_end_tag
                    params->hdr.tag = 0x00000000      //tag标记
                    params->hdr.size = 0    //tag参数个数
 
 

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

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

      cmd_bootm.c //传递给内核的参数      int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])     ...

  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. java虚拟机规范-运行时数据区

    前言 java虚拟机是java跨平台的基石,本文的描述以jdk7.0为准,其他版本可能会有一些微调. 引用 java虚拟机规范 数据类型 java总共有两种数据类型:基本类型和引用类型.java虚拟机 ...

  2. 阶段1 语言基础+高级_1-2 -面向对象和封装_14private关键字的作用及使用

    新建一个类Person代表人 创建demo03Person类去调用Person这个类 年龄设置为负数.虽然可以设置为负数.但是这个数值不合理 外部访问这个age就会报错 负数设置不进来.正数也设置不了 ...

  3. Mac 10.14 下为php 安装xdebug 并让vscode支持

    安装Xdebug 寻找对应php版本的xdebug版本 先将info输出到一个文件 php -i > info.txt 打开info.txt 复制所有内容 打开寻找合适xdebug的页面http ...

  4. C#实体类生成Create Table SQL

    using System; using System.Collections.Generic; using System.Text; using System.Reflection; namespac ...

  5. 【ABAP系列】SAP ABAP实现发送外部邮件(添加附件)功能

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP ABAP实现发送外部邮件(添 ...

  6. ecshop启用gzip后,后台不能打开不能访问的问题

    上传测试的时候,站点显示无法打开.随后我用网址打开根目录的robots文件.图片.静态页···全部可以正常打开··· 我尴尬···一一检查后,我就怀疑是不是客户当初设置gzip压缩的问题了.但连后台都 ...

  7. C#后台保存Cookie

    一般是: Response.Cookies["backurl"].Expires.AddDays(2); 但是,IE浏览器保存Cookie用 Response.Cookies[&q ...

  8. elementUi--->实现上传图片效果(upload+formData)

    现在谈一下elelmentui中使用Upload 上传通过点击或者拖拽上传文件(图片) <el-upload name="multfile"    //上传的文件字段名 cl ...

  9. web 前端1 拾遗

    1.整体布局 三个div header body footer 2.div的居中 width:980px margin:0 auto 3.内联标签 inline #内联 无法使用高度.宽度 block ...

  10. AngularJs——基础小知识(二)

    AngularJs的过滤器 1.Currency :过滤器(金额货币格式化)