第二章--Bootloader启动流程分析.pdf_第1页
第二章--Bootloader启动流程分析.pdf_第2页
第二章--Bootloader启动流程分析.pdf_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

170170 第第2 2章章 BootloaderBootloader 启动流程分析启动流程分析 2 2.1 .1 BootloaderBootloader 启动的两个阶段启动的两个阶段 从操作系统的角度看,Bootloader 的总目标就是正确地调用内核来执行。另 外,由于 Bootloader 的实现依赖于 CPU 的体系结构,因此大多数 Bootloader 都分为 stage1 和 stage2 两大部分,以便使 Bootloader 的功能更加强大和提供 更加良好的移植性能。 stage1 主要是一些依赖于 CPU 体系结构的代码, 比如硬件设备初始化代码等。 这一阶段的代码主要是通过汇编来实现的,已达到短小精悍和高效的目的。 stage1 为位置无关代码,通常在 Flash 中运行。所以有的指令为相对寻址,可 以在任何位置运行。 s stage1tage1 负责的主要任务有:负责的主要任务有: 硬件设备初始化包括:关闭 Watchdog、关闭中断、设置 CPU 的速度和时钟频 率、配置 SDRAM 存储控制器及 IO、关闭处理器内部指令/数据 Cache 等; 为加载 Bootloader 的 stage2 代码准备 RAM 空间(这个地址由链接脚本指定 为运行域地址,通常为 RAM 的高端地址)测试内存空间是否有效; 复制 Bootloader 的 stage2 代码到 RAM 空间中; 设置好堆栈; 跳转到 stage2 的 C 函数入口点。 stage2 则是通常用 C 语言来实现,这样可以实现更复杂的功能,而且代码会 具有更好的可读性和可移植性。 stage2stage2 负责的主要任务有:负责的主要任务有: 初始化本阶段要使到的硬件设备(如串口、Flash 和网卡等) ; 检测系统内存映射; 没有用户干预时将内核映像从 Flash 读到 RAM 空间中; 为内核设置启动参数; 调用内核。 2.2.2 2 BootloaderBootloader 的内核调用的内核调用 操作系统的内核映像一般是存储在 Flash 上的,当 Bootloader 将内核复制 到 RAM 里之后可能还需要解压。但是对于有自解压能力的内核而言是不需要 Bootloader 来解压的。 而 Bootloader 调用内核的方法就是直接跳转到内核的第一条指令处。在调 171171 用内核之前下列的条件必须要满足: 1.CPU 寄存器的设置 R0 为 0; R1 为机器码; R2 为启动参数,标记列表在 RAM 中的起始基地址。 2.CPU 工作模式 必须禁止中断(IRQ 和 FIQ) ; CPU 必须设置为 SVC 模式。 3.Cache 和 MMU 的设置 MMU 必须关闭; 指令 Cache 可以打开或关闭; 数据 Cache 必须关闭。 2.2.1 2.2.1 BootloaderBootloader 与内核的交互与内核的交互 当内核启动时,启动参数一般是从 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 tag_initrd initrd; struct tag_serialnr serialnr; struct tag_revision revision; struct tag_videolfb videolfb; struct tag_cmdline cmdline; struct tag_acorn acorn; struct tag_memclk memclk; u; 172172 ; 除了 ATAG_CORE 和 ATAG_NONE 之外,其他的参数标记还包括:ATAG_MEM, ATAG_COMDLINE 和 ATAG_INITRD2 等。每个参数标记就代表一个参数结构体,由 各个参数结构体构成了标记列表。 在网蜂提供的 U-Boot 的源码中 arch/arm/lib/bootm.c 文件中有以下代码, 说明参数是如何传递的。 static void setup_start_tag (bd_t *bd) /* 参数存放地址 */ params = (struct tag *) bd-bi_boot_params; /* 标记 ATAG_CORE 开始 */ params-hdr.tag = ATAG_CORE; params-hdr.size = tag_size (tag_core); params-u.core.flags = 0; params-u.core.pagesize = 0; params-u.core.rootdev = 0; /* 使 params 指向下一个标记 */ params = tag_next (params); static void setup_memory_tags (bd_t *bd) int i; for (i = 0; i hdr.tag = ATAG_MEM; params-hdr.size = tag_size (tag_mem32); /* 设置内存起始地址 */ params-u.mem.start = bd-bi_drami.start; /* 设置内存大小 */ params-u.mem.size = bd-bi_drami.size; /* 使 params

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论