arm的bootloader的流程
基于ARM9的Bootloader启动流程分析
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的结构和启动过程
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版本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 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的开发和使用对于提高系统的稳定性和可靠性是非常重要的。
ARM11bootloader启动流程分析汇编
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内核
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 的启动分析。
基于嵌入式ARM的Bootloader研究与实现
三、Bootloader的研究进展开嵌 入式ARM系统的Bootloader研究 与实现
三、Bootloader的研究进展开嵌入式ARM系统的Bootloader研究与 实现
嵌入式ARM系统在许多领域得到广泛应用,如工业控制、智能家居、通信设备 等。在这些应用场景中,Bootloader的作用不言而喻。本次演示将深入探讨嵌入 式ARM系统的Bootloader研究与实现。
内存管理模块主要负责内存的映射和保护工作。为了实现通用性,我们可以 采用内存分页和分段的技术来实现内存管理。通过将内存分为不同的段或页,我 们可以实现对内存的灵活管理。例如,我们可以将系统程序代码映射到 0x~0x0FFFFFFF的空间,将数据映射到0x~0x1FFFFFFF的空间等。
4、异常处理模块
一、Bootloader的启动过程
5、将引导程序加载到内存中,并跳转到该执行。
二、Bootloader的实现方法
二、Bootloader的实现方法
1、汇编语言实现:由于Bootloader需要直接与硬件打交道,因此通常使用 汇编语言实现。常用的汇编语言有ARM汇编和Keil汇编。
二、Bootloader的实现方法
基于嵌入式ARM的 Bootloader研究与实现
目录
01 一、Bootloader的 启动过程
03 三、Bootloader的 研究进展开嵌入式 ARM系统
02 二、Bootloader的 实现方法
04 参考内容
嵌入式ARM系统的Bootloader研 究与实现
嵌入式ARM系统的Bootloader研究与实现
三、通用Bootloader的实现
为了进一步实现通用的Bootloader,我们还需要使用一种可扩展的程序设计 方法。该方法允许我们在不更改程序代码的前提下,通过添加不同的模块来实现 不同的功能。例如,我们可以添加一个网络模块来实现从网络启动的功能;我们 也可以添加一个USB模块来实现从USB设备启动的功能。
armv8标准启动流程
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分析与设计.
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启动流程分析
基于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初始化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,所以需要计算出重映射好之后的地址,这也就是第三句指令做的事。
ARM嵌入式系统Bootloader的设计与分析
经验交流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 内容的基础上扩展一系列完整的通用外围器件,使系统的费用降至最低,消除了增加附加配置的需要。
ARM汇编语言程序设计基础 第10章 Bootloader 设计基础
完整版ppt
5
10.1.1 Bootloader 的作用
初始化CPU速度; 初始化内存,包括启用内存库,初始化内存配置寄存器等; 初始化中断控制器,在系统启动时,关闭中断,关闭看门狗; 初始化串行端口(如果在目标上有的话); 启用指令/数据高速缓存; 设置堆栈指针; 设置参数区域并构造参数结构和标记,即引导参数; 执行POST(上电自检)来标识存在的设备并报告有何问题; 为电源管理提供挂起/恢复支持; 传输操作系统内核镜像文件到目标机。也可以将操作系统内核镜像文件事先存放
完整版ppt
4
10.1.1 Bootloader 的作用
Bootloader从第一条指令跳转后,就开始 初始化各种最重要的硬件,比如CPU的工 作频率、定时器、中断、看门狗、检测 RAM大小和Flash等。一般,硬件初始化 的这段程序是用汇编语言编写的,其后 就用C语言编写。总体上Bootloader主要 完成以下工作:
在PC机中,主板的BIOS和位于硬盘0磁道上的主引导 记录(Master Boot Record, MBR)中的引导程序(如 LILO或GRUB等),两者一起的作用就相当于Bootloader 在嵌入式系统中的作用,即实现整个系统的启动引导, 并最终能引导操作系统的运行。
基于Armlinux的BOOTLOADER引导程序研究
基于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载入到内存中的。
ARM—Linux嵌入式系统BootLoader的配置与移植
蠢霞NG Lei。珏U Hal.na (CoUege of Computer Science&Tech.,Xud瑚a University,Xuclmg 461000,China)
the哂tO挝触the年蛾翩such鹞the Ahgrset:Embedded system omfiguraticn and transplantatiⅨa is
Oct. 2008
ARM—Linux嵌入式系统BootLoader的配置与移植
孟雷,忽海娜
(译蔼擎篦谤算祝耪学与技术学院,河南许蒜461000)
摘褰:嵌入式系统陆tl舶d凹的配置及移檬是解决嵌入式系统的启动、初始化、搽作系统内核的固化和弓I龉等问题的关
键。分耩-r ARM-Linux嵌入姨系统戆维羧,会绥了1300tLoader熬撬念及移蕉、骖羧爨要注意豹阚疆。劳激¥3C4480缝
transplantation
S3CA480讲a=e霸of as an雠-
lo抵the妇出站魄progtmn窝渲融∞a融,rl威ove maple,real酶the configuration and tmasohntation in the Linux蜀瞎tem.By
the start
&ini痂燕跪矗m of鼎豳edded system.
·205·
1)高性能、低功耗。 2)支持以太网接口。 3)丰富的中断控制器,以满足与FPGA接口的需 要。 4)U=D控制器。 5)至少拥有2个I,ART接口(CPU与GPRS模块 接口为IIART)。 6)拥有12C总线控制器。
接口,以方便与黝连接。 7)基于ARM的收视率终端设备,实现丰富的I/O
每种不同的CPU体系结构都有不同的BootLoad. er。除了依赖于CPU的体系结构外,BootLoader实际 上也依赖于具体的嵌入式板级设备的配置,比如板卡 的硬件地址分配,RAM芯片的类型,其他外设的类型 等。这也就是说,对于两块不同的嵌入式板而言,即使 它们是基于同一种CPU而构建的,如果他们的硬件资 源和配置不一致的话,要想让运行在一块板子上的
bootloader流程2
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的一种)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Boot Loader 所支持的 CPU 和 嵌入式板
每种不同的 CPU 体系结构都有不同的 Boot Loader。有些 Boot Loader 也支持多种体系 结构的 CPU,比如 U-Boot 就同时支持 ARM 体系结构和MIPS 体系结构。除了依赖于 CPU 的体系结构外,Boot Loader 实际上也依赖于 具体的嵌入式板级设备的配置。这也就是说 ,对于两块不同的嵌入式板而言,即使它们是 基于同一种 CPU 而构建的,要想让运行在一 块板子上的 Boot Loader 程序也能运行在另一 块板子上,通常也都需要修改 Boot Loade r 的源程序。
嵌入式系统的bootloader
Bootloader 代码是芯片复位后 进入操作系统之前执行的一段代码,主要 用于完成由硬件启动到操作系统启动的过 渡,从而为操作系统提供基本的运行环境, 如初始化CPU、 堆栈、存储器系统等。 Bootloader 代码与CPU 芯片 的内核结构、具体型号、应用系统的配置 及使用的操作系统等因素有关,其功能类 似于PC机的BIOS程序
/* #define CONFIG_BOOTARGS "root=ramfs devfs=mount console=ttySAC0,115200" */ #define CONFIG_BOOTARGS "noinitrd root=/dev/bon/2 init=/linuxrc console=ttyS0" #define CONFIG_ETHADDR 08:00:3e:26:0a:5b #define CONFIG_NETMASK 255.255.255.0 #define CONFIG_IPADDR 192.168.1.15 #define CONFIG_SERVERIP 192.168.1.128 /*#define CONFIG_BOOTFILE "elinos-lart" */ #define CONFIG_BOOTCOMMAND "tftp 30007fc0 z; bootm 30007fc0"
4. 用户应用程序。特定于用户的应用程序。 有时在用户应用程序和内核层之间可能还会 包 括一个嵌入式图形用户界面。常用的嵌入式 GUI 有:MicroWindows 和 MiniGUI 懂。
系统的典型构建
Boot Loader 的操作模式 (Operation Mode)
大多数 Boot Loader 都包含两种不同的 操作模式:"启动加载"模式和"下载"模式, 这种区 别仅对于开发人员才有意义。但从最终 用户的角度看,Boot Loader 的作用就是 用来加载 操作系统,而并不存在所谓的启动加载 模式与下载工作模式的区别。
主要修改的文件有
include/configs/2410.h ---- 配置文 件,大部分参数是这里配置的. board/wx/wx20/lowlevel_init.S -内存参数配置 cpu/s3c44b0/serial.c -- 串口配置 cpu/s3c44b0/start.S -- 程序入口 lib_arm /armlinux
smdk2410=> tftp TFTP from server 192.168.1.15; our IP address is 192.168.1.128 Filename 'zImage'. Load address: 0x 33000000
Booting image at 33000000... Image Name: linux-2.6.10 Created: 2006-01-12 20:31:21 UTC Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 900588 Bytes = 879.5 kB Load Address: 33000000 Entry Point: 30008000
Boot Loader 的主要任务与典型结构框架 假定内核映像与根文件系统映像 都被加载到 RAM 中运行。之所以提出这样一 个假设前提是因为,在嵌入式系统中内核映像 与根文件系统映像也可以直接在 ROM 或 Flash 这样的固态存储设备中直接运行。但这 种 做法无疑是以运行速度的牺牲为代价的。从操 作系统的角度看,Boot Loader 的总目标就 是正确地调用内核来执行。
启动加载(Boot loading)模式:这种模式 也称为"自主"(Autonomous)模式。也即 Boo t Loader 从目标机上的某个固态存储设备上 将操作系统加载到 RAM 中运行,整个过程 并 没有用户的介入。这种模式是 Boot Loader 的正常工作模式,因此在嵌入式产品发布的 时 侯,Boot Loader 显然必须工作在这种模式 下。
由于 Boot Loader 的实现依赖于 CPU 的体系 结构,因此大多数 Boot Loader 都分 为 stage1 和 stage2 两大部分。依赖于 CPU 体系结构的代码,比如设备初始化代码等, 通常都放在 stage1 中,而且通常都用汇编 语言来实现,以达到短小精悍的目的。而 sta ge2 则通常用C语言来实现,这样可以实现 给复杂的功能,而且代码会具有更好的可读 性和 可移植性。
比如2410.h里的(摘录;部分) #define CFG_LONGHELP /* undef to save memory */ #define CFG_PROMPT "ARMSYS2410-B # " /* Monitor Command Prompt */ #define CFG_CBSIZE 256 /* Console I/O Buffer Size */ #define CFG_MEMTEST_START 0x30000000 /* memtest works on */ #define CFG_MEMTEST_END 0x33F00000 /* 63 MB in DRAM */
#define CFG_LOAD_ADDR 0x33000000 /* default load address */ #define PHYS_FLASH_SIZE 0x00100000 /* 1MB */ #define CFG_MAX_FLASH_SECT (19) /* max number of sectors on one chip */ #define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x0F0000) /* addr of environment */
Verifying Checksum ... OK XIP Kernel Image ... OK ## Transferring control to Linux (at address 30008000) ... Kernel command line is console=ttyS0 root=/dev/nfs nfsroot=192.168.0.101:/armsys2410/root ip=192.168.0.111:192.168.0.1:192.168.0.1:2 55.255.255.0::eth0:off Starting kernel ...
下载(Downloading)模式:在这种模式下,目标 机上的 Boot Loader 将通过串口连接或 网络连接等通信手段从主机(Host)下载文件,比 如:下载内核映像和根文件系统映像等 。从主机下载的文件通常首先被 Boot Loader 保存 到目标机的 RAM 中,然后再被 Boot Loader 写到目标机上的FLASH 类固态存储设备中。 Boot Loader 的这种模式通常在第一次 安装内核与根文件系统时被使用;此外,以后的系 统更新也会使用 Boot Loader 的这种工 作模式。工作于这种模式下的 Boot Loader 通常都 会向它的终端用户提Arm9嵌入式linux系统的构建与应用 Bootloader技术内幕
Boot Loader 的 stage1 通常包括以下步骤(以执行 的先后顺序): · 硬件设备初始化。 · 为加载 Boot Loader 的 stage2 准备 RAM 空间。 · 拷贝 Boot Loader 的 stage2 到 RAM 空间中。 · 设置好堆栈。 · 跳转到 stage2 的 C 入口点。 Boot Loader 的 stage2 通常包括以下步骤(以执行 的先后顺序): · 初始化本阶段要使用到的硬件设备。 · 检测系统内存映射(memory map)。 · 将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中。 · 为内核设置启动参数。 · 调用内核。
3.RAM 初始化。包括正确地设置系统的内存 控制器的功能寄存器以及各内存库控制寄存器 等。 4.初始化 LED。典型地,通过 GPIO 来驱动 LED,其目的是表明系统的状态是 OK 还是 Error。如果板子上没有 LED,那么也可以通 过初始化 UART 向串口打印 Boot Loader 的 Logo 字符信息来完成这一点。
修改后重新编译会生成u-boot.bin二进制文件 一个成功移植后的启动代码: U-Boot 1.1.4 (Jan 14 2006 - 02:09:02) U-Boot code: 33F80000 -> 33F9985C BSS: -> 33F9D970 RAM Configuration: Bank #0: 30000000 64 MB Flash: 1 MB In: serial Out: serial Err: serial Hit any key to stop autoboot: 0
嵌入式 Linux 系统 的四个层次
1. 引导加载程序。包括固化在固件(firmware) 中的 boot 代码(可选),和 Boot Loader 两大部分。 2. Linux 内核。特定于嵌入式板子的定制内核 以及内核的启动参数。 3. 文件系统。包括根文件系统和建立于 Flash 内存设备之上文件系统。通常用 ram dis k 来作为 root fs。