自己写bootloader笔记5---设置u-boot传给内核的参数分析
来源:互联网 发布:圣剑网络 奥特曼 编辑:程序博客网 时间:2024/05/16 08:41
1、分析
(1)u-boot要启动内核,把内核从flash读到SDRAM ,要调到SDRAM执行,u-boot执行时内核还没执行,内核执行时,u-boot已完结。u-boot传参数给内核(双方约定一个位置),u-boot在那位置存数据,数据格式也要 双方约定好
(2)0x30000000是内存的起始地址,0x30008000地址开始用于存放内核,参数存储双方约定的地址是0x30000100,
2、结构分析(参数称为tag ,标志的意思)
//表参数设置的开始
setup_start_tag();
//告诉内核,内存有多大
setup_memory_tags();
//命令行参数 root=/dev/mtdblock3表示根文件系统在哪里 init=/linuxrc console=ttySAC0表示内核启动时,内核的打印信息从哪个串口打印出来
setup_commandline_tag("noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0");
//表参数设置的结束
setup_end_tag();
3、setup_start_tag()分析(tag的头部)
(1)//定义tag结构体
static struct tag *params;
(2)指定参数存放的起始地址0x30000100
params = (struct tag *)0x30000100;
params->hdr.tag = ATAG_CORE; //ATAG_CORE宏定义为0x54410001,表示一个参数开始的标志
tag_size()函数表示头部结构体tag_header的大小(8字节)加上tag_core结构体的大小(12字节),单位是右移2位,也就是除以4,单位是4字节。(8+12)/4=5,也就是size为5
params->u.core.flags = 0;
params->u.core.pagesize = 0;
params->u.core.rootdev = 0;
当前位置加上size,由于u32型的,指针相加,指针加1相当于加4个字节
params = tag_next (params);}
4、setup_memory_tags()分析(tags中的s表示多个,如果板子内存有多段,可设置多个tag)
{
params->hdr.tag = ATAG_MEM; //ATAG_MEM宏定义为0x54410002,表示内存的标志
size为4
params->hdr.size = tag_size (tag_mem32);
//内存开始地址0x30000000
params->u.mem.start = 0x30000000
//内存大小64M
params->u.mem.size = 64*1024*1024;
params = tag_next (params);
}
5、setup_commandline_tag(char *cmdline)分析
{
用strlen函数算出字符串cmdline的大小,加1是要包括结束字符
int len = strlen(cmdline) + 1;
//ATAG_CMDLINE宏定义为0x54410009,表示命令行的标志
params->hdr.tag = ATAG_CMDLINE;
size是以4字节为单位的,所以字符串要向4取整( len + 3)
params->hdr.size = (sizeof (struct tag_header) + len + 3) >> 2;
//放的是一大串字符串,把字符串 cmdline拷贝到结构体cmdline的cmdline 成员
strcpy (params->u.cmdline.cmdline, cmdline);
params = tag_next (params);
}
6、 setup_end_tag(void)分析
{ATAG_NONE宏定义为0x00000000.表示结束标志
params->hdr.tag = ATAG_NONE;
params->hdr.size = 0;
}
- 自己写bootloader笔记5---设置u-boot传给内核的参数分析
- 自己写bootloader笔记5---设置u-boot传给内核的参数分析
- 自己写bootloader笔记6---boot.c分析(u-boot向内核传递参数及跳转到内核)
- 自己写bootloader笔记6---boot.c分析(u-boot向内核传递参数及跳转到内核)
- u-boot学习(六):自己写bootloader
- 自己写bootloader笔记9---读取内核内容分析看能否读取nand flash的内核
- 自己写bootloader笔记10----改进(提高u-boot启动速度)
- U-boot移植之自己写一个简单的bootloader(一)
- 自己写bootloader笔记1---流程分析
- 自己写bootloader笔记7---Makefile分析
- 自己写bootloader笔记1---流程分析
- 自己写bootloader笔记7---Makefile分析
- 自己写bootloader笔记8---反汇编文件boot.dis分析
- 解析bootloader传给kernel的参数
- (六) 自己写简单的u-boot
- bootloader---4.分析u-boot Makefile最后连接的过程
- 写一个简单的BootLoader(三)——boot.c分析笔记
- 写一个简单的BootLoader(四)——链接文件boot.lds分析笔记
- 自己写bootloader笔记3---init.c分析
- 深入浅出——网络模型中Inception的作用与结构全解析
- OpenCV-识别细胞图中的细胞总数
- Android Studio 进阶详细配置
- 【华为OJ】密码强度等级
- 自己写bootloader笔记5---设置u-boot传给内核的参数分析
- EXCEL对外教程系列(一)--总篇
- 【bzoj 1087】[SCOI2005]互不侵犯King 状压dp
- 与其说大学欠我一个贝薇薇,倒不如说自己没有活成肖奈
- 左程云著算法与数据结构题目最优解笔记-删除无序链表中重复的元素
- java.lang.ClassCastException: org.springframework.web.filter.CharacterEncodingFilter cannot be cast
- 合唱队-华为OJ
- java的框架和集合
- FFT模板