历史上的今天
返回首页

历史上的今天

今天是:2025年02月23日(星期日)

正在发生

2021年02月23日 | cortex-a8 uboot系列:第六章 uboot源码分析2-启动第二阶段

2021-02-23 来源:eefocus

第一阶段结束后,调用了start_armboot函数。开始第二阶段。


start_armboot函数在lib_arm/board.c文件里。


一、uboot第二阶段

uboot第一阶段主要就是初始化了soc内部的部件(如看门狗,时钟),然后初始化DDR并且完成重定位,建立MMU映射表,启动MMU。


Uboot第二阶段就是要初始化剩下的还没有被初始化的硬件。主要是soc外部的硬件(如iNand,网卡芯片……),uboot本身的一些东西(uboot命令,环境变量……)。然后最终初始化完必要的东西后进入uboot的命令行准备接收命令。


1.uboot的完结

uboot启动后自动运行打印很多信息(这些信息就是uboot在第一和第二阶段不断进行初始化时,打印出来的信息)。然后uboot进入了倒数bootdelay秒然后执行bootcmd对应的启动命令。


如果用户没有干涉,则会执行bootcmd进入自动启动内核流程(uboot就死掉了)。此时用户可以按下空格键打断uboot的自启动进入uboot的命令行下。然后uboot就一直工作在命令行下。


Uboot的命令行就是一个死循环,循环体内不断重复:接收命令、解析命令、执行命令。这就是uboot最终的归宿。

clip_image002

start_armboot函数最后就是一个无限for循环,执行main_loop函数。这个函数就是读取命令,然后执行命令。


二、start_armboot解析1

init_fnc_t定义

clip_image004

这是一个函数类型,

typedef  int (*init_fnc_t) (void)  这个是函数指针。参数是void,函数返回值是int型。

 

clip_image006

init_fnq_ptr 是一个二重函数指针。

二重指针作用两个:一个是用来指向一重指针,另一个是指向指针数组。

因此这里的init_fnq_ptr可以用来指向函数指针数组。

 

clip_image008

该宏在includeasm-asm目录下的global_data.h文件中。

clip_image010

这个宏定义了一个全局变量,名字叫gd,这个全局变量是一个指针类型,占用4个字节,用volatile修饰表示可变,用register修饰表示这个变量要尽量放到寄存器中,后面的asm(“r8”),是gcc支持的一种语法,意思是要把gd放到寄存器r8中。


综合分析,DECLARE_GLOBAL_DATA_PTR就是定义了一个要放在寄存器r8中的全局变量,名字叫gd,类型是一个指向gd_t类型变量的指针。


为什么要把这个变量定义为register?因为这个全局变量gd(global data的简称)是uboot中很重要的一个全局变量(这个全局变量是一个结构体,里面有很多内容,这些内容加起来构成的结构体就是uboot中常用的所有的全局变量),这个gd在程序中经常被访问,因此放在register中提升效率。因此纯粹是运行效率方面的考虑,和功能要求无关,并不是必须。

 

gd_t定义在include/asm-arm的global_data.h中。该结构体将uboot会用到的全局变量封装到一起。

clip_image012

bd_t:存放开发板的一些信息。

flags: 存放标志位

baudrate: 控制台的波特率

have_console:  bool类型,表示控制台是否使用。

reloc_off:  重定位的偏移量

env_addr:  环境变量的地址

env_valid:  bool类型,表明内存中的环境变量是否有效

fb_base:   fram buffer的基地址

vfd_type:  

jt:   跳转表

 

对于bd_t结构体,保存的是板子的信息。

clip_image014

bi_baudrate: 开发板的波特率,和控制台的波特率一样。

bi_ip_add:开发板的ip地址

bi_enetaddr: 开发板的物理地址

bi_env:环境变量的指针

bi_arch_number:板子的机器码

bi_boot_params:启动参数(将来传给linux的参数)地址

