BootLoader的stage1

  1.基本的硬件初始化

    这是BootLoader一开始就执行的操作,其目的是为stage2的执行以及随后的kernel的执行准备好一些基本的硬件环境。它通    常包括以下步骤

 ①屏蔽所有中断。为中断提供服务通常是OS设备驱动程序的责任,因此在BootLoader的执行全过程中可以不比响应任何中断。中    断屏蔽可以通过写CPU的中断屏蔽寄存器或者状态寄存器(比如ARM的CPSR寄存器)来完成。

②设置CPU的时钟和频率

③RAM初始化。包括正确地设置系统的内存控制器的功能寄存器以及各内存库控制寄存器等

④初始化LED。通过GPIO来驱动LED,其目的是表明系统的状态是OK还是ERROR。如果板子没有LED,那么也可以通过初始化UART向串口打印BootLoader的Logo字符信息来完成这一点。

⑤关闭CPU内部  指令/数据 Cache。

  2.为加载stage2准备RAM空间

通常把stage2加载到RAM空间中来执行,为了获得更快的执行速度。因此必须为加载BootLoader的stage2准备好一段可用的RAM空间。

stage2是C语言执行代码,因此在考虑空间大小时,除了stage2可执行映像的大小外,还必须把堆栈空间也考虑进来。此外,空间大小最好是momery page大小(通常是4KB)的倍数。一般而言,1M的RAM空间就足够了。具体的范围地址可以任意安排,比如blob就将它的stage2可执行映像安排到从系统RAM起始地址0xc0200000开始的1M空间内执行。但是,将stage2安排到整个RAM空间的最顶1MB(RamEnd-1MB  ~  RamEnd  )是一种值得推荐的方法。

    另外,得确保所有安排的地址范围是可读写的RAM空间,因此,必须对你所安排的地址范围进行测试。具体测试方法可以采用类似blob的方法,也即:以memory page 为被测试单位,测试每个memory page 开始的两个字是否可读写。步骤如下:

    ①.先保存memory page一开始的两个字的内容。

    ②.向这两个字中写入任意的数字。比如第一个字写0x55第二个字写入0xaa

    ③.然后立即将这两个字读回。如果读到的内容不是0x55和0xaa,说明这个memory page 所占据的地址范围不是一段有效的RAM

    ④.再向这两个字中写入任意数字,比如0xaa和0x55

    ⑤.读取这两个字,如果不是0xaa和0x55那么说明这个memory page 所占据的地址空间不是一段有效的RAM。

    ⑥.恢复这两个字的内容,测试完毕。

  3.拷贝stage2到RAM中

    确定2点:①.stage2的可执行映像在固态设备存放的起始地址和终止地址

         ②.RAM空间的起始地址

  4.设置堆栈指针sp

  堆栈指针的设置是为了执行C语言代码做好准备。通常可以把sp的值设置为( stage2_end - 4 ),也就是第二节所安排的那个1MB的RAM空间的最顶端(堆栈向下生长)。经过这些步骤后,系统的物理内存布局如下:

    5.经过上述的步骤后,就跳转到stage2去执行了

    

BootLoader 详解(2)的更多相关文章

  1. 【嵌入式开发】 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计)

    作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42462795 转载请著名出处 相关资源下载 :  -- u-boo ...

  2. BootLoader 详解(1)

    1. Boot Loader的概念 BootLoader就是在操作系统内核运行前之前运行的一段小程序.通过这段小程序,可以初始化硬件设备.建立内存空间映射图,从而将系统的软硬件带到一个合适的状态,以便 ...

  3. BootLoader 详解(3)

    BootLoader的stage2 stage2的代码是C语言来实现的,以便于实现更复杂的功能和取得更好的代码可读性和移植性.它与普通C语言程序不同的是,在编译和链接BootLoader这样的程序时, ...

  4. CFE Bootloader详解 — 引导过程

    CFE命令 CFE引导过程 系统加电后,CFE从boot.S (src/shared/boot.S)开始执行,完成判断芯片类型.设置时钟.初始化缓存.把自身加载进RAM等任务后,跳转到c_main() ...

  5. 【转载】 硬盘主引导记录(MBR)及其结构详解

    硬盘的0柱面.0磁头.1扇区称为主引导扇区,FDISK程序写到该扇区的内容称为主引导记录(MBR).该记录占用512个字节,它用于硬盘启动时将系统控制权交给用户指定的,并在分区表中登记了的某个操作系统 ...

  6. uboot mkimage使用详解

    mkimage使用详解uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件. mkimage在制作映象文件的时候,是在原来的可执行映象文件的 ...

  7. 引用 mkimage使用详解

    引用 鱼 的 mkimage使用详解  uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件. mkimage在制作映象文件的时候,是在原来 ...

  8. Android的init过程详解(一)

    Android的init过程详解(一) Android的init过程(二):初始化语言(init.rc)解析 本文使用的软件版本 Android:4.2.2 Linux内核:3.1.10 本文及后续几 ...

  9. 黑苹果引导工具 Clover 配置详解及Clover Configurator使用

    黑苹果引导工具 Clover 配置详解及Clover Configurator使用  2017-03-11 14:01:40 by SemiconductorKING 转自:@三个表哥   简介: 可 ...

随机推荐

  1. windows 下mysql每日定时备份的几种方法

    第一种:新建批处理文件 backup.dat,里面输入以下代码:  代码如下 复制代码 net stop mysql xcopy "C:/Program Files/MySQL/MySQL ...

  2. Selenium定位二 --多个元素定位方法 和层级定位方法

    定位多个元素: findElements()方法可以返回一个符合条件的元素List 组 如: public void hitUpdatePersonnel(WebDriver driver, int ...

  3. Java多线程之ConcurrentSkipListMap深入分析(转)

    Java多线程之ConcurrentSkipListMap深入分析   一.前言 concurrentHashMap与ConcurrentSkipListMap性能测试 在4线程1.6万数据的条件下, ...

  4. php wampserver 80 端口无法开启的解决方法

    下载Microsoft Visual C++ 2005 Redistributable Package x86 和 x64(vc_redist.x86.exe/vc_redist.x64.exe) 安 ...

  5. UIApplication的使用

    //// UIApplication的使用//  IOS笔记////  Created by **** on ****.//  Copyright © 2013年 ***. All rights re ...

  6. 一个简单的Lua解释器

    #include "stdafx.h" #include<stdarg.h> #include<stdlib.h> #include<stdio.h& ...

  7. CC3000 主机驱动API介绍

    CC3000作为是一种简单集成,简单实用的无线宽带设备,她集成了完整的802.11协议栈,802.11个人安全请求:IP网络协议栈,CC3000主机驱动对CC3000硬件访问时很轻松的.CC3000逐 ...

  8. 信号处理基础概念比较----频谱vs功率谱vs能谱

    频谱: 对动态信号在频率域内进行分析,分析的结果是以频率为坐标的各种物理量的谱线和曲线,可得到各种幅值以频率为变量的频谱函数F(ω).频谱是个很不严格的东西,常常指信号的Fourier变换.频谱分析中 ...

  9. LINUX yum用法

    1.确保RHEL5中已经安装了yum [root@lvs-master ~]# rpm -qa |grep yumyum-metadata-parser-1.1.2-3.el5yum-updatesd ...

  10. [cross compile]cygwin和mingw

    转自:http://blog.csdn.net/embededvc/article/details/6829010 1. MinGW和CygWin/gcc概念 Unix下编译通过的C代码,在win32 ...