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. 170815-关于Session知识点

    Cookie:实际上就是一个头.               服务器会创建Cookie,并且将Cookie以一个响应头的形式发送给浏览器               浏览器收到Cookie以后,会保存 ...

  2. 【转】i18n实现前端国际化(实例)

    源地址:https://www.jianshu.com/p/ea93efef5155 i18n实现前端国际化(实例) 0.1442018.08.27 16:25:10字数 246阅读 10563 在今 ...

  3. open 函数处理文件

    open函数用于文件处理 操作文件时,一般需要经历如下步骤:1 打开文件    2  操作文件 f =  open("文件名"     ,  '  打开文件方式'  ) 文件句柄 ...

  4. ionic slide组件使用

    ionic学习使用笔记 slide 组件的使用   开始做的时候,遇到了个要用ionic实现 有一系列的序列需要展示,但是当前页面上只能展示一小部分,剩余的在没有出现时是隐藏的,还得能滑动出现,但是又 ...

  5. vue项目使用axios发送请求让ajax请求头部携带cookie

    最近做vue项目时遇到登录权限问题,登录以后再发送的请求头部并没有携带登录后设置的cookie,导致后台无法校验其是否登录.检查发现是vue项目中使用axios发送ajax请求导致的.查看文档得知ax ...

  6. Laravel 在homestead 平台上命令

    使用以下命令查看 Heroku 站点地址: $ heroku domains

  7. Delphi XE2 之 FireMonkey 入门(25) - 数据绑定: TBindingsList: 表达式的灵活性及表达式函数

    Delphi XE2 之 FireMonkey 入门(25) - 数据绑定: TBindingsList: 表达式的灵活性及表达式函数 绑定表达式中可以有简单的运算和字符串连接, 但字符串需放在双引号 ...

  8. iView 实战系列教程(21课时)_1.iView 实战教程之配置篇_图片优化

    首先需要安装vue cli 3.0版本 点击添加插件, 输入iview 选中后安装 全部导入还是按需导入. 2.是否需要自定义主题变量 3.多语言的设置. 这里我们全部选择为默认 然后点击继续. 启动 ...

  9. 《图解设计模式》读书笔记5-2 decorator模式

    目录 代码演示 模式的角色和类图 思路拓展 Decorator模式即装饰器模式,就是对类进行装饰,下面通过代码说明. 代码演示 代码展示的内容 有一个类StringDisplay:表示一句话,比如he ...

  10. 倾旋之slack主题协同

    源:https://pocketcorp.slack.com/join/shared_invite/enQtNTk2MDYwNDA4NzU0LTg3ZGVlNDE5NWUzNjJhZTc1MDQ5MT ...