uboot tag存储主要部分代码
2024-09-30 02:48:22
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参数个数
最新文章
- java项目中读取properties文件
- npm的使用
- asp.net 播放flash
- mbr grub的区别
- C#条件语句、循环语句
- Windows.Andy.Code4App.dll Win8.1/WP8.1通用类库@ver1.0.1
- Object调用静态方法
- jQuery树叶掉落特效代码
- 数据库备份工具mysqldump重要参数详解
- Unity 3D 进度条制作
- Cppcheck 1.54 C/C++静态代码分析工具
- 【解决】System.Web.Http.Description 缺失
- java二维码生成技术
- 从0到1搭建AI中台
- EntityFramework Core:版本不一致问题
- 【 js 工具 】如何在Github Pages搭建自己写的页面?
- 【代码笔记】Web-HTML-布局
- Duplicate Manager Pro for Mac(重复文件查找工具)破解版安装
- iOS - DNS劫持
- java为什么有些异常throw出去需要在函数头用throws声明,一些就不用。
热门文章
- 【MySQL】 知识点记录
- Mac下配置神器PhpStrom开发环境
- 5分钟让你知道什么是PKI
- 源码搭建mysql5.7.20
- ASP.NET Core 上传微信永久视频素材
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_08 转换流_3_转换流的原理
- AngleSharp 网络数据采集 -- 使用AngleSharp做html解析
- 关于NewJson dll 引用不一致
- iptables防火墙常用命令
- 问题 H: 小k的简单问题