Exynos4412 Uboot 移植(二)—— Uboot 启动流程分析

uboot启动流程分析如下:

第一阶段:

a -- 设置cpu工作模式为SVC模式
b -- 关闭中断,mmu,cache
v -- 关看门狗
d -- 初始化内存,串口
e -- 设置栈
f -- 代码自搬移
g -- 清bss
h -- 跳c

第二阶段

a -- 初始化外设,进入超循环
b -- 超循环处理用户命令


可见, U-Boot 属于两阶段的Bootloader

第一阶段的文件:

arch/arm/cpu/armv7 /start.S                       平台相关,CPU工作模式设为SVC模式,关MMU,关icahce(CPU相关)

board/samsung/fs4412/lowlevel_init.S     开发板相关:关看门狗,内存初始化,时钟初始化,串口初始化(board相关,初始化最基本设备)


第二阶段的文件:

arch/arm/lib/crt0.S                     _main 函数所在处,初始化SP,为C语言准备,代码重定位,清BSS,设置R0 R1 R2 R8相应寄存器

arch/arm/lib/board.c                   board_init_f 函数 ,填充GD结构体,初始化外设, main_loop()函数超循环

arch/arm/cpu/armv7 /start.S 代码自搬移时会用到

针对uboot2013启动流程图如下:



下面是具体分析:

一、U-Boot 第一阶段代码分析

通常我们通过连接文件知晓程序入口点,入口查看 u-boot.lds


通过链接脚本可知入口为_start,位于arch/arm/cpu/armv7/start.o


第一阶段开始:

1、进入arch/arm/cpu/armv7/start.S

a -- 异常向量表设置



b -- 设置CPU处于SVC工作模式



d -- 协处理器 p15 的 c12 寄存器来重新定位



e、Bl  cpu_init_cp15(使分支预测无效,数据)


关闭数据预取功能;

DSB:多核CPU对数据处理指令

ISB:流水线清空指令;


关闭MMU,使能I-cache

NOTE:

分支预测:在流水线里,会将后面的代码优先加载到处理器中,由于是循环,会使后面加载的代码无效,故出现了分支预测技术。(统计跳的次数来选择装载循环的代码还是下面的代码)。


f、Bl  cpu_init_crit




2、跳到Low_level_init,位于board/samsung/fs4412/lowlevel_init.S

a、关闭看门狗


b、比较当前pc指针域TEXT_BASE的高8位是否一样来判断,当前代码是否在内存中



c、对系统时钟初始化



d、对内存初始化


e、对串口初始化


结束后返回 start.S

第一阶段结束,总结如下:

1 前面总结过的部分,初始化异常向量表,设置svc模式

2 配置cp15,初始化mmu cache tlb

3 板级初始化,clk,memory,uart初始化


二、第二阶段开始:


按"CTRL + ] ", 发现 _main 在两处有定义:


这里我们选择第一个Bl  _main ,跳转到arch/arm/lib/crt0.S


