当前位置: 代码迷 >> 综合 >> S5pc100---uboot启动流程分析
  详细解决方案

S5pc100---uboot启动流程分析

热度:39   发布时间:2024-01-09 23:45:20.0

====================================================================================

由于水平有限,文档中难免有错误的地方,希望大家踊跃拍砖。有什么问题请发动我的邮箱chw@farsight.cn告诉我。

====================================================================================

一、Bootleader简介

       Bootloader是进行嵌入式开发必然会接触的一个概念,它是操作系统在运行之前执行的一小段程序。通过这一小段程序,我们可以初始化硬件设备、建立内存空间的映射表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备。这句话是比较官方的说法,通俗的说法就是,若是我们想要让我们的操作系统在我们的开发板上运行起来,我们就需要对我们的开发板进行一些基本的配置和初始化,然后让我们的操作系统跑起来。

       若是常玩windows操作系统的人肯定知道,我们windows启动的时候有一个BIOS的固件程序。它的作用就是保持我们计算机的输入、输出、系统的一些配置信息,还有我们开机上电自检我们的硬件程序是否有问题,然后启动加载操作系统。然而我们的嵌入式系统中,并么有像BIOS那样的固件程序,因此我们整个操作系统的加载就依靠我们bootloader来实现了。它的主要作用是引导我们的内核镜像。

下面说说我们嵌入式存储设备通常包括的四个分区:

 

 

第一个分区------------>存 放的当然是我们u-boot.bin

第二个分区------------>存放的是我们u-boot要传给内核的参数

第三个分区------------>存放的是我们kernel镜像

第四个分区------------>存放的是我们的文件系统

我们Bootloader是基于特定硬件平台来实现的,因此几乎不可能为所有的嵌入式系统建立一个通用的Bootloader,不同的处理器架构都有不同的Bootloader,Bootloader不但依赖于cpu的体系结构,还依赖于嵌入式系统板级设备的配置。对于2块不同的板子而言,即使他们使用的是相同的处理器,要想让运行在一块板子上的Bootloader程序也能运行在另一块板子上,一般也需要修改Bootloader的源程序。

uboot就是我们bootlodaer的一种,大多数嵌入式平台使用的都是我们的uboot。

二、Bootleader之uboot目录结构分析

我们了解一个uboot运行流程之前,我们先需要了解它的层次结构。本文中所使用的u-boot是u-boot-2010.03.tar.以下内容就是我的目录层次结构:

U-boot目录结构

我们可以将整个uboot源码的目录总结如下:

 

三、u-boot的工作流程

u-boot系统启动流程 大多少bootleader都分为stage1和stage2两部分,u-boot也不例外。我们依赖于我们CPU体系架构的代码(如设备初始化代码等)通常都是放在stage1且可以用汇编语言实现来实现的,而stage2则通常用C语言来实现,这样可以实现复杂的功能。而且有更好的可移植性和可读性。如图所示:

 

 

思考:为什么bootloader刚开始的时候有一段的汇编代码呢?为什么不用C写呢?

说到这个,我们就需要说到两个概念----------->编译地址和运行地址。

(1)编译地址

  32位的处理器,它的每一条指令是4个字节,以4个字节存储顺序,进行顺序执行,CPU是顺序执行的,只要没发生什么跳转,它会顺序进行执行编译器会对每一条指令分配一个编译地址,这是编译器分配的,在编译过程中分配的地址,我们称之为编译地址。

(2)运行地址

     是指程序指令真正运行的地址,是由用户指定的,用户将运行地址烧录到哪里哪里就是运行的地址。

(3)举例说明     

     比如有一个指令的编译地址是0x5,实际运行的地址是0x200,如果用户将指令烧到0x200上,那么这条指令的运行地址就是0x200,

      当编译地址和运行地址不同的时候会出现什么结果?

      答:结果是不能跳转,编译后会产生跳转地址,如果实际地址和编译后产生的地址不相等,那么就不能跳转。

 

     C语言编译地址:都希望把编译地址和实际运行地址放在一起的,但是汇编代码因为不需要做C语言到汇编的转换,可以认为的去写地址,所以直接写的就是他的运行地址这就是为什么任何bootloader刚开始会有一段汇编代码,因为起始代码编译地址和实际地址不相等,这段代码和汇编无关,跳转用的运行地址。

 

三、u-boot代码分析

不论我们做什么事情,都需要要到入口,只要知道了入口,那么后面的以一切都好办了。那么我们uboot的入口在哪里呢?刚刚在最开始的时候给大家列出了,我们u-boot的目录层次结构。大家通过这个层次结构有没有什么想法呢?好了,言归正传。

根据我列出的目录机构,我们首先思考,我们使用的是什么型号的开发板,它是基于什么架构的。这里我是用的是S5PC100开发板,它是基于三星的cortex_a8的处理器。

首先我们进入 cpu/