《嵌入式系统BootLoaderP.ppt》由会员分享,可在线阅读,更多相关《嵌入式系统BootLoaderP.ppt(30页珍藏版)》请在三一办公上搜索。
1、嵌入式系统BootLoader,徐远超,BootLoader,Boot loader是与系统硬件环境高度相关的初始化软件,它担负着初始化硬件和引导操作系统的双重责任。每一个特定系统的Boot loader都会有所不同。Boot loader移植是在特定硬件平台上系统软件移植至关重要的一步,是引导操作系统和根文件系统的基础。对了解嵌入式系统底层运行机制、优化和快速启动的研究都有重要的意义。,PC 机中的引导加载程序,两部分组成BIOS(其本质就是一段固件程序)位于硬盘 MBR 中的 OS Boot Loader(如LILO 和 GRUB 等)流程BIOS 在完成硬件检测和资源分配后,将硬盘 MB
2、R 中的 Boot Loader 读到系统的 RAM 中,然后将控制权交给 OS Boot LoaderBoot Loader 的主要运行任务就是将内核映象从硬盘上读到 RAM 中,然后跳转到内核的入口点去运行,即开始启动操作系统。,嵌入式系统中引导加载程序,系统的加载启动任务就完全由 Boot Loader 来完成ARM7TDMI中,系统在上电或复位时从地址 0 x00000000 处开始执行,这个地址是Boot Loader 程序典型的嵌入式系统 boot loaderBlob:boot loader object的缩写开源,遵循GPL,很好的Linux loader,主要针对ARMU-b
3、oot:universal boot loader的缩写,开源,遵循GPL,支持ARM,MIPS,X86,Nios等处理器可启动VxWorks,QNX,Linux等多种操作系统,Boot Loader 的概念,在操作系统内核运行之前运行的一段小程序功能初始化硬件设备建立内存空间的映射图调整系统的软硬件环境,以便操作系统内核启动不通用依赖于硬件CPU依赖于主板board 不同的CPU有不同的Boot Loader 有些 BootLoader 支持多CPU,如U-Boot支持ARM和MIPS,固态存储设备的典型空间分配结构,Boot Loader 的执行,第一条指令地址 0 x00000000嵌入
4、式系统通常有固态存储设备(比如:ROM、EEPROM 或 FLASH 等)被映射到这个预先安排的地址上系统加电后,CPU 将首先执行 Boot Loader 程序,用来控制 Boot Loader 的设备或机制,主机和目标板之间一般通过串口建立连接Boot Loader执行时通常会通过串口进行 I/O如输出打印信息到串口,从串口读取用户控制字符等,BootLoader 与主机之间进行文件传输所用的通信设备及协议,通常Boot Loader 通过串口与主机之间进行文件传输传输协议通常是 xmodemymodemzmodem 协议中的一种可通过以太网连接并借助 TFTP 协议来下载文件串口传输的速
5、度是有限的主机提供 TFTP 服务,Boot Loader 的操作模式,启动加载模式自主(Autonomous)模式从目标机上的某个固态存储设备上将操作系统加载到RAM中运行Boot Loader的正常工作模式下载模式通过串口连接或网络连接等通信手段从主机(Host)下载内核映像和根文件系统映像等。从主机下载的文件通常首先被 Boot Loader 保存到目标机的 RAM 中,然后再被 BootLoader 写到目标机上的FLASH 类固态存储设备中。第一次安装内核与根文件系统时或对其更新时使用通常都会向它的终端用户提供一个简单的命令行接口,Boot Loader 的启动过程,从固态存储设备上
6、启动Boot Loader大多都是 2 阶段stage 1和 stage 2BOOTLOADER一般分为2部分stage 1:汇编部分,执行简单的硬件初始化stage 2:C语言部分,负责复制数据,设置启动参数,串口通信等功能BOOTLOADER的生命周期1.初始化硬件,如设置UART(至少设置一个),检测存储器等2.设置启动参数,告诉内核硬件的信息,如显示控制台LCD或串口、VGA等.3.跳转到操作系统的首地址.4.消亡,BootLoader的主要任务,stage1通常包括以下步骤基本硬件设备初始化为加载BootLoader的stage2准备RAM空间拷贝BootLoader的stage2到
7、RAM空间中设置好堆栈跳转到stage2的C入口点BootLoader的stage2通常包括以下步骤初始化本阶段要使用到的硬件设备检测系统内存映射(memorymap)将kernel和根文件系统映像从flash上读到RAM空间中为内核设置启动参数调用内核,stage1,基本的硬件初始化,目的为stage2的执行以及随后的kernel的执行准备好一些基本的硬件环境 1屏蔽所有的中断为中断提供服务通常是OS设备驱动程序的责任,BootLoader的执行全过程中可以不必响应任何中断中断屏蔽可以通过写CPU的中断屏蔽寄存器或状态寄存器(如ARM的CPSR寄存器)来完成2设置CPU的速度和时钟频率。3R
8、AM初始化包括正确地设置系统的内存控制器的功能寄存器以及各内存库控制寄存器等。4初始化LED通过GPIO来驱动LED,其目的是表明系统的状态是OK还是Error如板子上没有LED,那么也可以通过初始化UART向串口打印BootLoader的Logo字符信息5关闭CPU内部指令数据cache,为加载 stage2 准备 RAM 空间,通常把 stage2 加载到 RAM 空间中来执行 stage2 通常是 C 语言执行代码,考虑堆栈空间空间大小最好是 memory page 大小(通常是 4KB)的倍数一般1M RAM 空间已经足够,地址范围可以任意安排如 blob 就将 stage2 可执行映
9、像从系统 RAM 起始地址 0 xc0200000 开始的 1M 空间内执行stage2_endstage2_startstage2_size对所安排的地址范围进行测试必须确保所安排的地址范围可读写的 RAM 空间测试方法可以采用类似于 blob 的方法以 memory page 为被测试单位,测试每个 page 开始的两个字是否是可读写的,拷贝 stage2 到 RAM 中,拷贝时要确定两点(1)stage2 的可执行映象在固态存储设备的存放起始地址和终止地址(2)RAM 空间的起始地址。,设置堆栈指针 sp(trampoline.S中完成),通常把 sp 的值设置为(stage2_end-
10、4)1MB 的 RAM 空间的最顶端(堆栈向下生长)在设置堆栈指针 sp 之前,也可以关闭 led 灯,以提示用户我们准备跳转到 stage2,跳转到 stage2 的 C 入口点,可以跳转到 Boot Loader 的 stage2 去执行如在 ARM系统中,这可以通过修改 PC 寄存器为合适的地址来实现,Stage2,stage2的代码通常用C语言来实现,代码可读性和可移植性 不能使用glibc库中的任何支持函数 Why?trampoline(弹簧床)编程方式用汇编语言写一段trampoline 小程序,并将这段 trampoline 小程序来作为 stage2 可执行映象的执行入口点在
11、trampoline 汇编小程序中用 CPU 跳转指令跳入 main()函数中去执行当main()函数返回时,CPU 执行路径显然再次回到我们的 trampoline 程序。用 trampoline 小程序来作为 main()函数的外部包裹(external wrapper)Why not use main directly1)无法传递函数参数;2)无法处理函数返回,blob 的trampoline 程序示例,.text.globl _trampoline_trampoline:bl main/*if main ever returns we just call it again*/b _tr
12、ampoline,Stage2,初始化本阶段要使用到的硬件设备,1初始化至少一个串口,以便终端用户进行 I/O 输出信息2初始化计时器等在初始化这些设备之前,也可以重新把 LED 灯点亮,以表明我们已经进入main()函数执行设备初始化完成后,可以输出一些打印信息,程序名字字符串、版本号等,检测系统的内存映射(memory map),在 4GB 物理地址空间中哪些地址范围被分配用来寻址系统的RAM 单元在Samsung S3C44B0X 中,从0 x0c00,0000(192M)到 0 x1000,0000(256M)之间的 64M 地址空间被用作系统的 RAM 地址空间嵌入式系统往往只把 C
13、PU 预留的全部 RAM 地址空间中的一部分映射到 RAM 单元上,而让剩下的那部分预留 RAM 地址空间处于未使用状态Boot Loader 的 stage2 必须检测整个系统的内存映射情况必须知道 CPU 预留的全部 RAM 地址空间中的哪些被真正映射到 RAM 地址单元,哪些是处于 unused 状态的,加载内核映像和根文件系统映像,1 规划内存占用的布局 内核映像所占用的内存范围根文件系统所占用的内存范围2 从Flash上拷贝,内存布局,flash布局,include/blob/arch/mba44b0.h,37#define SDRAMSIZE(8)38 39/*the base a
14、ddress were BLOB is loaded by the first stage loader*/40#define BLOB_ABS_BASE_ADDR(0 x0c200400)41 42/*where do various parts live in RAM*/43#define BLOB_RAM_BASE(0 x0c100000)44#define KERNEL_RAM_BASE(0 x0c300000)45#define PARAM_RAM_BASE(0 x0c110000)46#define RAMDISK_RAM_BASE(0 x0c400000)47 48/*and w
15、here do they live in flash*/49#define BLOB_FLASH_BASE(0 x00000000)50#define BLOB_FLASH_LEN(60*1024)51#define PARAM_FLASH_BASE(BLOB_FLASH_BASE+BLOB_FLASH_LEN)52#define PARAM_FLASH_LEN(4*1024)53#define KERNEL_FLASH_BASE(PARAM_FLASH_BASE+PARAM_FLASH_LEN)54#define KERNEL_FLASH_LEN(704*1024)55#define RAM
16、DISK_FLASH_BASE(KERNEL_FLASH_BASE+KERNEL_FLASH_LEN)56#define RAMDISK_FLASH_LEN(1280*1024)57 58/*the position of the kernel boot parameters*/59#define BOOT_PARAMS(0 x0c000100),设置内核的启动参数,Linux 2.4.x 以后的内核都期望以标记列表(tagged list)的形式来传递启动参数启动参数标记列表以标记 ATAG_CORE 开始,以标记 ATAG_NONE 结束每个标记由标识被传递参数的 tag_header 结
17、构以及随后的参数值数据结构来组成在嵌入式 Linux 系统中,通常需要由 Boot Loader 设置的常见启动参数有:ATAG_CORE、ATAG_MEM、ATAG_CMDLINE、ATAG_RAMDISK、ATAG_INITRD等,调用内核,直接跳转到内核的第一条指令处 在跳转时,下列条件要满足1 CPU 寄存器的设置R00;R1机器类型 ID;R2启动参数标记列表在 RAM 中起始基地址2 CPU 模式必须禁止中断(IRQs和FIQs);CPU 必须 SVC 模式;3 Cache 和 MMU 的设置MMU 必须关闭;指令 Cache 可以打开也可以关闭;数据 Cache 必须关闭,串口终
18、端,调试手段:打印信息到串口终端串口终端显示乱码或根本没有显示(1)boot loader 对串口的初始化设置不正确。(2)运行在 host 端的终端仿真程序对串口的设置不正确,这包括:波特率、奇偶校验、数据位和停止位等方面的设置,BLOB移植需要修改的文件,详见4.3节,Blob编译与下载实验,详见4.4节,U-boot,德国DENX软件工程中心的Wolfgang Denk全称Universal Boot Loader开放源码项目http:/从FADSROM、8xxROM、PPCBOOT逐步发展演化而来其源码目录、编译形式与Linux内核很相似支持嵌入式Linux/NetBSD/VxWorks/QNX/RTEMS/ARTOS/LynxOSPowerPC、MIPS、x86、ARM、Nios、XScale等处理器,功能,