1、初始c运行环境(看注释就知道,初始化C运行环境,并调用board_init_f 函数


功能:

初始化sp ,为支持C语言做准备;

保存128B 放GD结构体,存放全局信息,GD的地址存放在r8中;

跳转到 board_init_f 函数,其在arch/arm/lib/board.c 处定义;


2、跳转到arch/arm/lib/board.c


功能:

对全局信息GD结构体进行填充:

291行:mon_len 通过链接脚本可以知道存放的是uboot代码大小;

294行:fdt_blob 存放设备数地址;

303行:循环执行init_fnc_t数组的函数,作硬件初始化;


a -- init_fnc_t数组的函数定义

     初始化硬件


b -- Dram_init初始化成功之后,剩余代码将会对sdram空间进行规划。


可以看到addr的值由CONFIG_SYS_SDRAM_BASE加上ram_size。也就是到了可用sdram的顶端。


e--继续对gd结构体填充


如果icahe 与 dcache 是打开的,就留出 64K 的空间作为 tlb 空间,最后 addr 就是tlb 地址,4K对齐。


f --填充完成将信息拷贝到内存指定位置




2 -- 继续回到 _main

按"CTRL + O"回到跳转前的函数,即 arch/arm/lib/crt0.S


功能:

将 r8 指向新的 gd 地址;

代码重定位;

 对lr 的操作为了让返回时,返回的是重定位的here处


3 -- 代码自搬移

代码自搬移,防止与内核冲突,代码位于arch/arm/cpu/armv7/start.S

循环将代码搬移到指定高地址

这里只是将链接脚本中_image_copy_end_start中的代码,其它段还没有操作。

在这里我们有疑惑就是将代码重定位到高地址,那运行的地址不就和链接地址不一样了,那运行可能不正常?这个疑惑就是.rel.dyn帮我们解决了,主要还是编译器帮我们做的工作,在链接中有如下:【参考:http://blog.csdn.net/skyflying2012/article/details/37660265


4 -- 重定位到高地址之后,再次回到 _main(arch/arm/lib/crt0.S)

      此时回到的是刚才的重定位的 here 处


关 icache,保证数据从SDRAM中更新,更新异常向量表,因为代码被重定位了;

清BBS;



调用board_init_r主要是对外设的初始化。

R0=gd

R1=RELOCADDR


5 -- Main_loop 函数进入超循环(arch/arm/lib/board.c)


Main_loop函数主要功能是处理环境变量,解析命令

install_auto_complete();  //安装自动补全的函数,分析如下 

getenv(bootcmd)

bootdelay(自启动)

如果延时大于等于零,并且没有在延时过程中接收到按键,则引导内核。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402076.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux内核学习四库全书

http://blog.csdn.net/21aspnet/article/details/6585602 关于内核学习我建议不要上来就读内核而是先了解内核的构成和特性,然后通过思考发现疑问这时再去读内核源码。即先了解概貌在读局部细节。而且内核分成好多部分,不要只是按照顺序去读,…

Exynos4412 Uboot 移植(一)—— Uboot 编译流程分析

Uboot 所用版本 u-boot-2013.01 u-boot-2013.01 中有上千文件,要想了解对于某款开发板,使用哪些文件、哪些文件首先执行、可执行文件占用内存的情况,最好的方法就是阅读它的Makefile。 根据顶层Readme文件的说明: 可以知道如果使…

Exynos4412 所用内存 —— DDR2

一、SDRAM 二、DDR 三、DDR2 四、DDR2的配置

Exynos4412启动过程分析

学习Exynos4412启动流程前,我们先看看三星4412芯片启动框图: 我们从图中可以看到4412内部有64K的ROM和256K SRAM,在ROM中已经固化好了一段代码,当硬件上电后首先运行的就是这段代码,这段代码三星起名为BLO(…

Exynos4412 所用外存 —— eMMC

Exynos4412所用外存不是原来的Nand Flash 与 Nor Flash,而是eMMC。eMMC是什么呢?和Nand Flash有什么区别呢? 一、eMMC概述 eMMC(Embeded MultiMedia Card):它并非是一种全新尺寸的存储卡,而…

mini-uboot 启动过程简单分析

单片机有最小系统,所谓最小系统,就是单片机能正常工作所需要的最少外设。对于Uboot来说,同样有个最小系统,因为Uboot最主要的功能就是引导内核。下面我们通过一个简单的Mini-Uboot来分析Uboot的启动加载过程。(只是分析…

MySql中的varchar类型

2019独角兽企业重金招聘Python工程师标准>>> MySql中的varchar类型(转) 今天新开始的项目在做数据库设计,发现自己对MySql的varchar类型还不熟悉,故又上网收集资料整理如下。 1.varchar类型的变化 MySQL 数据库的va…

进入保护模式(三)内存的分页

2019独角兽企业重金招聘Python工程师标准>>> 一、分页 先入为主理解的分页和系统中内存内应的分页 1.弄过数据库数据查找展示,有个数据分页展示的概念,这个的目的是为了速度、和展示效果上的提升 2.内存的分页又是怎么回事哪? …

C#实现简单的 Ping 的功能,用于测试网络是否已经联通

1 /// <summary>2 /// 是否能 Ping 通指定的主机3 /// </summary>4 /// <param name"ip">ip 地址或主机名或域名</param>5 /// <returns>true 通&#xff0c;false 不通</returns>6 …

Binutils工具集 解析

对于嵌入式系统开发&#xff0c;掌握相应的工具至关重要&#xff0c;它能使我们解决问题的效率大大提高。目前&#xff0c;可以说嵌入式系统的开发工具是GNU的天下&#xff0c;因为来自GNU的GCC编译器支持大量的目标处理器。除了GCC&#xff0c;还有一个非常重要的、同样来自于…

ARM 软中断指令SWI

前面我们学习ARM工作模式中&#xff0c;处理器模式切换可以通过软件控制进行切换&#xff0c;即修改CPSR模式位&#xff0c;但这是在特权模式下&#xff0c;当我们处于用户模式下&#xff0c;是没有权限实现模式转换的。若想实现模式切换&#xff0c;只能由另一种方法来实现&am…

yum install 失败

https://blog.csdn.net/weixin_45621658/article/details/110734514 原因&#xff1a;centos6的默认源在2012年-12月左右被官方搞掉了 下列是错误详情 Bash [rootc8-20 ~]# yum makecache Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile YumRepo …

sphinx

2019独角兽企业重金招聘Python工程师标准>>> ./configure --prefix/usr/local/sphinx --with-mysql/usr/local/mysql make && make install cd /usr/local/sphinx/etc cp sphinx.conf.dist sphinx.conf vim sphinx.conf mysql -u test < /usr/local/sphi…

Exynos4412裸机开发综合练习

下面是一个案例需求&#xff1a; 1、编写一段程序,该程序的主要功能是监控电路板上的电压值,若电压值超过当前的电压限制则通过蜂鸣器报警,通过按键解除报警; 2、其具体要求如下; a) 程序下载20s后,进入电压采集状态(使用RTC ALARM功能完成), 要求1s采集1次电路板电压值;(采用…

Exynos4412 裸机开发 —— IIC总线

前言&#xff1a; I2C(Inter-Integrated Circuit)总线(也称 IIC 或 I2C) 是有PHILIPS公司开发的两线式串行总线&#xff0c;用于连接微控制器及外围设备&#xff0c;是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式&#xff0c;具有接口线少、控制方式…

Exynos4412裸机开发 —— A/D转换器

一、Exynos4412 A/D转换器概述 1、简述 10位或12位CMOS再循环式模拟数字转换器&#xff0c;它具有10通道输入&#xff0c;并可将模拟量转换至10位或12位二进制数。5Mhz A/D 转换时钟时&#xff0c;最大1Msps的转换速度。A/D转换具备片上采样保持功能&#xff0c;同时也支持待机…

Exynos4412裸机开发 —— UART

一、Exynos4412 UART 的特性 Exynos4412 中UART&#xff0c;有4 个独立的通道&#xff0c;每个通道都可以工作于中断模式或DMA 模式&#xff0c;即 UART 可以发出中断或 DMA 请求以便在UART 、CPU 间传输数据。UART 由波特率发生器、发送器、接收器和控制逻辑组成。 使用系统时…

Exynos4412裸机开发 —— 看门狗定时器

一、看门狗定时器概述 看门狗&#xff08;WatchDog Timer) 定时器和PWM的定时功能目的不一样。它的特点是&#xff0c;需要不同的接收信号&#xff08;一些外置看门狗芯片&#xff09;或重新设置计数器&#xff0c;保持计数值不为0。一旦一些时间接收不到信号&#xff0c;或计数…

Exynos4412裸机开发 —— RTC 实时时钟单元

RTC(Real-Time Clock) 实时时钟。RTC是集成电路&#xff0c;通常称为时钟芯片。在一个嵌入式系统中&#xff0c;通常采用RTC来提供可靠的系统时间&#xff0c;包括时分秒和年月日等&#xff0c;而且要求在系统处于关机状态下它也能正常工作&#xff08;通常采用后备电池供电&am…

Exynos4412裸机开发——中断处理

以KEY2控制LED3亮灭为例&#xff1a; 一、轮询方式 【0】检测按键k2&#xff0c;按键k2按下一次&#xff0c;灯LED2闪一次。 【1】查看原理图&#xff0c;连接引脚和控制逻辑 &#xff08;1&#xff09;按键k2 连接在GPX1_1引脚 &#xff08;2&#xff09;控制逻辑 k2 按…