bi_dram:  外部dram信息结构体,内部两个变量,一个起始地址,一个大小。程序通过这个参数可以知道开发板外部接的DRAM信息

bi_enet1addr:第二个网卡的物理地址(一般都不用)

 

总之,gd_t中定义了很多全局变量,都是整个uboot使用的,其中有一个bd_t类型的结构体,指向一个bd_t类型的变量,这个bd是开发板的板级信息的结构体,里面有不少硬件相关的参数,如波特率、IP地址、机器码、DDR内存分布。

 

内存使用排布:

DECLARE_GLOBAL_DATA_PTR只是定义了一个指针,也就是说gd里的全局变量并没有分配内存,所以在使用gd之前要给他分配内存,否则gd也只是个野指针而已。


gd和bd需要内存,内存当前没有被管理(因为没有操作系统统一管理内存),大片的DDR内存可以随意使用(只要使用内存地址直接访问内存即可)。但是也不能太随意使用,要考虑uboot其他地方用到的内存。


因此在uboot中需要有一个整体规划。

 

内存排布:

1. uboot区

CFG_UBOOT_BASE  +   XXX,长度为uboot的实际长度

clip_image016

Uboot中定义CFG_UBOOT_BASE为0x33e0_0000。

CFG_UBOOT_SIZE 为 2M。


2. 堆区

CFG_MALLOC_LEN为堆区的长度,计算可知为912K,大致1M左右。

clip_image018

CFG_ENV_SIZE为环境变量的大小。为16K。

clip_image020

所以malloc长度为 16 + 896 = 912K。

 

3. 栈区

CFG_STACK_SIZE大小为512K。

clip_image022

4. gd

长度为sizeof(gd_t),为36个字节。

5. bd

长度为sizeof(bd_t),实际大小大占44个字节。

 

根据gd_base的计算:

clip_image024

所以gd_base = 0x33e00000 + 0x200000(2M) – 912k – 512k – 36(gd_t结构体的大小为36字节)

clip_image026

这样,就知道了gd指针的地址。也就是全局变量存放的首地址。

所以此时内存分布为:

clip_image028

 

 

clip_image030

将gd区域全部给初始化为0。同时给gd中的bd确定内存地址。bd的地址就是gd的地址向下偏移sizeof(bd_t)大小.

clip_image032

 

 

clip_image034

为了防止高版本GCC的优化对内存造成的错误,要加这一句代码。

clip_image036


推荐阅读

史海拾趣

Connor-Winfield公司的发展小趣事

在20世纪60年代初,电子行业正处于飞速发展的黄金时期。正是在这样的背景下,Connor-Winfield公司应运而生。自1963年成立以来,公司便专注于石英计时电路和振荡器的设计与制造。石英计时技术以其精确和稳定的特性,迅速在电子应用中占据了一席之地。Connor-Winfield凭借对这一技术的深入研究和持续创新,逐渐在市场中树立了专业、可靠的形象。

Dawn Electronics Inc公司的发展小趣事

在快速发展的同时,Dawn Electronics Inc公司始终关注社会责任。公司积极参与公益活动,支持教育、环保等事业。同时,公司还注重环保和可持续发展,采用环保材料和生产工艺,减少对环境的影响。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

FEIG ELECTRONIC公司的发展小趣事

FEIG ELECTRONIC始终将技术创新作为企业发展的核心动力。公司不断投入大量资源进行技术研发和产品升级,以保持其在RFID领域的领先地位。近年来,FEIG推出了多款具有高性能、高可靠性、高安全性的RFID产品,如长距离读写器、智能门禁系统等。这些产品的推出不仅满足了客户的多样化需求,还进一步巩固了FEIG在RFID领域的市场地位。

以上五个故事大纲简要概述了FEIG ELECTRONIC在电子行业中的发展历程和关键事件。虽然每个故事的具体细节可能有所不同,但它们共同展示了FEIG在技术创新、市场拓展、合作创新、战略合作和持续创新方面的努力和成就。

Foxboro I C T Inc公司的发展小趣事

