这篇博客主要分析 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函数分析的更多相关文章

  1. 精尽Spring Boot源码分析 - SpringApplication 启动类的启动过程

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  2. 精尽Spring Boot源码分析 - 配置加载

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  3. split(),preg_split()与explode()函数分析与介

    split(),preg_split()与explode()函数分析与介 发布时间:2013-06-01 18:32:45   来源:尔玉毕业设计   评论:0 点击:965 split()函数可以实 ...

  4. string函数分析

    string函数分析string函数包含在string.c文件中,经常被C文件使用.1. strcpy函数原型: char* strcpy(char* str1,char* str2);函数功能: 把 ...

  5. start_amboot()函数分析

    一.整体流程 start_amboot()函数是执行完start.S汇编文件后第一个C语言函数,完成的功能自然还是初始化的工作 . 1.全局变量指针r8设定,以及全局变量区清零 2.执行一些类初始化函 ...

  6. uboot的jumptable_init函数分析

    一.函数说明 函数功能:安装系统函数指针 函数位置:common/exports.c 二.函数分析 void jumptable_init (void) { int i; gd->jt = (v ...

  7. Linux-0.11内核源代码分析系列:内存管理get_free_page()函数分析

    Linux-0.11内存管理模块是源码中比較难以理解的部分,如今把笔者个人的理解发表 先发Linux-0.11内核内存管理get_free_page()函数分析 有时间再写其它函数或者文件的:) /* ...

  8. 31.QPainter-rotate()函数分析-文字旋转不倾斜,图片旋转实现等待

    在上章和上上上章: 28.QT-QPainter介绍 30.QT-渐变之QLinearGradient. QConicalGradient.QRadialGradient 学习了QPainter基础绘 ...

  9. Spring Boot 入门详细分析

    推荐阅读: 我们为什么要学习 Spring Boot 我们搭建 Spring Boot 项目,可以使用 Spring 为我们提供的初始化网站,那个可能不太方便,今天呢,我们就来说说如何使用 IDEA ...

随机推荐

  1. 第五周作业,LVM和TCP

    1.磁盘lvm管理,完成下面要求,并写出详细过程: 1) 创建一个至少有两个PV组成的大小为20G的名为testvg的VG;要求PE大小 为16MB, 而后在卷组中创建大小为5G的逻辑卷testlv; ...

  2. 考虑以下 Python 代码,如果运行结束,命令行中的运行结果是什么?

    l = [] for i in xrange(10):  l.append({‘num’:i}) print l在考虑以下代码,运行结束后的结果是什么? l = [] a = {‘num’:0} fo ...

  3. 高级测试工程师面试必问面试基础整理——python基础(一)(首发公众号:子安之路)

    现在深圳市场行情,高级测试工程师因为都需要对编程语言有较高的要求,但是大部分又没有python笔试机试题,所以面试必问python基础,这里我整理一下python基本概念,陆续收集到面试中python ...

  4. 从git上pull下的代码,执行时提示:ModuleNotFoundError: No module named '......',解决方法如下:

    方法一: 如果没有安装,如下: 1.PyCharm : file-> setting->Project interpreter–>package2.右侧有个+ 点击3.进入后 搜索p ...

  5. 基于高斯分布的异常检测(Anomaly Detection)算法

    记得在做电商运营初期,每每为我们频道的促销活动锁取得的“超高”销售额感动,但后来随着工作的深入,我越来越觉得这里面水很深.商家运营.品类运营不断的通过刷单来获取其所需,或是商品搜索排名,或是某种kpi ...

  6. 笔记纪要:C# WebService URL重写

    背景# 有时候我们会有这样的需求,将 WebService URL 中的 asmx 后缀去掉:或者我们要模拟普通 Web 的 URL,接口名称直接拼接在 URL 中.这些情况我们都要用到URL重写. ...

  7. 【Qt开发】Win7 64位qt-windows-x86-msvc2015-5.6.0 DLL依赖库打包

    Win7 64位qt-windows-x86-msvc2015-5.6.0 DLL依赖库打包 今天开始系统的学习QT,第一个测试的问题就是在纯净的系统中如何正常运行,也就是找出QT生成的exe的依赖库 ...

  8. get、set快捷键那码事儿

    今天发现一个省时间的方法.get一下,哈哈 在快捷get/set.或其他那个页面上的方法时,只需Shift+Alt+s 然后,选择哪个方法,就按该方法字母下有横线的那个字母(只按单个字母就行) 在ge ...

  9. Windows2012r2 安装SQLSERVER2017 与 SQLSERVER2016 的错误提示解决KB2919355 以及 KB2919442

    1. win2012r2 安装时 总是提示: 然后费了半天劲 下载下来又提示 找了一下 需要先安装这么一个补丁才可以 KB2919442 然后才能安装上 KB2919355 然后就可以正常安装了:

  10. POJ 2492 A Bug's Life 题解

    题面 这道题是一道标准的种类并查集: 种类并查集是给每个结点一个权值.然后在合并和查找的时候根据情况对权值来进行维护. 通过将原有的区间范围变大使并查集可以维护种类的联系: #include < ...