BootLoader 详解(2)
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)的更多相关文章
- 【嵌入式开发】 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42462795 转载请著名出处 相关资源下载 : -- u-boo ...
- BootLoader 详解(1)
1. Boot Loader的概念 BootLoader就是在操作系统内核运行前之前运行的一段小程序.通过这段小程序,可以初始化硬件设备.建立内存空间映射图,从而将系统的软硬件带到一个合适的状态,以便 ...
- BootLoader 详解(3)
BootLoader的stage2 stage2的代码是C语言来实现的,以便于实现更复杂的功能和取得更好的代码可读性和移植性.它与普通C语言程序不同的是,在编译和链接BootLoader这样的程序时, ...
- CFE Bootloader详解 — 引导过程
CFE命令 CFE引导过程 系统加电后,CFE从boot.S (src/shared/boot.S)开始执行,完成判断芯片类型.设置时钟.初始化缓存.把自身加载进RAM等任务后,跳转到c_main() ...
- 【转载】 硬盘主引导记录(MBR)及其结构详解
硬盘的0柱面.0磁头.1扇区称为主引导扇区,FDISK程序写到该扇区的内容称为主引导记录(MBR).该记录占用512个字节,它用于硬盘启动时将系统控制权交给用户指定的,并在分区表中登记了的某个操作系统 ...
- uboot mkimage使用详解
mkimage使用详解uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件. mkimage在制作映象文件的时候,是在原来的可执行映象文件的 ...
- 引用 mkimage使用详解
引用 鱼 的 mkimage使用详解 uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件. mkimage在制作映象文件的时候,是在原来 ...
- Android的init过程详解(一)
Android的init过程详解(一) Android的init过程(二):初始化语言(init.rc)解析 本文使用的软件版本 Android:4.2.2 Linux内核:3.1.10 本文及后续几 ...
- 黑苹果引导工具 Clover 配置详解及Clover Configurator使用
黑苹果引导工具 Clover 配置详解及Clover Configurator使用 2017-03-11 14:01:40 by SemiconductorKING 转自:@三个表哥 简介: 可 ...
随机推荐
- 计算DNA中每种核苷酸的数目
问题描述:计算DNA中每种核苷酸的数目 输入文件内容: 代码: 输出结果:
- JS几种table切换
1.使用className <!doctype html> <html lang="en"> <head> <meta charset=& ...
- Objective-c——UI基础开发第十二天(相册展示)
一.知识点 模仿新特性 UICollectionViewFlowLayout自定义布局 相册 瀑布流(淘宝购物之类的 二.复习 a.UICollectionView 和 tableview共享一套AP ...
- MongoDB学习笔记一:入门
文档:多个键及其关联的值『有序』地放置在一起. {"greeting" : "Hello, world!", "foo" : 3}集合:一组 ...
- Hadoop学习11--Ha集群配置启动
理论知识: http://www.tuicool.com/articles/jameeqm 这篇文章讲的非常详细了: http://www.tuicool.com/articles/jameeqm 以 ...
- mysql高效分页方案及原理
很久以前的一次面试中,被面试官问到这个问题,由于平时用到的分页方法不多,只从索引.分表.使用子查询精准定位偏移以外,没有使用到其它方法. 后来在看其它博客看到了一些不同的方案,也一直没有整理.今天有时 ...
- oracle的char和varchar类型
源地址:https://zhidao.baidu.com/question/140310197.html varchar与char的区别就在于是否可变长度.char(5)就是定义一个5个字符长度的字符 ...
- 【原】安装mongo的php插件
http://pecl.php.net/package/mongo https://github.com/mongodb/mongo-php-driver/tarball/master 1. 安装mo ...
- ThreadLocal的正确用法
用法一:在关联数据类中创建private static ThreadLocalThreaLocal的JDK文档中说明:ThreadLocal instances are typically priva ...
- iOS开发官方文档汇总
程序员的学习过程是无止境的,程序员学习的途径是多样的.可以从视频教程中领悟,也可以从他人的代码中 理解.但当我们专注于某一个平台在开发的时候,对于某个API使用或者功能实现有疑问,通常简单的测试可以让 ...