ARM+Linux系统启动流程分析----bootloader初始化系统

来源:互联网 发布:室内温度测量软件 编辑:程序博客网 时间:2024/05/16 16:54

        开发环境如下:

                                        PC操作系统:RetHat Enterprise Linux6.3版本,内核版本:linux-2.6.39

                                        交叉工具链:arm-linux-xxx 4.3.2

                                        开发板:Friendly Mini2440 :arm9内核,64M SDRAM,256M NAND FLASH

                                        bootloader:u-boot-2009.08

                                        开发板内核版本:linux-2.6.32

        上一篇文章介绍了S3C2440 处理器的启动流程,即以“stepping stone”作为跳板,系统上电后CPU 自动将Bootloader 的前4K内容从NAND flash 拷贝到“stepping stone ”中,这4K bootloader再将剩余的bootloader拷贝到内存中,最后转到内存中运行bootloader。

这篇文章就是要讨论bootloader 的整个初始化过程。

        简单来讲,bootloader的工作就是将CPU以及板载的资源进行初始化,为系统运行操作系统做好硬件准备,然后将内核拷贝到内存中,最后将控制权交给内核。

        笔者选择的bootloader是业界的老大哥---UBOOT,版本号:u-boot-2009.08,下载地址:ftp://ftp.denx.de/pub/u-boot/,因为此版本的uboot 并不支持我的开发板mini2440,因此需要自己进行移植,但是这里并涉及到移植的问题。移植的问题需要一个系列的文章进行讲述,以后有时间笔者再撰文详述。

        回到正题,bootloader到底进行了哪些工作?最简单的分析办法当然是进行源码分析。为了进行源码分析,我们需要用SourceInsight 建立一个工程,这样分析起来就很方便了。分析步骤如下:

1、找到程序入口

        怎么找程序入口?这种大型的软件,编译链接的工作往往需要通过Make工具进行管理,如此我们就可以找到Makefile,分析它的编译规则,找到对应板子的链接器脚本,通过链接器脚本的分析必然能够知道真个可执行文件的组成,那程序的入口问题自然迎刃而解。

        首先到 .../u-boot-2009.08/  即uboot的顶层目录,用文本编辑器打开顶层的Makefile 找到板子的编译选项,搜索结果如下:

       

事实上在Makefile 中每个支持的板子都会有这么一项,这就是整个板子的配置规则,可以看到第二个高亮的"mini2440",这表明在 board/samsung/ 目录中有一个目录 board/samsung/mini2440/ 这个目录就是我的板子的目录,内容如下:


这个目录时笔者在移植uboot时复制smkd2410 目录经过修改得到的。

        找到了Makefile 也知道了板子的目录,现在可以查找链接器脚本了,不同的u-boot版本可能链接器脚本的位置不同,但在u-boot-2009.08 这个版本中,链接器脚本放在顶层目录:u-boot.lds ,不过这个文件时需要经过编译才能生成,执行配置命令:make mini2440_config ,然后执行:make 编译,编译结束后可以在顶层目录中发现 u-boot.lds 文件。使用文本编辑器打开这个文件,可以看到真个可执行程序的链接情况,如下:




可以看到上图中.text 代码段,第一个文件是:cpu/arm920t/start.o ,入口点是ENTRY(_start),即该文件的_start 标号就是真个程序的入口点。(事实上该目标文件是由cpu/arm920t/start.S编译而成

2、分析U-BOOT 工作流程

        找到程序程序的入口点以后就可以分析uboot的工作流程了。具体的过程很简单,就是循着代码,看注释,看看哪些地方完成了什么工作。下图是笔者分析后得到的流程图(这里读者只关注硬件部分的初始化,还有很多软件部分的初始化没关注):


        从上图可以看出,uboot完成的都是一些简单的初始化工作,包括CPU本身和板载资源的初始化,当然还有一些软件的初始化,比如各种命令的代码实现、环境变量的初始化等等,但是这些属于存软件的初始化u-boot做了就做了,没什么值得讨论的。只要在后面知道它做了这些事,而我们能够使用它完成的命令就行。从上面并没有看到加载内核的信息,加载内核和启动内核的功能其实是u-boot 完成的命令,我们只要在16 解析、执行用户命令那一步在终端中输入命令,u-boot自然会完成我们的命令。关于u-boot支持的命令不在本文的讨论范围,请读者参考其他资料。

        







0 0