第10章 Bootloader 设计基础
- 格式:ppt
- 大小:162.00 KB
- 文档页数:48
引导程序bootloader●在操作系统内核或用户应用程序之前运行的一段小程序;通过这个程序,可以初始化硬件设备、建立内存空间的映射图,从而将目标系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核或用户应用程序运行准备好正确的环境●初始化硬件,特别是内存控制器●提供linux内核的启动参数●启动linux内核●存储在targer的ROM或flash中(地址为0),包含第一条可执行指令Run diagnostic programUpdate kernel/dataJump to kernel normal boot 系统加电或复位后,所有的CPU通常都从CPU制造商预先安排的地址上取指令。
比如A RM是从地址0x00000000取第一条指令●初始化处理器以及外设的硬件资源配置,CPU片内和片外设备,如SDRAM●初始化I/O芯片,可能有的设备有:串口,报告BOOTLOADER的结果(成功/失败)。
网络或FLASH接口,引导操作系统串口通讯是最简单也是最廉价的一种双机通讯设备,所以在Bootloader中主机和目标机之间常常通过串口建立连接。
Bootloader在执行时会通过串口来进行I/O,比如:输出打印信息到串口,从串口获取用户控制字符等。
当然为了提高效率,也可以网口来建立通讯,这样在Bootloader中就需要启用网口的驱动●执行系统自检,报告检测结果●通过用户命令行提供特定应用程序●使用TFTP协议从网口接收,或者xmodem协议从串口接收操作系统镜像文件到RAM,将文件烧录到FLASH中,重启后负责找到镜像,解压缩到RAM中,并跳转到解压位置处执行,或直接跳转到RAM处执行该镜像●多阶段的Bootloader能提供更为复杂的功能,以便更好的可移植性。
从固态存储设备上(如flash)启动的Bootloader大多都是2阶段的启动过程。
●两种加载模式✓启动加载模式:也称为自主模式(Autonomous),即Bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程没有用户的介入—Bootloader的正常工作模式✓下载模式:在这种模式下目标机上的Bootloader将通过串口连接或网络连接等从主机上下载文件,比如:下载应用程序、数据文件、内核映像等。
Bootloader编写简明教程第⼀部分:基本功能流程CPU上电后会从IO空间的某地址取第⼀条指令。
但此时:PLL没有启动,CPU⼯作频率为外部输⼊晶振频率,⾮常低;CPU⼯作模式、中断设置等不确定;存储空间的各个BANK(包括内存)都没有驱动,内存不能使⽤。
在这种情况下必须在第⼀条指令处做⼀些初始化⼯作,这段初始化程序与操作系统独⽴分开,称之为bootloader。
实际上,很少有必要⾃⼰写⼀个Bootloader,因为U-Boot已经强⼤到能够满⾜各种需要。
但是强⼤必然复杂,⼀个初学者想要分析U-Boot的源代码,还是有些难度的。
出于学习的⽬的,我写了这个史上最简单的启动加载器,它只包含最基本的功能,却囊括了⼀个嵌⼊式Bootloader应该有的核⼼和精华。
我把这个启动加载器命名为S-Boot,是Simple Bootloader的缩写,亦可进⼀步简称为SB。
使⽤的实验环境为OK2440开发板,板上处理器为S3C2440A,有64M内存,Nand存储器为K9F1208,64M。
⽹⼝芯⽚为CS8900A。
我们要实现的功能是:从串⼝下载Linux内核映像到RAM;从⽹⼝下载Linux内核映像到RAM;从RAM启动内核挂载NFS根⽂件系统。
1. 第⼀阶段的汇编代码:start.S⼀个嵌⼊式Bootloader最初始部分的代码⼏乎必须是⽤汇编语⾔写成的,因为开发板刚上电后没有准备好C程序运⾏环境,⽐如堆栈指针SP没有指到正确的位置。
汇编代码应该完成最原始的硬件设备初始化,并准备好C运⾏环境,这样后⾯的功能就可以⽤C语⾔来写了。
对我们的S-Boot来说,上电后的起始运⾏代码是 start/start.S。
.text.global _start_start:b Reset ; 0x00: 发⽣复位异常时从地址零处开始运⾏b HandleUndef ; 0x04: 未定义指令中⽌模式的向量地址b HandleSWI ; 0x08: 管理模式的向量地址,通过SWI指令进⼊此模式b HandlePrefetchAbort ; 0x0C: 指令预取终⽌导致的异常的向量地址b HandleDataAbort ; 0x10: 数据访问终⽌导致的异常的向量地址b HandleNotUsed ; 0x14: 保留b HandleIRQ ; 0x18: 中断模式的向量地址b HandleFIQ ; 0x1C: 快中断模式的向量地址这⾥,汇编指⽰符.text表明以下内容属于代码段,.global _start指明_start是全局可访问的符号。
基于Xilinx FPGA特点的嵌入式Bootloader设计与实现Bootloader程序是指嵌入式系统在正常工作之前,配置系统运行环境,引导操作系统的一小段程序。
通过这段程序,我们可以初始化硬件设备、建立内存空间映射等,从而将系统的软硬件环境带到一个合适的环境,为系统的正常运行做好准备。
对于不使用操作系统的嵌入式系统而言,应用程序的运行同样也需要依赖一个准备好的软、硬件环境,因此从这个意义上来讲,BootLoader程序对于嵌入式系统是必需的。
BootLoader程序与硬件系统密切相关,依赖于具体的嵌入式板级硬件设备的配置。
比如板卡的硬件地址配置、微处理器的类型和其他外设的类型等。
也就是说,即使是基于相同嵌入式微处理器构建的不同嵌入式目标板,BootLoader程序也不是完全通用的,仍需要修改其源程序。
与ARM等嵌入式系统的启动过程所不同的是,FPGA必须先将内部硬件逻辑配置完成之后,才能运行程序代码。
虽然可以直接将程序代码例化到片内BRAM中,但是由于FPGA 内部的BRAM资源有限,而且硬件逻辑配置时就会占用其中的资源,因此遇到大型系统设计时(例如带有TCP/IP协议的大型程序),片内BRAM资源不够,就必须使用外部的RAM来储存程序代码和堆栈,这就需要设计Bootloader程序来完成用户程序的引导。
本文结合Xilinx FPGA的特点详细给出了Bootloader程序设计和实现过程。
本设计所实现的Bootloader程序是在FPGA硬件配置完毕之后在MicroBlaze软核处理器上运行的一段启动代码,用来把Flash中的用户程序传输至外部RAM,并引导系统从用户程序中开始运行。
一、系统硬件平台的实现本设计的实现是以Xilinx公司的Spartan-3E FPGA、STMicroelectronics公司的SPI串行Flash(M25P16)、Micron Technology公司的DDR SDRAM (MT46V32M16)为主要器件构建硬件平台。
•Bootloader是在单片机上电启动时执行的一小段程序。
也称作固件,通过这段程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用应用程序准备好正确的环境。
Boot代码由MCU启动时执行的指令组成。
这里的loader指向MCU的Flash中写入新的应用程序。
因此,Bootloader是依赖于特定的硬件而实现的,因此,在众多嵌入式产品中目前还不可能实现通用Bootloader。
Bootloader的最大优点是:在不需要外部编程器的情况下,对嵌入式产品的应用代码进行更新升级。
它使得通过局域网或者Intemet远程更新程序成为可能。
例如,如果有5 000个基于MCU的电能表应用程序需要更新,电能表制造商的技术人员就可以避免从事对每一个电能表重新编程的巨大工作量,通过使用Bootloader的功能,由控制中心通过电能表抄表系统网络,远程对5 000个电表重新编程。
可见,Bootloader功能对于嵌入式系统的广泛应用具有十分重要的意义。
1 78K0/Fx2系列单片机简介78K0/Fx2系列是带CAN控制器的8位单片机,该系列单片机广泛应用于汽车电子,智能仪表等领域。
其内置POC(可编程上电清零电路)/LVI(可编程低电压指示器),单电压自编程闪存,引导交换功能(闪存安全保护),具有低功耗、宽电压范围、超高抗干扰等性能。
78K0系列单片机支持自编程(Self-programming)。
所谓自编程,是指用Flash存储器中的驻留的软件或程序对Flash存储器进行擦除/编程的方法。
通过单片机的自编程功能,可以设计Bootloader程序,通过串口等通信接口实现对产品重新编程、在线升级的功能。
以μPD78F0881为例。
μPD78F0881为78KO/Fx2系列中的一款44管脚单片机,内置32 KB Flash ROM,2 KB RAM,自带2个串行通信接口。
stc单片机bootloader程序编写随着科技的不断发展,单片机在各个领域的应用越来越广泛。
而在单片机的开发过程中,Bootloader程序的编写是非常重要的一环。
本文将介绍STC单片机Bootloader程序的编写方法。
首先,我们需要了解什么是Bootloader程序。
Bootloader程序是位于单片机内部的一段特殊代码,它的作用是在单片机上电或复位时,负责初始化硬件设备,并加载用户程序到内存中运行。
因此,Bootloader程序的编写质量直接影响到单片机的启动速度和稳定性。
在STC单片机中,编写Bootloader程序需要以下几个步骤:1. 确定Bootloader程序的存储空间:在STC单片机中,Bootloader 程序通常存储在内部Flash中。
因此,我们需要确定Bootloader程序的存储地址和大小。
一般情况下,Bootloader程序的大小应该尽量小,以便为用户程序留出更多的空间。
2. 编写Bootloader程序的初始化代码:在Bootloader程序中,我们需要编写初始化代码,用于初始化单片机的硬件设备,如时钟、GPIO 等。
这些初始化代码的编写需要根据具体的单片机型号和硬件配置来进行。
3. 实现用户程序的加载功能:Bootloader程序的核心功能是加载用户程序到内存中运行。
在STC单片机中,我们可以通过串口通信或其他外部设备来实现用户程序的加载。
例如,我们可以通过串口接收用户程序的数据,并将其写入到内存中。
4. 实现用户程序的跳转功能:当用户程序加载完成后,Bootloader 程序需要实现跳转到用户程序的功能。
在STC单片机中,我们可以通过设置程序计数器(PC)的值来实现跳转。
具体的跳转地址需要根据用户程序的存储地址来确定。
5. 添加Bootloader程序的升级功能:为了方便后续的固件升级,我们可以在Bootloader程序中添加升级功能。
通过升级功能,我们可以通过串口或其他外部设备将新的Bootloader程序写入到单片机中,从而实现Bootloader程序的更新。
bootloader的编写
编写一个bootloader是一个复杂的任务,需要了解计算机架构
和操作系统的启动过程。
以下是编写一个简单的x86 bootloader的基本步骤:
1. 确定引导扇区的位置:在硬盘的第一个扇区(通常是0号扇区)创建一个引导扇区。
这个扇区需要包含一个主引导记录(Master Boot Record,MBR),以便计算机可以正确地引导。
2. 编写MBR代码:MBR是引导扇区中的第一扇区,它包含
了启动计算机所需的你的代码。
MBR的大小为512字节,所
以你的代码必须小于或等于512字节。
3. 使用汇编语言:编写x86汇编语言代码来实现MBR的功能。
你需要了解x86指令集和寄存器的使用。
确保你的代码具有正确的引导标志,并设置正确的启动设备。
4. 编写启动代码:启动代码是你的汇编代码的一部分,它是在MBR中执行的。
启动代码负责加载进一步的代码和操作系统。
这段代码通常位于MBR的末尾,并将控制转移到加载的代码。
5. 加载操作系统:启动代码负责从硬盘上加载操作系统的剩余部分,然后将控制权交给操作系统。
需要注意的是,编写一个完整的、功能完备的bootloader涉及
到更多的细节和复杂性,包括读取硬盘、文件系统的支持、加
载器链等。
上述步骤仅为编写一个最基本的x86 bootloader提供了一个概览。
转载]Bootloader的基本概念一、Bootloader的基本概念一个嵌入式Linux系统从软件的角度看通常可以分为四个层次:引导加载程序、Linux 内核、文件系统、用户应用程序。
引导加载程序是系统加电后运行的第一段代码。
我们熟悉的PC中的引导程序一般由BIOS和位于MBR的OS bootloader(例如LILO或者GRUB)一起组成。
然而在嵌入式系统中通常没有像BIOS那样的固件程序(有的嵌入式CPU有),因此整个系统的加载启动任务就完全由bootloader来完成。
在嵌入式Linux中,引导加载程序即等效为bootloader。
简单地说,bootloader就是在操作系统内核运行前运行地一段小程序。
通过这段小程序,我们可以初始化必要的硬件设备,创建内核需要的一些信息并将这些信息通过相关机制传递给内核,从而将系统的软硬件环境带到一个合适的状态,最终调用操作系统内核,真正起到引导和加载内核的作用。
bootloader是依赖于硬件而实现的,特别是在嵌入式系统中。
不同的体系结构需求的bootloader是不同的;除了体系结构,bootloader还依赖于具体的嵌入式板级设备的配置。
也就是说,对于两块不同的嵌入式板而言,即使它们基于相同的CPU构建,运行在其中一块电路板上的bootloader,未必能够运行在另一块电路开发板上。
Bootloader的启动过程可以是单阶段的,也可以是多阶段的。
通常多阶段的bootloader 能提供更为复杂的功能,以及更好的可移植性。
从固态存储设备上启动的bootloader大多数是二阶段的启动过程,也即启动过程可以分为stage 1和stage 2两部分二、Bootloader的操作模式大多数bootloader都包含两种不同的操作模式:“启动加载”模式和“下载”模式,这种区别对于开发人员才有意义。
但从最终用户的角度看,bootloader的作用永远就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。