arm的bootloader的流程PPT文档格式.ppt
《arm的bootloader的流程PPT文档格式.ppt》由会员分享,可在线阅读,更多相关《arm的bootloader的流程PPT文档格式.ppt(22页珍藏版)》请在冰豆网上搜索。
3.文件系统。
包括根文件系统和建立于Flash内存设备之上文件系统。
通常用ramdisk来作为rootfs。
4.用户应用程序。
特定于用户的应用程序。
有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。
常用的嵌入式GUI有:
MicroWindows和MiniGUI懂。
系统的典型构建,BootLoader的操作模式(OperationMode),大多数BootLoader都包含两种不同的操作模式:
启动加载模式和下载模式,这种区别仅对于开发人员才有意义。
但从最终用户的角度看,BootLoader的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。
启动加载(Bootloading)模式:
这种模式也称为自主(Autonomous)模式。
也即BootLoader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。
这种模式是BootLoader的正常工作模式,因此在嵌入式产品发布的时侯,BootLoader显然必须工作在这种模式下。
下载(Downloading)模式:
在这种模式下,目标机上的BootLoader将通过串口连接或网络连接等通信手段从主机(Host)下载文件,比如:
下载内核映像和根文件系统映像等。
从主机下载的文件通常首先被BootLoader保存到目标机的RAM中,然后再被BootLoader写到目标机上的FLASH类固态存储设备中。
BootLoader的这种模式通常在第一次安装内核与根文件系统时被使用;
此外,以后的系统更新也会使用BootLoader的这种工作模式。
工作于这种模式下的BootLoader通常都会向它的终端用户提供一个简单的命令行接口,BootLoader的主要任务与典型结构框架假定内核映像与根文件系统映像都被加载到RAM中运行。
之所以提出这样一个假设前提是因为,在嵌入式系统中内核映像与根文件系统映像也可以直接在ROM或Flash这样的固态存储设备中直接运行。
但这种做法无疑是以运行速度的牺牲为代价的。
从操作系统的角度看,BootLoader的总目标就是正确地调用内核来执行。
由于BootLoader的实现依赖于CPU的体系结构,因此大多数BootLoader都分为stage1和stage2两大部分。
依赖于CPU体系结构的代码,比如设备初始化代码等,通常都放在stage1中,而且通常都用汇编语言来实现,以达到短小精悍的目的。
而stage2则通常用C语言来实现,这样可以实现给复杂的功能,而且代码会具有更好的可读性和可移植性。
BootLoader的stage1通常包括以下步骤(以执行的先后顺序):
硬件设备初始化。
为加载BootLoader的stage2准备RAM空间。
拷贝BootLoader的stage2到RAM空间中。
设置好堆栈。
跳转到stage2的C入口点。
BootLoader的stage2通常包括以下步骤(以执行的先后顺序):
初始化本阶段要使用到的硬件设备。
检测系统内存映射(memorymap)。
将kernel映像和根文件系统映像从flash上读到RAM空间中。
为内核设置启动参数。
调用内核。
BootLoader的stage1这是BootLoader一开始就执行的操作,其目的是为stage2的执行以及随后的kernel的执行准备好一些基本的硬件环境。
它通常包括以下步骤(以执行的先后顺序):
1屏蔽所有的中断。
为中断提供服务通常是OS设备驱动程序的责任,因此在BootLoader的执行全过程中可以不必响应任何中断。
中断屏蔽可以通过写CPU的中断屏蔽寄存器或状态寄存器(比如ARM的CPSR寄存器)来完成。
2设置CPU的速度和时钟频率。
3RAM初始化。
包括正确地设置系统的内存控制器的功能寄存器以及各内存库控制寄存器等。
4初始化LED。
典型地,通过GPIO来驱动LED,其目的是表明系统的状态是OK还是Error。
如果板子上没有LED,那么也可以通过初始化UART向串口打印BootLoader的Logo字符信息来完成这一点。
5关闭CPU内部指令数据cache。
第二的bootloader,可以更加形象得被称为内核加载程序。
这个阶段的任务就是加载linux内核,以及可选的初始化内存盘。
简单说一下bootloader的移植首先修改makefile里的交叉编译器设定交叉编译器的路径,对于arm的bootloader选用arm-linux-gcc,运行环境是在linux下,主要修改的文件有,include/configs/2410.h-配置文件,大部分参数是这里配置的.board/wx/wx20/lowlevel_init.S-内存参数配置cpu/s3c44b0/serial.c-串口配置cpu/s3c44b0/start.S-程序入口lib_arm/armlinux,比如2410.h里的(摘录;
部分)#defineCFG_LONGHELP/*undeftosavememory*/#defineCFG_PROMPTARMSYS2410-B#/*MonitorCommandPrompt*/#defineCFG_CBSIZE256/*ConsoleI/OBufferSize*/#defineCFG_MEMTEST_START0x30000000/*memtestworkson*/#defineCFG_MEMTEST_END0x33F00000/*63MBinDRAM*/,#defineCFG_LOAD_ADDR0x33000000/*defaultloadaddress*/#definePHYS_FLASH_SIZE0x00100000/*1MB*/#defineCFG_MAX_FLASH_SECT(19)/*maxnumberofsectorsononechip*/#defineCFG_ENV_ADDR(CFG_FLASH_BASE+0x0F0000)/*addrofenvironment*/,/*#defineCONFIG_BOOTARGSroot=ramfsdevfs=mountconsole=ttySAC0,115200*/#defineCONFIG_BOOTARGSnoinitrdroot=/dev/bon/2init=/linuxrcconsole=ttyS0#defineCONFIG_ETHADDR08:
00:
3e:
26:
0a:
5b#defineCONFIG_NETMASK255.255.255.0#defineCONFIG_IPADDR192.168.1.15#defineCONFIG_SERVERIP192.168.1.128/*#defineCONFIG_BOOTFILEelinos-lart*/#defineCONFIG_BOOTCOMMANDtftp30007fc0z;
bootm30007fc0,修改后重新编译会生成u-boot.bin二进制文件一个成功移植后的启动代码:
U-Boot1.1.4(Jan142006-02:
09:
02)U-Bootcode:
33F80000-33F9985CBSS:
-33F9D970RAMConfiguration:
Bank#0:
3000000064MBFlash:
1MBIn:
serialOut:
serialErr:
serialHitanykeytostopautoboot:
0,smdk2410=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.5kBLoadAddress:
33000000EntryPoint:
30008000,VerifyingChecksum.OKXIPKernelImage.OK#TransferringcontroltoLinux(ataddress30008000).Kernelcommandlineisconsole=ttyS0root=/dev/nfsnfsroot=192.168.0.101:
/armsys2410/rootip=192.168.0.111:
192.168.0.1:
255.255.255.0:
eth0:
offStartingkernel.,参考文献:
Arm9嵌入式linux系统的构建与应用Bootloader技术内幕,