笔记整理—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中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

k8s中实现mysql主备过程详解

《k8s中实现mysql主备过程详解》文章讲解了在K8s中使用StatefulSet部署MySQL主备架构,包含NFS安装、storageClass配置、MySQL部署及同步检查步骤,确保主备数据一致... 目录一、k8s中实现mysql主备1.1 环境信息1.2 部署nfs-provisioner1.2.

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

linux部署NFS和autofs自动挂载实现过程

《linux部署NFS和autofs自动挂载实现过程》文章介绍了NFS(网络文件系统)和Autofs的原理与配置,NFS通过RPC实现跨系统文件共享,需配置/etc/exports和nfs.conf,... 目录(一)NFS1. 什么是NFS2.NFS守护进程3.RPC服务4. 原理5. 部署5.1安装NF

MySQL使用EXISTS检查记录是否存在的详细过程

《MySQL使用EXISTS检查记录是否存在的详细过程》EXISTS是SQL中用于检查子查询是否返回至少一条记录的运算符,它通常用于测试是否存在满足特定条件的记录,从而在主查询中进行相应操作,本文给大... 目录基本语法示例数据库和表结构1. 使用 EXISTS 在 SELECT 语句中2. 使用 EXIS

k8s容器放开锁内存限制问题

《k8s容器放开锁内存限制问题》nccl-test容器运行mpirun时因NCCL_BUFFSIZE过大导致OOM,需通过修改docker服务配置文件,将LimitMEMLOCK设为infinity并... 目录问题问题确认放开容器max locked memory限制总结参考:https://Access

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

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