设为首页 加入收藏

TOP

从0移植uboot (二) _启动流程分析
2017-03-01 08:15:34 】 浏览:346
Tags:移植 uboot 启动 流程 分析

经过了上一篇的配置,我们已经执行make就可以编译出一个uboot.bin,但这还不够,首先,此时的uboot并不符合三星芯片对bootloader的格式要求,其次,此时的uboot.bin也没有结合我们的开发板进行配置,还无法使用。而要进行这样的个性化配置,前提条件就是对uboot开机流程和编译系统有所了解,本文主要讨论前者。uboot是一个两阶段bootloader,第一阶段主要做硬件直接相关的初始化,使用汇编编写;第二阶段主要为操作系统的运行准备环境,主要用C编写,这里以ARM平台为例分析其启动流程。下面是启动过程中主要涉及的文件


第一阶段的主要文件和任务如下


下面这三行代码非常重要,是整个uboot启动过程的交叉点


这是位于目录的初始化文件,主要完成特定开发板的初始化工作,包括时钟、内存和串口等。


执行完lowlevel_init.S,依据上面那三行代码,执行流程就该回到start.S执行156行跳转到_main,开始执行第二阶段。


从start.S跳转到_main ,标致着uboot启动过程的第二阶段的开始。在第二阶段,核心文件是crt0.S,但我们最关心的是其中回调板级C程序的入口位置。第二阶段的流程如下:


进入第二阶段是首要任务就是准备C语言运行的环境:


下面这个函数就是uboot初始化过程中执行的第一个C函数,可以看作这个文件的入口函数。函数比较长,我就不逐句分析了,这个函数主要的作用就是执行一些高等级的初始化。其中最重要的就是准备全局信息GD结构体


函数board_init_f()返回后,继续执行crt0.S中115行之后的部分,主要的工作是执行代码自搬移,代码重定位等工作,执行完这些之后,我们我们找到了最感兴趣的下面这几句


--167-->跳转到board_init_r函数执行,这次跳出去这个文件的语句就执行完毕了,不会再回来了


这也是最后一次跳转到这个文件了,执行额函数如下


main_loop()的实现在common/main.c,它的主要功能就是循环检测输入的命令并执行,其中一个环境变量bootdelay(自启动)的设置决定了是否启动内核,如果延时大于等于零,并且没有在延时过程中接收到按键,则引导内核。ootloader 要想启动内核,可以直接跳到内核的第一个指令处,即内核的起始地址,这样便可以完成内核的启动工作了。但是要想启动内核还需要满足下面的一些条件,这些条件在Linux内核文档"/Documentation/kernel-parameters.txt"中有说明,
1、cpu 寄存器设置


2、cpu 模式


3、Cache、MMU


4、设备


5、PC 为内核的起始地址


关于uboot的启动分析,本文只是冰山一角的一丢丢,不过希望通过我的这一堆废话下来,能帮助你对uboot的启动流程有一个整体的认识,当然,如果文中有错误,欢迎批评指正^-^


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇从0移植uboot (一) _配置分析 下一篇从0移植uboot(三) _编译最小可用u..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目