第二章--Bootloader启动流程分析.pdfVIP

  • 5
  • 0
  • 约3.61千字
  • 约 3页
  • 2019-11-11 发布于广东
  • 举报
第2章 Bootloader 启动流程分析 2.1 Bootloader 启动的两个阶段 从操作系统的角度看,Bootloader 的总目标就是正确地调用内核来执行。另 外,由于 Bootloader 的实现依赖于 CPU 的体系结构,因此大多数Bootloader 都分为stage1 和stage2 两大部分,以便使Bootloader 的功能更加强大和提供 更加良好的移植性能。 stage1 主要是一些依赖于CPU 体系结构的代码,比如硬件设备初始化代码等。 这一阶段的代码主要是通过汇编来实现的,已达到短小精悍和高效的目的。 stage1 为位置无关代码,通常在Flash 中运行。所以有的指令为相对寻址,可 以在任何位置运行。 stage1 负责的主要任务有: ① 硬件设备初始化包括:关闭Watchdog、关闭中断、设置CPU 的速度和时钟频 率、配置SDRAM 存储控制器及IO、关闭处理器内部指令/数据Cache 等; ② 为加载Bootloader 的stage2 代码准备RAM 空间(这个地址由链接脚本指定 为运行域地址,通常为RAM 的高端地址)测试内存空间是否有效; ③ 复制Bootloader 的stage2 代码到RAM 空间中; ④ 设置好堆栈; ⑤ 跳转到stage2 的C 函数入口点。 stage2 则是通常用C 语言来实现,这样可以实现更复杂的功能,而且代码会 具有更好的可读性和可移植性。 stage2 负责的主要任务有: ① 初始化本阶段要使到的硬件设备(如串口、Flash 和网卡等); ② 检测系统内存映射; ③ 没有用户干预时将内核映像从Flash 读到RAM 空间中; ④ 为内核设置启动参数; ⑤ 调用内核。 2.2 Bootloader 的内核调用 操作系统的内核映像一般是存储在 Flash 上的,当Bootloader 将内核复制 到 RAM 里之后可能还需要解压。但是对于有自解压能力的内核而言是不需要 Bootloader 来解压的。 而 Bootloader 调用内核的方法就是直接跳转到内核的第一条指令处。在调 170 用内核之前下列的条件必须要满足: 1.CPU 寄存器的设置 ① R0 为0; ② R1 为机器码; ③ R2 为启动参数,标记列表在RAM 中的起始基地址。 2.CPU 工作模式 ① 必须禁止中断(IRQ 和FIQ); ② CPU 必须设置为SVC 模式。 3.Cache 和MMU 的设置 ① MMU 必须关闭; ② 指令Cache 可以打开或关闭; ③ 数据Cache 必须关闭。 2.2.1 Bootloader 与内核的交互 当内核启动时,启动参数一般是从 Bootloader 中传递而来的。那么 Bootloader 传递参数的存放地址和参数的数据结构就都是需要关心的。 由于Bootloader 和内核不是同时启动运行的,因此Bootloader 要向内核传 递参数只有将参数存放在一个指定的地址,然后内核再从这个地址中读取启动参 数。 在 U-Boot 中,传递参数的数据结构是以标记的形式来体现的。而参数的传 递通过标记列表的形式来实现。标记列表由ATAG_CORE 开始,以ATAG_NONE 标记 结束。这里的ATAG_CORE,ATAG_NONE 是各个参数的标记,本身是一个32 位值。 标记的数据结构为 tag,它由一个 tag_header 结构体和一个联合体组成。 tag_header 结构体表示标记的长度和类型,比如是表示内存还是命令行参数。 对于不同类型的标记使用不同的联合体。对于tag 和tag_header 的定义可以在 网蜂提供的U-Boot 的源码中arch/arm/include/asm/setup.h 文件中找到,即: struct tag { struct tag_header hdr; union { struct tag_core core; struct tag_mem32 mem; struct tag_videotext videotext; struct tag_ramdisk ramdisk; struct

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档