arm的bootloader的流程

合集下载

基于ARM9的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的结构和启动过程

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版本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 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启动流程分析汇编

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内核

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研究与实现

基于嵌入式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标准启动流程

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 四个阶段。

这些阶段依次执行,完成系统的初始化和启动过程,最终将控制权交给操作系统内核,由操作系统内核负责后续的运行和管理。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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。
相关文档
最新文档