笔记整理—uboot启动过程(4)BL2干了什么及内存排布

2024-08-24 20:20

本文主要是介绍笔记整理—uboot启动过程(4)BL2干了什么及内存排布,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        uboot的第一阶段结束于start_armboot,第二阶段的uboot代码主要负责soc外部硬件(inand、网卡、......)、uboot本身构建(uboot指令、环境变量、......)最后进入命令行,等待命令然后倒数,等待bootcmd,进入内核(uboot结束)。

        倒数期间通过回车打断进入如下代码,通过循环不去进入bootcmd。

for(;;){main_loop();}

       typedef int (init_fnc_t) (void);这是一个函数类型。对于一个int(void)类型的函数类型取别名为init_fnc_t,可用这个别名进行创建这个类型的函数对象。

        init_fnc_t  **init_fnc_ptr;   init_fnc_ptr是一个二重指针,其无非是能指向两种东西。

                1.指向一重指针的指针。2.指向指针数组。所以可以用于指向一个函数指针数组。

DECLARE_GLOBAL_DATA_PTR宏
#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm("r8")

        这里定义了一个全局变量名为gd,类型为指针,volatile表示可变的,register表示存放在寄存器中,asm("r8")在gcc语法中,存放在r8寄存器里,gd_t一个结构体类型的别名。

        综合分析一下,指向gd_t类型的指针,是一个全局的结构体,这个结构体里有uboot所有常用的全局变量,通过将其存放在寄存器的方式提高效率。gd_t中封装了另一个结构体,结构体里封装了板卡信息和一堆常用变量。

        控制台基于串口实现,但比串口高级许多。

        global_data的主要内容:

global_data{unsigned long flags;    //标志位unsigned long baudrate;    //比特率unsigned long have_console;    //控制台(标准输入/输出控制,能printf与scantf)(bool)unsigned long reloc_off;    //重定位偏移量unsigned long env_addr;    //环境变量地址(八成是结构体)unsigned long env_valid;    //内存中环境是否准备完成(DDR)(bool)unsigned long fd_base;    //缓存地址void xxit;    //跳转表bd_t *bt;  //板卡信息
}

        

        DECLARE_GLOBAL_DATA_PTR只是一个指针,gd并没有被分配内存,在裸机下没有malloc分配内存(暂无) ,不给gd分内存gd就是野指针。

        gd与bd要内存,但内存没有被管理,uboot也要使用大片的内存,使用要有整体的内存规划。

        内存排布:

gd_base=CFG_UBOOT_BASE+CFG_UBOOT_SIZE-\CFC_MALLOC_LEN-CFG_STACK_SIZE-sizeof(gd_t)

        其中:GFG_UBOOT_BASE 为uboot区域,长为uboot大小。

                   CFG_UBOOT_SIZE 为uboot大小 2M(2*1024*1024)

                   CFC_MALLOC_LEN 为malloc(堆)长度。CFG_ENV_SIZE(大小为0x4000=16k)+896(也就是896k)*1024。

                    CFG_STACK_SIZE 堆区,长度512*1024=512k。

                    CFG_GBL_DATA_SIZE 全局变量128字节。

                     sizeof(gd_t)36字节(4*9)。

        sizeof(bd_t)44到50字节。

        gd=(gd_t*)gd_base 强换c,指针指向gd_base。

        memset((void*)gd,0,sizeof(gd_t));内存清零。

        gd->bd=(bd_t*)((char*)gd-sizeof(bd_t)) gd,bd指向bd_base。

        内存向上生长,栈分满增满减。

        __asm__volatile__("":::"memory");对内存进行了修改,防止gcc过度优化。这叫内存间隔,防止优化后造成错误。__asm__volatile__属于内嵌汇编。

        这一章先写到这,下一章将对uboot的板级初始化进行说明,敬请期待。

这篇关于笔记整理—uboot启动过程(4)BL2干了什么及内存排布的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1103503

相关文章

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

SpringBoot整合liteflow的详细过程

《SpringBoot整合liteflow的详细过程》:本文主要介绍SpringBoot整合liteflow的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...  liteflow 是什么? 能做什么?总之一句话:能帮你规范写代码逻辑 ,编排并解耦业务逻辑,代码

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

MySQL中的InnoDB单表访问过程

《MySQL中的InnoDB单表访问过程》:本文主要介绍MySQL中的InnoDB单表访问过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、访问类型【1】const【2】ref【3】ref_or_null【4】range【5】index【6】