BootLoader的stage2

 stage2的代码是C语言来实现的,以便于实现更复杂的功能和取得更好的代码可读性和移植性。它与普通C语言程序不同的是,在编译和链接BootLoader这样的程序时,不能使用glibc库中的任何支持函数。这就带来了一个问题,从哪里跳转到main()函数呢?直接把main()函数的起始地址作为stage2执行映像的入口点。但这样做有2个缺点:1)无法通过main()函数传递函数参数; 2)无法处理main()函数返回的情况。一种更为巧妙的方法是利用trampoline(弹簧床)的概念。用汇编写一段trampoline小程序,并将这段小程序作为stage2可执行映像的执行入口点。然后可以在trampoline汇编程序中用CPU跳转指令跳入main()函数中执行;当main()函数返回时,CPU执行路径再次回到我们的trampoline程序。下面给出一个简单的trampoline程序(来自blob):

.text

.globl_trampoline_trampoline:

      bl  main      

      /*if main return ,we just call it again */

      b _trampoline

在vivi中,用循环解决的

@ get read to call C functions
ldr sp, DW_STACK_START @ setup stack pointer
mov fp, #0 @ no previous frame, so fp=0
mov a2, #0 @ set argv to NULL

bl main @ call main

mov pc, #FLASH_BASE @ otherwise, reboot

  1.初始化本阶段要使用到的硬件设备

   (1).初始化至少一个串口,以便和终端进行I/O输出信息;(2)初始化计时器等

    初始化完成后,可以输出一些打印信息,如程序名、版本号等等。

   2.检测系统的内存映射( memory map )

    所谓系统内存映射就是指在整个4GB物理地址中有哪些地址范围被分配用来寻址系统的RAM单元。比如,在SA-1100CPU中,从0xc0000000开始的512M地址空间被     用作系统的RAM地址空间,而在Samsung S3C44B0X CPU中,从0x0c000000到0x10000000之间的64M地址空间被用作系统的RAM地址空间。CPU预留出一大段              足够的地址空间给系统RAM,但是搭建具体的嵌入式系统时却不一定会实现CPU预留的全部RAM地址空间。也就是说,具体的嵌入式系统往往只把CPU预留的全部RAM地              址空间中的一部分映射到RAm单元上,让剩下的部分预留的RAM处于未使用状态。因此stage2在干点什么之前要检测整个系统的内存映射情况,即哪些处于unuse状态。

   3.加载内核映像和根文件系统映像

   (1)规划内存占用的布局

      包括2方面:内核映像所占用的内存范围。  跟文件系统所占用的内存范围。

      在规划占用内存占用的布局时,主要考虑基址和映像的大小两个方面。

      对于内核映像,一般将其拷贝到从(MEM_START + 0x8000)这个基址开始大约1MB大小的空间内U村范围(嵌入Linux内核一般不会超过1MB)。在             MEM_START+0x8000之前的32KB为什么空出来呢?这主要是Linux内核在这段内存中放置一些全局数据结构,如:启动参数和内核页表等信息。而对于

根文件系统映像,则将一般将其拷贝到MEM_START+0x00100000开始的地方。

   (2)从flash上拷贝

      ARM  CPU在统一的内存地址空间中寻址Flash等固态设备的,因此从Flash上读取数据与从RAM单元中读取数据是一样的,一个简单的循环就行了。

      while( count ){

          *dest++  = *src++;

          count  -=  4;

      }

4.设置内核的启动参数

   在调用内核之前,应该做一步准备工作,即:设置Linux内核的启动参数。

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

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

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

  2. BootLoader 详解(1)

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

  3. BootLoader 详解(2)

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

  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. linux与windows的不同

    linux 严格区分大小写:linux 所有内容都以文件形式保存,包括用户和硬件:linux 不以文件后缀名来区分文件类型:但有一些便于管理员区分文件类型的约定俗称的后缀:windows下的程序不能直 ...

  2. QQ空间漫步者

    主要功能(QQ空间) 判断空间权限并跳过无法访问 留下足迹并可选:同时留言(可单独),赞主页(可单独),赞说说(可单独) 其他附加功能,导出QQ,导入群成员,好友,空间访客,说说评论,发表说说 送空间 ...

  3. python 元组操作

    关于元组的常用操作,请参考:http://www.runoob.com/python/python-tuples.html 元组的元素不可修改 ,元组的元素的元素可修改 count(self,valu ...

  4. centos网卡eth1变成eth0修改方法

    centos网卡eth1变成eth0修改方法 2013年03月29日 ⁄ Linux基础 ⁄ 共 406字 ⁄ 暂无评论 ⁄ 被围观 8,266 views+ 虚拟化中,从模板克隆出来的虚拟机网卡都会 ...

  5. jquery选择器之层级选择器

    HTML示例代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  6. Android服务之Service(其一)

    android中服务是运行在后台的东西,级别与activity差不多.既然说service是运行在后台的服务,那么它就是不可见的,没有界面的东西.你可以启动一个服务Service来播放音乐,或者记录你 ...

  7. Angular1.x组件通讯方式总结

    Angular1开发模式 这里需要将Angular1分为Angular1.5之前和Angular1.5两个不同的阶段来讲,两者虽然同属Angular1,但是在开发模式上还是有较大区别的.在Angula ...

  8. CentOS7 桌面的安装

    对于linux桌面的安装,我们还是要先安装yum 1:查询桌面组件是否安装成功 yum grouplist #查询桌面组件 #由于我这里安装了,所以桌面菜单显示在已安装 2:选取我们要安装的组件 yu ...

  9. Datagridview 添加checkbox列,并判断Datagridview 中的checkbox列是否被选中

    Solution1://In Fill DataGridViewEvent : DataGridViewCheckBoxColumn ChCol = new DataGridViewCheckBoxC ...

  10. Hbase客户端API基础小结笔记(未完)

    客户端API:基础 HBase的主要客户端接口是由org.apache.hadoop.hbase.client包中的HTable类提供的,通过这个类,用户可以完成向HBase存储和检索数据,以及删除无 ...