arm的bootloader的流程
- 格式:ppt
- 大小:143.50 KB
- 文档页数:22
1引言在嵌入式系统中,通常没有像PC机中的BIOS那样的固件程序,因此整个系统的加载启动任务就完全由Bootloader来完成。
Bootloader是CPU加电后运行的第一段程序,它的作用就是对嵌入式系统中的硬件进行初始化,创建内核需要的一些信息并将这些信息通过相关机制传递给内核,从而将系统的软硬件环境带到一个合适的状态,最终调用操作系统内核,真正起到引导和加载内核的作用[1]。
Vivi是韩国Mizi公司开发的开源Bootloader,适用于ARM9核的S3C2410处理器。
Vivi的代码包括arch,init,lib,drivers和include等几个目录,共200多个文件。
2系统启动流程本系统所用的S3C2410处理器是三星公司生产的,其内核是ARM920T。
它片内集成了MMU,因此可以支持linux和WinCE等操作系统的运行。
芯片内部32M的SDRAM,还集成了32M的NandFlash和2M的NorFlash。
Vivi可以通过NandFlash启动,也可通过NorFlash启动。
NandFlash的特点就是代码不能在NandFlash上直接执行,要先下载在系统的RAM中才能执行。
当前市场上基于S3C2410微处理器的开发板绝大部分都是用NandFlash作为主存储器。
本文以NandFlash为例来分析Vivi的启动过程。
Vivi在Nandflash中有两种工作模式:启动加载模式与下载模式。
在启动加载模式(Autonomous)下,Vivi从目标机系统的Flash存储器中把操作系统加载到RAM中运行。
这是嵌入式系统在正常工作的时候采用的工作模式。
由于RAM的存取速度要比Flash快的多,这样做能提高代码的执行速度,加大系统的实时性。
下载模式(Downloading)下,从主机上下载的文件通常被Vivi保存到目标机的RAM中,然后再被烧写到Flash中。
在第一次安装Bootloader、系统内核和跟文件系统时,都采取这种工作模式,以后系统更新也会采取这种工作模式[2]。
Bootloader的结构和启动过程CPU上电后,会在某个地址开始执行,比如MIPS结构的CPU会从0xBFC00000取第一条指令,而ARM结构的CPU则从0x00000000开始,嵌入式开发板中,需要把存储器件ROM或Flash 等映射到这个地址。
而Bootloader就存在这个地址的开始处,这样一上电后就会从这个地址处执行。
Bootloader执行后从板子上的某个固态存储设备上将操作系统OS加载到RAM中运行。
(一些功能强大的Bootloader,比如U-boot在正常启动加载后可以延时若干秒(也可以自己设置),等待终端用户按下任意键后便可进入到下载模式;如果在指定的时间内没有按键,U-boot则会启动Linux内核,内核的启动参数可以是默认的或是由U-boot传递给它的)。
**注意:有的CPU在运行Bootloader之前先运行一段固件(firmware)中固化的boot代码,比如x86结构的CPU就是先运行BIOS中的固件然后才开始运行硬盘第一个分区中的Bootloader。
在大多数的嵌入式系统中并没有固件,Bootloader是上电后运行的第一个代码。
**下面便更细致得说明Bootloader的启动过程:从固态存储器上启动的Bootloader大多数是分二个阶段来启动的。
**第一个阶段**使用汇编代码来实现,它主要完成一些依赖于CPU体系结构的初始化,比如关看门狗、关中断、初始化RAM、将第二阶段调用的C语言代码复制到RAM(非必须,例如对于NOR Flash 等设备可以直接在上面执行,只不过比在RAM上执行效率低),设置CPU的速度和时钟频率(非必需,也可以放在第二阶段),设置好栈,跳转到第二阶段的C语言入口处等;**第二个阶段**通常用C语言来实现,它主要用来:初始化本阶段要用到的硬件设备、检测系统内存映射(就是确定板上使用了多少内存,他们的地址空间是什么)、将内核映像和根文件系统映像从Flash 上复制到内存RAM并且在内存中的某个固定位置为内核设置启动参数Boot parameters(Flash上的内核映像有可能是经过压缩的,那么读到RAM后还要进行解压。
arm版本linux系统的启动流程ARM架构是一种常见的处理器架构,被广泛应用于嵌入式设备和移动设备中。
在ARM版本的Linux系统中,启动流程是非常重要的,它决定了系统如何从开机到正常运行。
本文将详细介绍ARM版本Linux系统的启动流程。
一、引导加载程序(Bootloader)引导加载程序是系统启动的第一阶段,它位于系统的固化存储器中,比如ROM或Flash。
在ARM版本的Linux系统中,常用的引导加载程序有U-Boot和GRUB等。
引导加载程序的主要功能是加载内核镜像到内存中,并将控制权转交给内核。
二、内核初始化引导加载程序将内核镜像加载到内存后,控制权被转交给内核。
内核初始化是系统启动的第二阶段,它主要完成以下几个步骤:1. 设置异常向量表:ARM架构中,异常是指硬件产生的中断或故障,比如系统调用、中断请求等。
内核需要设置异常向量表,以便正确处理异常。
2. 初始化处理器:内核对处理器进行初始化,包括设置页表、启用缓存、初始化中断控制器等。
3. 启动第一个进程:内核创建第一个用户进程(一般是init进程),并将控制权转交给它。
init进程是系统中所有其他进程的父进程,负责系统的初始化工作。
三、设备树(Device Tree)设备树是ARM版本Linux系统中的一种机制,用于描述硬件设备的相关信息。
在内核初始化过程中,内核会解析设备树,并建立设备树对象,以便后续的设备驱动程序使用。
设备树描述了硬件设备的类型、地址、中断等信息,以及设备之间的连接关系。
它使得内核能够在运行时自动识别和配置硬件设备,大大提高了系统的可移植性和灵活性。
四、启动初始化(Init)启动初始化是系统启动的第三阶段,它是用户空间的第一个进程(init进程)接管系统控制权后的操作。
启动初始化主要完成以下几个任务:1. 挂载根文件系统:启动初始化会挂载根文件系统,使得用户可以访问文件系统中的文件和目录。
2. 加载系统服务:启动初始化会加载并启动系统服务,比如网络服务、日志服务、时间同步服务等。
主题:STM32F030 Bootloader 例程一、简介STM32F030是STMicroelectronics公司推出的一款32位ARM Cortex-M0内核的微控制器。
它具有丰富的外设,如GPIO、UART、SPI、I2C等,适用于各种嵌入式系统应用。
在嵌入式系统开发中,Bootloader是一个重要的组成部分,它能够实现固件的更新和管理,提高系统的灵活性和可靠性。
本文将介绍如何使用STM32F030的Bootloader例程进行固件升级。
二、准备工作在使用STM32F030的Bootloader例程之前,我们需要准备好以下工具和材料:1. STM32F030开发板2. USB转TTL串口模块3. ST-Link下载器4. 针对STM32F030系列的Bootloader例程源码三、下载和安装Bootloader例程源码1. 在STMicroelectronics官全球信息站下载针对STM32F030的Bootloader例程源码2. 将下载的源码解压缩到本地3. 打开Keil MDK-ARM开发环境,导入源码并进行编译四、烧录Bootloader程序1. 使用ST-Link下载器将编译好的Bootloader程序烧录到STM32F030开发板上2. 确保烧录成功后,通过串口工具连接USB转TTL串口模块到STM32F030的串口引脚上五、固件升级测试1. 将需要升级的固件通过串口工具上传到开发板2. 在Bootloader程序中编写相关代码来实现固件的升级和校验3. 运行Bootloader程序,进行固件升级测试六、总结通过本文的介绍,我们了解了如何使用STM32F030的Bootloader 例程进行固件升级。
在实际的嵌入式系统开发中,Bootloader的作用不仅局限于固件升级,还可以实现固件的管理和安全验证。
掌握Bootloader的开发和使用对于提高系统的稳定性和可靠性是非常重要的。
ARM11 bootl oader 启动流程分析班级:通信1106学号:311109020623姓名:王贵林目录1 前言 (1)2 ARM 技术概述 (2)2.1 ARM以及处理器概述 (2)2.1.1 ARM 简介 (2)2.1.2 ARM11处理器简介 (2)2.2 ARM微处理器体系结构 (3)2.2.1 ARM处理器寄存器组 (3)2.2.2 ARM处理器指令集 (4)2.2.3 ARM处理器寻址方式 (5)2.2.4 ARM11处理器工作模式 (6)3 开发工具 (7)3.1 软件工具 (7)3.1.1虚拟机 (7)3.1.2 redhat linux6 (7)3.1.3交叉工具链 (7)3.1.4 eclipse调试工具 (7)3.1.5链接器脚本 (7)3.1.6 Makefile工程管理器 (7)3.2硬件工具 (7)3.2.1 S3C6410开发板 (7)3.2.2 Jlink模拟下载器 (8)4 Bootloader 在s3c6410平台实现 (9)4.1初始化流程 (9)4.2初始化过程概述 (9)4.2.1 6410启动方式 (9)4.2.2 6410启动过程概述 (10)4.2.3 iROM启动过程简介 (11)4.3 BL1初始化阶段分析 (12)4.3.1创建异常向量表及代码实现 (12)4.3.2设置svc及代码实现 (14)4.3.3关闭看门狗及代码实现 (14)4.3.4关闭中断及代码实现 (16)4.3.5关闭Cache和mmu及代码实现 (17)4.3.6时钟终初始化及代码实现 (19)4.3.7内存初始化及代码实现 (27)4.3.8代码搬移及代码实现 (42)4.3.9 C语言环境初始化及代码实现 (43)结论 (45)致谢 (46)参考文献 (47)附录 (48)1 前言随着中国市场经济的持续发展和人民生活水平的不断提高。
智能家居,智能穿戴,物联网等一系列嵌入式产品逐渐进入家家户户。
ARM体系架构下的linux启动之一,从bootloader到linux内核1. bootloader 的启动bootloader 本身叫做嵌入式系统的引导程序。
但是,它支持X86,MIPS,PowerPC,ARM 等多种体系架构。
对于操作系统的启动来讲,当机器开始上电时,首先加载bootloader,它用来完成最基本的硬件的初始化,然后加载Linux 内核。
用于ARM 的bootloader 一般为U-BOOT,用它来完成对linux 内核的加载设置,一般bootloader 烧写在开发板的Flash 里,包括Nor Flash 或Nand Flash,其中由于NorFlash 支持芯片内执行XIP(eXcute In Place),代码可以直接在FLASH 上执行,而NandFlash 需要把代码拷到RAM 中再去执行。
但是RAM 的处理速度比Flash 的处理速度要快得多,一般仍然把代码放在RAM 中执行。
一般的bootloader 需要完成以下五种功能:1)RAM 的初始化:为调用linux 内核做准备。
2)串口的初始化:由于一般的嵌入式系统开发板上没有视频终端,只能用串口进行开发,串口的初始化非常重要。
3)检测处理器类型:用来预处理加载内核的处理器类型的传递工作。
4)设置Linux 的启动参数:包括加载地址,启动方式(从本地分区或NFS 进行根文件系统加载),以及Linux 根文件系统的加载方式。
通常用一个标记列表来记录linux 内核启动的各个参数。
5)调用linux 内核镜像:此时ARM 的处理器中的几个特殊的寄存器值:r0=0,r1=处理器类型,r2=标记列表在RAM 中的位置。
2. linux kernel 的启动分析。
ARMv8标准启动流程一、BL1阶段BL1(Bootloader 1)是ARMv8 架构中的第一个启动阶段。
当系统启动时,BL1 负责从非易失存储器中加载和执行接下来的引导加载程序(BL2 或BL31)。
在BL1 阶段,处理器会执行以下操作:初始化硬件:包括CPU、内存、中断控制器等。
加载BL2:通过BootROM(非易失存储器)加载BL2 到内存中。
设置异常向量表:为后续的异常处理提供支持。
进入C状态:处理器进入ARM C 模式,准备执行高级指令。
二、BL2阶段BL2(Bootloader 2)是ARMv8 架构中的第二个启动阶段。
在BL1 阶段完成后,BL2 会被加载到内存中并开始执行。
在BL2 阶段,处理器会执行以下操作:初始化硬件:包括网络接口、文件系统等。
加载并执行后续的引导加载程序(BL31 或BL33)。
设置异常向量表:为后续的异常处理提供支持。
进入C状态:处理器进入ARM C 模式,准备执行高级指令。
三、BL31/BL33阶段BL31 和BL33 是ARMv8 架构中的高级引导加载程序。
在BL2 阶段完成后,它们会被加载到内存中并开始执行。
在BL31 和BL33 阶段,处理器会执行以下操作:初始化硬件:包括GPU、I/O 设备等。
加载操作系统内核:将操作系统内核从非易失存储器中加载到内存中。
启动操作系统内核:通过引导加载程序调用操作系统内核的入口点,启动操作系统内核。
将控制权交给操作系统内核:将控制权交给操作系统内核,由操作系统内核负责后续的启动和运行过程。
总之,ARMv8 标准启动流程包括BL1、BL2、BL31 和BL33 四个阶段。
这些阶段依次执行,完成系统的初始化和启动过程,最终将控制权交给操作系统内核,由操作系统内核负责后续的运行和管理。
ARM-Linux嵌入式系统的BootLoader分析与设计0引言由BootLoader和固化在固件(firmware)中的Boot代码(可选)共同组成一个嵌入式系统的引导加载程序。
它的作用和功能就像固化到计算机内主板上的一个ROM芯片程序BIOS(basicinputoutputsystem)。
但是它一般不配置像BIOS那样的固件程序,这是因为要考虑经济方面的原因,因此必须自己完成这方面的工作。
BootLoader可以初始化硬件设备,建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准0 引言由Boot Loader和固化在固件(firmware)中的Boot代码(可选)共同组成一个嵌入式系统的引导加载程序。
它的作用和功能就像固化到计算机内主板上的一个ROM芯片程序BIOS(basic input output system)。
但是它一般不配置像BIOS那样的固件程序,这是因为要考虑经济方面的原因,因此必须自己完成这方面的工作。
Boot Loader可以初始化硬件设备,建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
它的实现严重地依赖于硬件,特别是在嵌入式系统中,即使基于同一个CPU的Boot Loader,对于不同的板子,也有很大的不同。
1 Boot Loader分析系统加电,然后复位后,基本上所有的CPU都是从复位地址上取得指令的。
以微处理器为核心的嵌入式系统中,通常都有某种类型的固态存储设备(FLASH,E2PROM等),这个固态存储设备被映射到一个预先设置好的地址上。
在系统加电复位后,一开始处理器就会去执行存放在复位地址处的程序,而且通过开发环境可以将Boot Loader定位在复位地址一开始的存储空间上,因此Boot Loader是系统加电后,在操作系统内核或者一些应用程序被运行之前,首先会运行的程序。
基于ARM的嵌入式系统Bootloader启动流程分析来源:西部工控网一. 引言:PC机,其开机后初始化处理器配置、硬件初始化等操作是由BIOS(Basic Input /Output System)完成,但嵌入式系统来说,出于经济性、价格方面考虑一般不配置BIOS,我们必须自行编写完成这些工作程序,这就是所需要开机程序。
而嵌入式系统中,通常并没有像 BIOS 那样固件程序,启动时用于完成初始化操作这段代码被称为Bootloader程序,整个系统加载启动任务就完全由Bootloader 来完成。
简单说,这段程序,可以初始化硬件设备、建立内存空间映射图(有CPU没有内存映射功能如S3C44B0),将系统软硬件环境设定一个合适状态,为最终调用操作系统内核、运行用户应用程序准备好正确环境。
Bootloader依赖于实际硬件和应用环境,要为嵌入式系统建立一个通用、标准Bootloader是非常困难。
Bootloader也依赖于具体嵌入式板级设备配置,这也就是说,两块不同嵌入式主板而言,它们是基于同一CPU 而构建,要想让运行一块板子上 Bootloader 程序也能运行另一块板子上,通常都需要修改 Bootloader 源程序。
二. 启动流程系统加电复位后,几乎所有 CPU都从由复位址上取指令。
比如,基于ARM7TDMI内核CPU复位时通常都从址 0x00000000处取它第一条指令。
而以微处理器为核心嵌入式系统通常都有某种类型固态存储设备(比如EEPROM、FLASH等)被映射到这个预先设置好址上。
系统加电复位后,处理器将首先执行存放复位址处程序。
集成开发环境可以将Bootloader定位复位址开始存储空间内,Bootloader是系统加电后、操作系统内核或用户应用程序运行之前,首先必须运行一段程序代码。
嵌入式系统来说,有使用操作系统,也有不使用操作系统,比如功能简单仅包括应用程序系统,但系统启动时都必须执行Bootloader,为系统运行准备好软硬件运行环境。
ARM的固件和bootloader,STANDSTONE固件程序,OS初始化ARM的固件和bootloader,STANDSTONE固件程序,OS初始化Firmware和bootloader固件程序通常驻留在ROM中的,当系统上电时,首先执行的程序。
一个主要的目的就是加载和启动操作系统,这部分程序叫为bootloader。
固件程序执行流程为:系统的image储存在某种媒介上,通常是有文件系统(file system)的,这时候image就是一个文件,操作文件需要固件程序能够支持文件系统。
image也可能就是一组二进制代码,这是最原始的image。
通常ARM的image是ELF格式的,带有头和调试信息,ELF是老的COFF 格式的升级版。
----------------------------STANDSTONE固件程序书中介绍了一个叫STANDSTONE的简单固件程序,它完成设置系统环境、加载并启动镜像的功能。
所谓启动就是将系统的控制权交给启动了镜像,也就是一般所说的操作系统了。
STANDSTONE的程序工程组织结构:可以看出,编译好的STANDSTONE产生的image,不仅包含了STANDSTONE的代码,而且包含了payload的bin(二进制镜像)。
STANDSTONE的执行流程:ARM上电时从0x00000000开始执行,向量表就放在该地址,上电即进入reset异常。
STANDSTONE较简单,没用其他异常,将其都设置成循环。
reset异常,处理器跳转到standstone_init1的地方去运行,接着是第二步:这一步在设置系统寄存器里特定的LED显示寄存器。
这部分代码完成了内存重映射,本来flash ROM是0地址开始的,现在编程了0x01800000,当然物理上是没变,只是逻辑上改了。
并且初始化了两个bank的SRAM。
分析代码:第一句是重映射钱standstone_init2的绝对地址,standstone_init2是固件程序的一部分,所以肯定在0x0到0x00080000范围内,重映射好要接着执行standstone_init2,所以需要计算出重映射好之后的地址,这也就是第三句指令做的事。
经验交流44ARM嵌入式系统Bootloader的设计与分析李丽郝继飞杨莹陈章祥(中国矿业大学信息与电气工程学院)摘要:Bootloader的编写在嵌入式系统软件开发中非常重要。
基于S3C44B0X硬件平台,文章介绍了Bootloader开发的相关原理和设计方法。
对经过实践验证的启动代码,进行了详细的分析。
关键词:嵌入式系统;ARM;Bootloader;启动代码1引言嵌入式系统的Bootloader,类似于PC上的BIOS,是系统上电/复位后,内核启动程序之前执行的一段程序,用以完成整个系统的启动加载任务。
其功能主要是初始化CPU、内存控制器、看门狗等硬件设备,然后配置存储映射,建立系统的内存空间映射图(有的CPU没有内存映射功能如S3C44B0),从而将系统软硬件设置到合适状态,最后将操作系统内核解压加载到RAM中,并且跳转到操作系统的起始代码部分去执行。
它是嵌入式系统开发的一个难点,在整个开发中占有相当大分量。
由于依赖于实际的硬件和应用环境,要为嵌入式系统建立一个通用、标准的Bootloader是非常困难的。
开发者需要自行开发或移植Bootloader。
Bootloader 也依赖于具体的嵌入式板级设备的配置,也就是说,对于两块不同的嵌入式主板,即使它们是基于同一CPU而构建,要想让运行在一块板子上的Bootloader 程序也能运行在另一块板子上,通常都需要修改Bootloader的源程序。
本文以三星公司的S3C44BOX 为硬件平台,给出了Bootloader的设计和实现方案。
2系统平台简介本文嵌入式系统的硬件平台是基于三星的S3C44BOX微处理器。
S3C44BOX最突出的优点是它的CPU采用ARM公司的16/32位ARM7TDMI RISC 结构,工作在66MHz。
S3C44BOX通过在ARM7TDMI 内容的基础上扩展一系列完整的通用外围器件,使系统的费用降至最低,消除了增加附加配置的需要。
基于Armlinux的BOOTLOADER引导程序研究摘要:本文介绍了嵌入式系统Bootloader的基本概念,阐述了在S3C2410中实现Bootloader的基本流程,重点分析了Bootloader中关于外部中断(IRQ)处理的详细过程。
关键词:嵌入式系统;引导程序;嵌入式系统;引导程序;BootLoader; S3C2410.1.引言作为一种16/32位的高性能、低成本、低功耗的嵌入式RISC (Reduced Instruction Set Computer)微处理器,ARM (Advanced RISC Machines )微处理器目前已经成为应用最为广泛的嵌入式微处理器。
在嵌入式系统开发中Bootloader 常常是嵌入式系统开发中可能遇到的第一个技术难点。
应用程序运行环境能否正确构建,内核能否启动成功,都取决于Bootloader能否正确的工作。
一个功能完善的嵌入式系统Bootloader还要求能够提供系统更新的能力,以及为了实现这一操作所需要的一个简单的命令控制台。
2、BoodLoader的简介2.1BootLoader的定义简单地说,Boot Loader 就是在操作系统内核运行之前运行的一段小程序。
通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
Boot Loader 是严重地依赖于硬件而实现的,特别是在嵌入式世界2.2 BootLoader的重要地位(1)Bootload是系统运行的第一个程序。
Bootload程序通常是存放在系统复位完成之后pc指针所指向的地方。
所以,在复位完后,Bootload程序将被第一个执行,用来初始化硬件,装载操作系统镜像等等工作。
如果第一个运行的程序被破坏无法运行,后续程序就不可能没有办法运行了。
(2)Bootload是启动操作系统的第一步。
操作系统的映像是通过bootload载入到内存中的。
1.硬件初始化和系统引导完整的Bootloader引导流程可描述如下:硬件初始化阶段一-> 复制二级Exception Vector Table -> 初始化各种处理器模式-> 复制RO和RW,清零ZI -> (跳转到C代码入口函数) -> 初始化Exception/Interrupt Handler Entry Table -> 初始化Device Drivers -> 硬件初始化阶段二-> 建立人机界面下面对上述各步骤逐一加以说明。
1.1 硬件初始化阶段一板子上电或复位后,程序从位于地址0x0的Reset Exception Vector处开始执行,因此需要在这里放置Bootloader的第一条指令:b ResetHandler,跳转到标号为ResetHandler处进行第一阶段的硬件初始化,主要内容为:关Watchdog Timer,关中断,初始化PLL和时钟,初始化Memory Controller。
比较重要的是PLL的输出频率要算正确,这里把它设置为50MHz;后面在计算SDRAM的Refresh Count和UART的Baud Rate等参数时还要用到。
1.2 复制二级Exception Vector TableException Vector Table是Bootloader与uClinux Kernel发生联系的地方之一(另两处是加载and/or调用Kernel,以及向Kernel传递启动参数)。
ARM7规定Exception Vector T able 的基地址是0x0,所以Flash Memory的基地址也必须是0x0;而S3C44B0X处理器又不支持Memory Remap,这意味着无论运行什么样的上层软件,一旦发生中断,程序就得到Flash Memory中的Exception Vector Table里去打个转(中断Interrupt是异常Exception的一种)。