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

相关文章

Redis在windows环境下如何启动

《Redis在windows环境下如何启动》:本文主要介绍Redis在windows环境下如何启动的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis在Windows环境下启动1.在redis的安装目录下2.输入·redis-server.exe

PyInstaller打包selenium-wire过程中常见问题和解决指南

《PyInstaller打包selenium-wire过程中常见问题和解决指南》常用的打包工具PyInstaller能将Python项目打包成单个可执行文件,但也会因为兼容性问题和路径管理而出现各种运... 目录前言1. 背景2. 可能遇到的问题概述3. PyInstaller 打包步骤及参数配置4. 依赖

解决SpringBoot启动报错:Failed to load property source from location 'classpath:/application.yml'

《解决SpringBoot启动报错:Failedtoloadpropertysourcefromlocationclasspath:/application.yml问题》这篇文章主要介绍... 目录在启动SpringBoot项目时报如下错误原因可能是1.yml中语法错误2.yml文件格式是GBK总结在启动S

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

将Mybatis升级为Mybatis-Plus的详细过程

《将Mybatis升级为Mybatis-Plus的详细过程》本文详细介绍了在若依管理系统(v3.8.8)中将MyBatis升级为MyBatis-Plus的过程,旨在提升开发效率,通过本文,开发者可实现... 目录说明流程增加依赖修改配置文件注释掉MyBATisConfig里面的Bean代码生成使用IDEA生

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu