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 关于内核学习我建议不要上来就读内核而是先了解内核的构成和特性,然后通过思考发现疑问这时再去读内核源码。即先了解概貌在读局部细节。而且内核分成好多部分,不要只是按照顺序去读,…

c多线程

C语言多线程,C11多线程完全攻略

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

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

sqlserver2005仅当使用了列的列表,并且 IDENTITY_INSERT 为 ON 时,才能在表 'SendMealAddress'中为标识列指定显式值。...

ps con.prepareStatement("insert into SendMealAddress values(null,?,?,?,?)"); 表有一列是自增长的标识列,比如第一列是,需要使用这样的格式:ps con.prepareStatement("insert into SendMealAddress(UserId,Concrete…

ipython

使用IPython有哪些好处? IPython介绍 史上最详细、最完全的ipython使用教程,Python使用者必备!——ipython系列之二 https://ipython.readthedocs.io/en/stable/ ipython的用法详解 IPython使用学习笔记 IPython Documentation 为什么要使用I…

Exynos4412 所用内存 —— DDR2

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

iframe中的历史记录问题汇总及解决方案[转]

在做页面统计的时候遇到了两个问题: 1.包含iframe的页面,在IE下按后退按钮不能刷新主页面。隐藏Iframe的src是统计程序的url,每点一次后退,就会发出一次页面加载时间请求。 2.由js动态创建的img标签会发出两个http请求&#xff0c…

Exynos4412启动过程分析

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

高计能计算要实现软着陆

在不久前公布的“2013年中国高性能计算机TOP100排行榜”中,曙光以35%的市场占有率连续5年蝉联市场份额第一。 近日IDC公布的高性能计算市场调查报告(上半年)显示,曙光以0.75亿美元的出货量排名全球第六、亚洲第一,也是世界十强中惟一的中国企…

Exynos4412 所用外存 —— eMMC

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

Centos 上的chrome 如何启用Java

在chrome上启用Java,虽不常见但是很必要,例如soluvm vn的管理工具,模仿串口控制台访问,关键时候,只能靠它。1、到chrome安装目录下,可以用which命令查看:which google-chrome。我的chrome安装目录是/opt/go…

makefile教程

Makefile教程(绝对经典,所有问题看这一篇足够了) http://blog.csdn.net/haoel/article/details/2886 makefile很重要 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工…

mini-uboot 启动过程简单分析

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

MySql中的varchar类型

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

GDB

用GDB调试程序(一)

Exynos4412 Uboot 的使用与烧写

Uboot版本:u-boot-2013.01 开发板:Exynos4412 本文主要是熟悉U-boot 的使用以及如何将Uboot 烧入Exynos4412。当然在这之前首先必须保证开发板上已经有了U-boot。如果没有,请先烧入一个已经编译好的Uboot.bin,可以利用JTAG或DNW。…

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

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

Python2 与 Python3 的常见区别

Python2 与 Python3 的常见区别

关于gcc、glibc和binutils模块之间的关系

一、关于gcc、glibc和binutils模块之间的关系 1、gcc(gnu collect compiler)是一组编译工具的总称。它主要完成的工作任务是“预处理”和“编译”,以及提供了与编译器紧密相关的运行库的支持,如libgcc_s.so、libstdc.so等。 2、bi…

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

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