Chinaunix首页 | 论坛 | 博客
  • 博客访问: 852657
  • 博文数量: 321
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 936
  • 用 户 组: 普通用户
  • 注册时间: 2013-02-23 11:25
文章分类

全部博文(321)

文章存档

2017年(1)

2016年(10)

2015年(61)

2014年(187)

2013年(62)

分类: 嵌入式

2013-07-05 00:17:17

一.Bootloader与嵌入式linux的关系
     一个嵌入式系统从软件角度来看分为四个层次:
   1.引导加载程序。包括固化在固件(firmware)中的 boot 代码(可选),和 Boot             Loader 两大部分。
   2. Linux 内核。特定于嵌入式板子的定制内核以及内核的启动参数。 
   3. 文件系统。包括根文件系统和建立于 Flash 内存设备之上文件系统。通常用 ram disk 来作为 root fs。 
   4. 用户应用程序。特定于用户的应用程序。

二、 Boot Loader 的概念 
   简单地说,Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通 过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
   Boot Loader 的主要运行任务就是将内核映象从硬盘上读到 RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。
     通常,Boot Loader 是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的 Boot Loader 几乎是不可能的。
Boot Loader 的安装媒介


      系统加电或复位后,所有的 CPU 通常都从某个由 CPU 制造商预先安排的地址上取指令。比如,基于 ARM7TDMI core 的 CPU 在复位时通常都从地址 0x00000000 取它的第一条指令。
四. Boot Loader 的主要任务与典型结构框架
   
    Boot Loader 的启动过程可分为单阶段(Single   Stage)和多阶段(Multi-Stage)两种
       
   通常多阶段的 Boot Loader 能提供更为复杂的功能,以及更好的可移植性。从固态存储设备上启动的 Boot Loader 大多都是 2 阶段的启动过程,也即启动过程可以分为 stage 1和 stage 2 两部分。


      stage1完成初始化硬件,为stage2准备内存空间,将stage2复制到内存中,设置堆栈然后跳转到stage2



     一个同时装有 Boot Loader、内核的启动参数、内核映像和根文件系统映像的固态存储设备的典型空间分配结构图 :

多阶段的 Boot Loader
    Boot Loader 的 stage1 通常包括以下步骤(以执行的先后顺序):
     ·硬件设备初始化。   ·为加载 Boot Loader 的 stage2 准备 RAM 空间。   ·拷贝 Boot Loader 的 stage2 到 RAM 空间中。   ·设置好堆栈。   ·跳转到 stage2 的 C 入口点。


      Boot Loader 的 stage2 通常包括以下步骤(以执行的先后顺序):
 
        ·初始化本阶段要使用到的硬件设备。  ·检测系统内存映射(memory map)。  ·将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中。  ·为内核设置启动参数。  ·调用内核。
bootloader 的 stage2 可执行映象刚被拷贝到 RAM 空间时的系统内存布局 
一、Broadcom Bootloader基本架构
    大致可以分为三部分:
   1、固件部分。这部分即为stage1,为加电或复位后CPU执行的最开始的指令地址。它不会被加载进RAM,只初始化硬件, 以及将mini-loader加载进内存
      
      2、mini-loader部分。这部分主要任务是将CFE加载进内存,并且解压


     3、CFE部分。这部分进行硬件环境初始化,并且进行image的更新,以及加载kernel

二、Broadcom Bootloader引导过程代码分析
  (一)加载Mini-loader
   Broadcom Bootloader在系统加电以后从 src\shared\boot.S 中的第一行代码开始执行


     boot.S文件的主要任务有:


    1.判断芯片类型
    2.设置时钟
    3.缓存的初始化
    4.把Mini-loader加载进RAM
    5.C跳转,即进入Mini-loader中执行c_main函数

二)执行Mini-loader
     文件:src\shared\load.c
     函数名:c_main()
                   {
                   …系统初始化…
                   load();//加载CFE,并解压缩;
                             …….
                             ((void (*)(void)) LOADADDR)(); //跳转到CFE中执行CFE_main()
                   }

(三)执行CFE
    文件:src\cfe\cfe\main\cfe_main.c
    函数名:cfe_main()
   
  主要功能:完成硬件的初始化,包括ether   driver,PCI,console等外部设备的初始化,image更新,引导kernel等

void cfe_main(int a,int b)
              {
                          …… 
                          board_console_init(); //硬件初始化,包括LED的初始化
                          cfe_say_hello();         //CFE开始信息
                          board_device_init();   //设备初始化,包括ether driver等设备
                          cfe_startup_info();     //输出环境信息,例如存储空间使用情况
                          cfe_init_ui(); //UI接口的初始化,包括console命令行初始化
                          board_final_init(); //硬件部分初始化
                          cfe_autostart(); //image更新,加载kernel
                          cfe_command_loop(); //如果上一步按了Ctrl-c,则在此循环执行
                          ……
               }


ui_docommand(“boot…” );
Ui_cmd_boot()
ui_cmd_bootcommon(cmd,argc,argv,flags)
cfe_boot(la->la_loader,la)
cfe_go(la)
cfe_start(la->la_entrypt)
cfe_launch(ept)
进入Kernel执行






阅读(1223) | 评论(0) | 转发(0) |
0

上一篇:bootargs参数分析

下一篇:bcm_CFE

给主人留下些什么吧!~~