笔记整理—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

相关文章

oracle 11g导入\导出(expdp impdp)之导入过程

《oracle11g导入导出(expdpimpdp)之导入过程》导出需使用SEC.DMP格式,无分号;建立expdir目录(E:/exp)并确保存在;导入在cmd下执行,需sys用户权限;若需修... 目录准备文件导入(impdp)1、建立directory2、导入语句 3、更改密码总结上一个环节,我们讲了

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

Java Kafka消费者实现过程

《JavaKafka消费者实现过程》Kafka消费者通过KafkaConsumer类实现,核心机制包括偏移量管理、消费者组协调、批量拉取消息及多线程处理,手动提交offset确保数据可靠性,自动提交... 目录基础KafkaConsumer类分析关键代码与核心算法2.1 订阅与分区分配2.2 拉取消息2.3

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面