u-boot initf_bootstage函数分析
这篇博客主要分析 init_sequence_f 函数指针数组中的initf_bootstage函数:
static int initf_bootstage(void)
{
bool from_spl = IS_ENABLED(CONFIG_SPL_BOOTSTAGE) &&IS_ENABLED(CONFIG_BOOTSTAGE_STASH);
//CONFIG_SPL_BOOTSTAGE和CONFIG_BOOTSTAGE_STASH都未定义,from_spl = false
int ret;
ret = bootstage_init(!from_spl);
int bootstage_init(bool first) //first=true
{
struct bootstage_data *data;
int size = sizeof(struct bootstage_data);
gd->bootstage = (struct bootstage_data *)malloc(size); //为gd->bootstage分配空间
if (!gd->bootstage)
return -ENOMEM;
data = gd->bootstage;
memset(data, '\0', size); //将gd->bootstage指向的空间清零
if (first) {
data->next_id = BOOTSTAGE_ID_USER; //将gd->bootstage的next_id的参数设置为BOOTSTAGE_ID_USER
bootstage_add_record(BOOTSTAGE_ID_AWAKE, "reset", 0, 0);
ulong bootstage_add_record(enum bootstage_id id, const char *name,int flags, ulong mark)
{
struct bootstage_data *data = gd->bootstage;
struct bootstage_record *rec;
if (flags & BOOTSTAGEF_ALLOC) //flags=0,不执行
id = data->next_id++;
rec = find_id(data, id); //gd->bootstage被清零,返回NULL
if (!rec && data->rec_count < RECORD_COUNT) {
rec = &data->record[data->rec_count++]; //初始化rec指向&data->record[0],并且data->rec_count=1
rec->time_us = mark; //初始化rec->time_us为0
rec->name = name; //初始化rec->name 为reset
rec->flags = flags; //初始化rec->flags 为0
rec->id = id; //初始化rec->id为BOOTSTAGE_ID_AWAKE
}
show_boot_progress(flags & BOOTSTAGEF_ERROR ? -id : id);
//等价于show_boot_progress(BOOTSTAGE_ID_AWAKE),啥也没干
return mark;
}
//bootstage_add_record的主要功能是初始化gd->bootstage->record[0]
}
return 0;
}
//bootstage_init的主要功能是为gd->bootstage分配空间,并初始化gd->bootstage->next_id和gd->bootstage->record[0]
if (ret) //ret=0,不执行
return ret;
if (from_spl) { //from_spl = false,不执行
const void *stash = map_sysmem(CONFIG_BOOTSTAGE_STASH_ADDR,
CONFIG_BOOTSTAGE_STASH_SIZE);
ret = bootstage_unstash(stash, CONFIG_BOOTSTAGE_STASH_SIZE);
if (ret && ret != -ENOENT) {
debug("Failed to unstash bootstage: err=%d\n", ret);
return ret;
}
}
bootstage_mark_name(BOOTSTAGE_ID_START_UBOOT_F, "board_init_f");
ulong bootstage_mark_name(enum bootstage_id id, const char *name)
{
int flags = 0;
if (id == BOOTSTAGE_ID_ALLOC) //id=BOOTSTAGE_ID_START_UBOOT_F,不执行
flags = BOOTSTAGEF_ALLOC;
return bootstage_add_record(id, name, flags, timer_get_boot_us()); //初始化gd->bootstage->record[1]
}
//bootstage_mark_name的主要作用是初始化gd->bootstage->record[1]为board_init_f
return 0;
}
综上,initf_bootstage的主要作用就是为gd->bootstage分配空间,并初始化gd->bootstage,增加两条gd->bootstage->record,一条是reset,一条是board_init_f
————————————————
版权声明:本文为CSDN博主「yanggx0929」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yanggx0929/article/details/88834910
u-boot initf_bootstage函数分析的更多相关文章
- 精尽Spring Boot源码分析 - SpringApplication 启动类的启动过程
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- 精尽Spring Boot源码分析 - 配置加载
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- split(),preg_split()与explode()函数分析与介
split(),preg_split()与explode()函数分析与介 发布时间:2013-06-01 18:32:45 来源:尔玉毕业设计 评论:0 点击:965 split()函数可以实 ...
- string函数分析
string函数分析string函数包含在string.c文件中,经常被C文件使用.1. strcpy函数原型: char* strcpy(char* str1,char* str2);函数功能: 把 ...
- start_amboot()函数分析
一.整体流程 start_amboot()函数是执行完start.S汇编文件后第一个C语言函数,完成的功能自然还是初始化的工作 . 1.全局变量指针r8设定,以及全局变量区清零 2.执行一些类初始化函 ...
- uboot的jumptable_init函数分析
一.函数说明 函数功能:安装系统函数指针 函数位置:common/exports.c 二.函数分析 void jumptable_init (void) { int i; gd->jt = (v ...
- Linux-0.11内核源代码分析系列:内存管理get_free_page()函数分析
Linux-0.11内存管理模块是源码中比較难以理解的部分,如今把笔者个人的理解发表 先发Linux-0.11内核内存管理get_free_page()函数分析 有时间再写其它函数或者文件的:) /* ...
- 31.QPainter-rotate()函数分析-文字旋转不倾斜,图片旋转实现等待
在上章和上上上章: 28.QT-QPainter介绍 30.QT-渐变之QLinearGradient. QConicalGradient.QRadialGradient 学习了QPainter基础绘 ...
- Spring Boot 入门详细分析
推荐阅读: 我们为什么要学习 Spring Boot 我们搭建 Spring Boot 项目,可以使用 Spring 为我们提供的初始化网站,那个可能不太方便,今天呢,我们就来说说如何使用 IDEA ...
随机推荐
- python获取豆瓣日记
最近迷上了看了四个春天,迷上了饭叔的豆瓣日记,想全部抓取下来,简单了写了下面的脚本 import urllib.request import os from bs4 import BeautifulS ...
- Function程序设计及应用
Function也称为函数,它是SAP中一个独物的程序模式,一般是一段单独的程序代码,可独立执行或直接被SAP其他程序所调用.Function支持远程访问模式,即提供接口供SAP程序使用(如VB,.N ...
- python学习之数据类型(dic)
3.8 字典 3.8.1 字典的介绍 字典(dict)是python中唯一的一个映射类型,它是以{ }括起来的键值对组成,在dict中key是唯一的.在保存的时候,根据key来计算出一个内存地址, ...
- linux中权限对文件和目录的影响?
######### rwx 权限对文件和目录的含义 ############ 代表字符 权限 对文件的含义 对 目录 ...
- kh67-wjs
个人简历 基本信息 姓 名: 性 别: 年 龄: 籍 贯: 联 ...
- MTU,MRU,MSS
MTU是以太网数据链路层概念,默认是1500,当在PPPOE环境的时候,是1492和1480,两者有何区别,暂不清楚 MRU是PPP链路数据链路层的概念,都是最大传输单元的意思 MSS是最大报文段长度 ...
- 【神经网络与深度学习】用训练好的caffemodel来进行分类
现在我正在利用imagenet进行finetune训练,待训练好模型,下一步就是利用模型进行分类.故转载一些较有效的相关博客. 博客来源:http://www.cnblogs.com/denny402 ...
- HDU 2973 YAPTCHA (威尔逊定理)
YAPTCHA Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- CDH的ntp时间同步
云服务器: ntpq -p ntpdate -u 10.52.255.1 #手动同步 自建NTP服务器: https://www.cnblogs.com/yinzhengjie/p/9480665. ...
- Spring(一)--Spring简介
Spring简介 1. Spring的特点 Spring (春天,绿色) 容器 01.Java EE开发者的春天,大大简化了代码量 02.使用IOC来降低主业务之间的耦合度 03.使用AOP来降低主 ...