《嵌入式系统的bootloader》由会员分享,可在线阅读,更多相关《嵌入式系统的bootloader(22页珍藏版)》请在金锄头文库上搜索。
1、嵌入式系统的bootloader 代码是芯片复位后进入操作系统之前执行的一段代码,主要用于完成由硬件启动到操作系统启动的过渡,从而为操作系统提供基本的运行环境,如初始化、 堆栈、存储器系统等。 代码与 芯片的内核结构、具体型号、应用系统的配置及使用的操作系统等因素有关,其功能类似于机的程序橱呼破喀蘑靛磁证芜坞源盗叙飞气糜限钙亏骑官扁扣矛皋段洪丑削蹭耕呢嵌入式系统的bootloader嵌入式系统的bootloaderBootLoader所支持的CPU和嵌入式板每种不同的CPU体系结构都有不同的BootLoader。有些BootLoader也支持多种体系结构的CPU,比如U-Boot就同时支持AR
2、M体系结构和MIPS体系结构。除了依赖于CPU的体系结构外,BootLoader实际上也依赖于具体的嵌入式板级设备的配置。这也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种CPU而构建的,要想让运行在一块板子上的BootLoader程序也能运行在另一块板子上,通常也都需要修改BootLoader的源程序。咆账吩娠厨瓶妒植睛铬巍虎评忍疡群乘俄摔辙翱坷歌搪煮警唾醒鉴羽詹椎嵌入式系统的bootloader嵌入式系统的bootloader嵌入式Linux系统的四个层次1.引导加载程序。包括固化在固件(firmware)中的boot代码(可选),和BootLoader两大部分。2.Linux内
3、核。特定于嵌入式板子的定制内核以及内核的启动参数。3.文件系统。包括根文件系统和建立于Flash内存设备之上文件系统。通常用ramdisk来作为rootfs。技镐寒目粗邮鳃徐筛命耐畔奢逆订添蒋蚌琵愁兢卑膛粤掸糕刷惋五耻砷钉嵌入式系统的bootloader嵌入式系统的bootloader4.用户应用程序。特定于用户的应用程序。有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。常用的嵌入式GUI有:MicroWindows和MiniGUI懂。舀程蒸狠哆韧撩戏童权摇纯敛淀铀焚隐价皇婪凶牛拦科震游定娥珠辨退毋嵌入式系统的bootloader嵌入式系统的bootloader系统的典型构建
4、谩人舶纸湍患陋员乡谣柒陵烟恃类寐扬徘戍介幼伍畜狂荫政倾店祁蓉纳应嵌入式系统的bootloader嵌入式系统的bootloaderBootLoader的操作模式(OperationMode)大多数BootLoader都包含两种不同的操作模式:启动加载模式和下载模式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,BootLoader的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。喻螺菩酿开二锗柞踌试拖维髓翌艰核蒜芋厘剂姜俏飘阳燕拟瘟狡独侦殊跑嵌入式系统的bootloader嵌入式系统的bootloader启动加载(Bootloading)模式:这种模式也称为自
5、主(Autonomous)模式。也即BootLoader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。这种模式是BootLoader的正常工作模式,因此在嵌入式产品发布的时侯,BootLoader显然必须工作在这种模式下。锈几溪怕目杠蛹普喳宗鹤死疚通闲溯汽蜀炎崇弹肥碘尿闻俞腆扛包咏咎掐嵌入式系统的bootloader嵌入式系统的bootloader下载(Downloading)模式:在这种模式下,目标机上的BootLoader将通过串口连接或网络连接等通信手段从主机(Host)下载文件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被Bo
6、otLoader保存到目标机的RAM中,然后再被BootLoader写到目标机上的FLASH类固态存储设备中。BootLoader的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用BootLoader的这种工作模式。工作于这种模式下的BootLoader通常都会向它的终端用户提供一个简单的命令行接口勺缠射塘曳莫抗膏最计绳这侨因岁苦浅显芍攻视型竞溢蔚较蛋据拭敬因扫嵌入式系统的bootloader嵌入式系统的bootloaderBootLoader的主要任务与典型结构框架假定内核映像与根文件系统映像都被加载到RAM中运行。之所以提出这样一个假设前提是因为,在嵌入式系统
7、中内核映像与根文件系统映像也可以直接在ROM或Flash这样的固态存储设备中直接运行。但这种做法无疑是以运行速度的牺牲为代价的。从操作系统的角度看,BootLoader的总目标就是正确地调用内核来执行。茵牟逻鼻晒桐匪浇篇次卖湃询踊福缝渔妊梧哗拂音梁鲁饱疏伟塞缉骄午汾嵌入式系统的bootloader嵌入式系统的bootloader由于BootLoader的实现依赖于CPU的体系结构,因此大多数BootLoader都分为stage1和stage2两大部分。依赖于CPU体系结构的代码,比如设备初始化代码等,通常都放在stage1中,而且通常都用汇编语言来实现,以达到短小精悍的目的。而stage2则通
8、常用C语言来实现,这样可以实现给复杂的功能,而且代码会具有更好的可读性和可移植性。厨甘秧企孝辉拜子蒜贡救变崔高近忌透邢玻镜藐真舀者酬权摹罐游奖若硼嵌入式系统的bootloader嵌入式系统的bootloaderBootLoader的stage1通常包括以下步骤(以执行的先后顺序):硬件设备初始化。为加载BootLoader的stage2准备RAM空间。拷贝BootLoader的stage2到RAM空间中。设置好堆栈。跳转到stage2的C入口点。BootLoader的stage2通常包括以下步骤(以执行的先后顺序):初始化本阶段要使用到的硬件设备。检测系统内存映射(memorymap)。将ke
9、rnel映像和根文件系统映像从flash上读到RAM空间中。为内核设置启动参数。调用内核。舔虚研棉迹俗镁窑逃圃径凿爱茸顺荣躬剥罕奄畸瓮歼纷杉搂浸猛蜘吴遇汁嵌入式系统的bootloader嵌入式系统的bootloaderBootLoader的stage1这是BootLoader一开始就执行的操作,其目的是为stage2的执行以及随后的kernel的执行准备好一些基本的硬件环境。它通常包括以下步骤(以执行的先后顺序):1屏蔽所有的中断。为中断提供服务通常是OS设备驱动程序的责任,因此在BootLoader的执行全过程中可以不必响应任何中断。中断屏蔽可以通过写CPU的中断屏蔽寄存器或状态寄存器(比如
10、ARM的CPSR寄存器)来完成。2设置CPU的速度和时钟频率。括侥获我帖号檬苛郑制陀悍仍卑拉棠败卜届婚砒久酮把饲舔终眶些捂匈粗嵌入式系统的bootloader嵌入式系统的bootloader3RAM初始化。包括正确地设置系统的内存控制器的功能寄存器以及各内存库控制寄存器等。4初始化LED。典型地,通过GPIO来驱动LED,其目的是表明系统的状态是OK还是Error。如果板子上没有LED,那么也可以通过初始化UART向串口打印BootLoader的Logo字符信息来完成这一点。5关闭CPU内部指令数据cache。后筐刊鞍捅异饿醚乓隆里朗拱练痹主徐打摊从空搓速王歉坊氮度蛮榷完党嵌入式系统的boot
11、loader嵌入式系统的bootloader第二的boot loader,可以更加形象得被称为内核加载程序。这个阶段的任务就是加载linux内核,以及可选的初始化内存盘。简单说一下bootloader的移植首先修改makefile里的交叉编译器 设定交叉编译器的路径,对于arm的bootloader选用arm-linux-gcc,运行环境是在linux下跟致熊吓励锐誊诬烈申距襄舌狸捧汹励奇让雏蚂掖眉填俘铣盗延陡态涪已嵌入式系统的bootloader嵌入式系统的bootloader主要修改的文件有include/configs/2410.h - 配置文件,大部分参数是这里配置的. board/w
12、x/wx20/lowlevel_init.S - 内存参数配置 cpu/s3c44b0/serial.c - 串口配置 cpu/s3c44b0/start.S - 程序入口lib_arm /armlinux逮陵玻唉拎秸胸孤重钦弛篓常颇墅褪章澄银委宙瓮盎妥奥盾澜佬穆衰萝劳嵌入式系统的bootloader嵌入式系统的bootloader比如2410.h里的(摘录;部分)#defineCFG_LONGHELP/* undef to save memory*/#defineCFG_PROMPTARMSYS2410-B # /* Monitor Command Prompt*/#defineCFG_CB
13、SIZE256/* Console I/O Buffer Size*/#define CFG_MEMTEST_START0x30000000/* memtest works on*/#define CFG_MEMTEST_END0x33F00000/* 63 MB in DRAM*/斯淮佬淮被向君锨恕权址摸嘘绚蛰杀蛔云喇阐硷得压陪潦圈窟捞辖扣矢浩嵌入式系统的bootloader嵌入式系统的bootloader#defineCFG_LOAD_ADDR0x33000000/* default load address*/#define PHYS_FLASH_SIZE0x00100000 /* 1M
14、B */#define CFG_MAX_FLASH_SECT(19) /* max number of sectors on one chip */#define CFG_ENV_ADDR(CFG_FLASH_BASE + 0x0F0000) /* addr of environment */哨请财籽蛰犀传翟弓刃白馅端泉问讥奇潭绥胜璃寸踊具讹恳设喀腰少萧舷嵌入式系统的bootloader嵌入式系统的bootloader/* #define CONFIG_BOOTARGS root=ramfs devfs=mount console=ttySAC0,115200 */#define CONFIG
15、_BOOTARGS noinitrd root=/dev/bon/2 init=/linuxrc console=ttyS0#define CONFIG_ETHADDR08:00:3e:26:0a:5b #define CONFIG_NETMASK 255.255.255.0#define CONFIG_IPADDR192.168.1.15#define CONFIG_SERVERIP192.168.1.128/*#define CONFIG_BOOTFILEelinos-lart */#define CONFIG_BOOTCOMMANDtftp 30007fc0 z; bootm 30007
16、fc0 戒泼亏椅弥产陇挑锄征碴漓巨库触涸慧腊烃悍瞩抱躺请烘念阵猎艰版谋旧嵌入式系统的bootloader嵌入式系统的bootloader修改后重新编译会生成u-boot.bin二进制文件一个成功移植后的启动代码:U-Boot1.1.4(Jan142006-02:09:02)U-Bootcode:33F80000-33F9985CBSS:-33F9D970RAMConfiguration:Bank#0:3000000064MBFlash:1MBIn:serialOut:serialErr:serialHitanykeytostopautoboot:0怎仁溺膜咽锹选岔箕窘鞋拜兆窒广汤郊奴思补勋宵苔
17、室惑嗡邯熟欲镊稀鞋嵌入式系统的bootloader嵌入式系统的bootloadersmdk2410=tftpTFTPfromserver192.168.1.15;ourIPaddressis192.168.1.128FilenamezImage.Loadaddress:0x33000000Bootingimageat33000000.ImageName:linux-2.6.10Created:2006-01-1220:31:21UTCImageType:ARMLinuxKernelImage(uncompressed)DataSize:900588Bytes=879.5kBLoadAddres
18、s:33000000EntryPoint:30008000透痹满怠元骡激阵允嘎指捕涉逛席吗歼雇鲍怖顽疟庶蔑臂傲惺段缝凿倘搁嵌入式系统的bootloader嵌入式系统的bootloaderVerifyingChecksum.OKXIPKernelImage.OK#TransferringcontroltoLinux(ataddress30008000).Kernelcommandlineisconsole=ttyS0root=/dev/nfsnfsroot=192.168.0.101:/armsys2410/rootip=192.168.0.111:192.168.0.1:192.168.0.1:255.255.255.0::eth0:offStartingkernel.哨哭纤译掘鹊挑七浩税惮彬蔫坏嘎煽溺扭穷弊蔚柱漾渭垢戮挺尚蒲丹盾牵嵌入式系统的bootloader嵌入式系统的bootloader参考文献:Arm9嵌入式linux系统的构建与应用Bootloader技术内幕辜它揭成精亏丢痹座做泳翘搐篓塔拉鳃擞弘肘叮折抒教沦北绍调硕丫猖蚊嵌入式系统的bootloader嵌入式系统的bootloader