FEIG ELECTRONIC与意法半导体(STMicroelectronics)的合作是其发展史上的又一重要篇章。两家公司共同研发了一种非接触式个性化设置系统,该系统能够在短时间内完成对托盘上有意法半导体ST25DV NFC动态标签的货品的个性化设置,无需打开产品电源或包装。这一创新技术不仅大大提高了产品生产效率,还为客户提供了更加便捷、高效的服务体验。

Curtis Electromusic Specialties Inc公司的发展小趣事

在全球化的大背景下,供应链管理对于企业的运营效率至关重要。CUI公司高度重视供应链的优化和管理,通过建立完善的采购、生产和销售体系,实现了原材料的稳定供应和产品的快速交付。此外,公司还积极引入先进的生产设备和信息化管理系统,提高了生产效率和产品质量,为公司的快速发展提供了有力保障。

乔光电子(FTR)公司的发展小趣事

在电子行业的激烈竞争中,CUI公司凭借其在材料科学领域的深厚积累,成功研发出了一种新型高性能碘化亚铜材料。这种材料不仅具有优异的导电性能,而且稳定性极高,能够在极端环境下保持稳定的性能。凭借这一技术创新,CUI公司的产品迅速获得了市场的认可,并在多个关键领域得到广泛应用,从而实现了公司的快速发展。

问答坊 | AI 解惑

modelsim6.2

modelsim6.2b 有没有资料…

查看全部问答>

你认为做模拟设计的工资多少合适?

不知道你们是不是做IC的,如果是,那你认为这行拿多少工资才是合适的?…

查看全部问答>

freescale 降低噪声方法

飞思卡尔工程师的一个简单的note…

查看全部问答>

WINCE系统,如何检测USB鼠标插拔?

想在应用程序里检测鼠标的插拔情况,当鼠标插上时,显示鼠标光标,当鼠标拔掉时,隐藏鼠标光标,请问这个要怎么做啊!有没有USB设备插拔的消息或事件之类的啊?…

查看全部问答>

一个驱动程序中是不是可以建立多个设备对象,而这些设备对象是不是共用相同的派遣例程?

问题:一个驱动程序中是不是可以建立多个设备对象,而当针对不同的这些设备对象发送的IRP是不是共用相同的派遣例程? 问题产生的背景:     我要写一个监视串口的过滤驱动.从思路是这样的,在驱动中建立一个过滤串口设备对象将其挂在串口驱 ...…

查看全部问答>

STVisualDevelopVersion请教各位!!!!

    在ST Visual Develop Version 4.1.2开发环境下编写程序, 当程序每行代码超过80列时,编译器自动换行,这样对我程序的可读性和注释造成不便。    研究了编译器,这个问题仍然没有解决。请教各位: 怎样设置ST Vi ...…

查看全部问答>

07年购买的LSD-FET430UIF好像不能仿真430F5438

07年购买的LSD-FET430UIF好像不能仿真430F5438…

查看全部问答>

可控硅开关学习

对可控硅的三个主要性能参数不知道指什么,麻烦各位大侠指导一下。谢谢 三个参数分别为:Repetitive Peak Off-State Voltage:600V                 &nbs ...…

查看全部问答>

74HC***和74HC***D有什么区别啊????

今天在网上找了一下74系列资料看见一些芯片只有结尾的D或者A什么的,他们有什么区别啊??像74HC574和74HC574D、74HC138和74HC138D、74HC244 74HC244D 74HC244A三种,他们的封装大小好像也不一样,又有什么区别啊,我看了他们的资料内部结构都是一 ...…

查看全部问答>

谈谈嵌入式系统的可靠性(一)

    许多的操作系统,在宣传自己的优异性时,不外乎上下文切换时间多么短、占用系统资源多么少、功能模块多么多、线程间通信手段多么丰富。谈到可移植性时,不外乎说自己的C语言率多么高,移植需要修改的代码行多么少,等等!这些方面, ...…

查看全部问答>