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