Bootloader架构介绍

本文详细介绍了S3C2440、S3C6410和S5PV210三种ARM处理器的启动流程及内存地址布局,并对bootloader的启动过程进行了深入分析,包括异常向量表设置、硬件初始化、外设初始化等关键步骤。

一、arm处理器启动流程

参考出处http://m.blog.youkuaiyun.com/blog/weicao1990/38150183:

1、S3C2440

支持从norflash和nandflash启动。

Nandflash不参与统一编址,CPU总是从编址的0地址处取指令执行,为了实现从nandflash启动,S3C2440芯片从在CPU启动的时候,首先将nandflash前面4kB的内容复制到芯片中的叫做stepping stone的sram中,steppping stone只有4KB大小,4KB的代码会完成一些硬件初始化的工作,并且将nandflash中剩余部分的代码复制到SDRAM中去,这部分代码包括bootload的剩余代码或者还有内核代码,并在内存中执行。S3C2440内存是从0x30000000地址开始的,也就是BANK6.

2、S3C6410

启动方式:norflash启动(但6410开发板并没有norflash)、oneNAND启动、MODEM启动、IROM(Internal ROM)启动(包括SD卡启动和NANDFLASH启动)。在0地址处是一个映射区域,当从IROM启动的时候,IROM的内容会映射到这一区域,CPU从这里开始取映射到此处的指令。

地址布局: InternalROM从0x08000000-0x0BFFFFFF、stepping stone从0x0C000000-0x0FFFFFFF、内存从0x50000000开始。

启动流程:选择从IROM启动,开发板上电之后,IROM被映射到0地址处,CPU取IROM中第一条指令。在IROM中有芯片厂商固化好的软件BL0,BL0会进行一些硬件的初始化,还会将放在nandflash中的BL1(8K)拷贝到stepping stone运行,BL1会将NANDFLASH中剩余的BL2拷贝到SDRAM中运行,从而完成整个bootload的运行。

3、S5PV210

启动方式:I-ROM启动,其中包括SD卡启动、NANDFLASH启动、USB启动、串口启动。

地址分布:

IROM从0xD0000000-0xD000FFFF的64KB的空间

IRAM(steppingstone)0xD0020000-0xD0037FFF的96KB空间。

0地址处采用映射模式,通过跳线选择映射设备。

内存从0x2000000-0x3FFFFFFF,512MB内存空间。

启动流程:处理器上电之后,IROM会被映射到0地址处,CPU从IROM中取第一条指令。固化在IROM中的BL0会进行硬件的初始化工作,之后BL0会将NANDFLASH中BL1拷贝InternalRAM(垫脚石,96KB),之后BL1拷贝剩余的BL2到垫脚石中。BL1和BL2都有最大空间容量,BL1最大不超过16KB,BL2最大不超过80KB,一般BL1只会进行代码复制工作,16KB空间足够,如果BL2超过了80KB,可以将超过80KB的部分拷贝到内存中。

二、bootloader启动流程

1、程序入口

         链接器脚本分析(uboot.lds):从start.s中_start开始启动

2、第一阶段程序分析

         2.1核心初始化

         在核心初始化中首先设置异常向量表,在板子上电之后首先进入reset中断,跳转之后设置处理器工作模式,然后关闭看门狗,关闭所有中断,关闭mmu以保证核心初始化顺利进行,最后外设基地址初始化、设置堆、清除bss以搭建C语言编程环境。

2.2其他初始化

由于各种初始化太多,且笔者初学,不宜归类之后影响读者,故取名为其他初始化,在其他初始化中依次包含系统时钟初始化、简单的nandflash初始化、然后把nandflash中的代码复制到内存中,进入下一阶段程序。

3、第二阶段程序分析

         从start.s中ldr pc, =main进去C语言本阶段主要进行mmu、中断、串口、网卡、LCD等外设初始化,可按照经典uboot代码修改之后移植。

 

后续文章将在裸机平台上详细分析各种初始化。

         

### Bootloader 的定义、功能、工作流程及相关技术细节 #### ### 1. Bootloader 的定义 Bootloader 是一种引导加载程序,负责初始化硬件并加载操作系统内核到内存中运行[^1]。它是嵌入式系统启动过程中的第一个执行代码,在系统加电后立即接管控制权。 --- #### ### 2. 功能概述 Bootloader 主要承担以下几项重要任务: - 初始化硬件资源(如时钟、电源管理单元、存储控制器等)。 - 配置必要的外设接口(如UART用于调试输出)。 - 加载操作系统镜像或其他应用程序到RAM中,并跳转至入口点开始执行。 - 提供用户交互界面或命令行工具以支持固件更新等功能[^3]。 --- #### ### 3. 工作流程详解 典型的Bootloader分为两个阶段操作: ##### (1)Stage 1 – 初级引导阶段 此阶段主要完成最基础的硬件设置,由于受到ROM/RAM容量限制,通常采用汇编语言编写。具体步骤如下: - 设置堆栈指针; - 解锁Flash存储器以便写入新数据; - 跳转进入高级引导阶段[^1]。 ##### (2)Stage 2 – 高级引导阶段 这一部分一般用C语言实现,提供更复杂的功能支持: - 进一步完善设备驱动初始化; - 实现文件系统解析能力从而定位kernel映像位置; - 将目标二进制代码复制到随机存取存储区; - 执行最后的手动切换动作激活OS核心[^3]。 --- #### ### 4. 技术细节探讨 ##### (a)体系结构依赖性 不同平台上的Bootloader会有显著差异,比如ARM架构下常使用的U-Boot相比x86 PC BIOS更加灵活多样。开发者需要熟悉对应处理器家族特性和指令集扩展才可高效构建专属解决方案。 ##### (b)多模式启动选项 现代Bootloader往往内置多种途径来适应各种场景需求,例如可以从NAND Flash、eMMC卡或者网络TFTP服务器等多种媒介获取待加载的目标程序副本[^3]。 ##### (c)安全考量要素 随着网络安全威胁日益严峻,许多新型Booatloaders引入了签名验证机制确保仅授权过的合法固件能够被执行,以此抵御恶意篡改攻击行为[^4]。 ```c // 示例:简单模拟一个bootloader框架结构 void bootloader_main() { init_hardware(); // Step A: Initialize basic peripherals. configure_clocks(); // Step B: Setup system clocks. if (check_firmware_update()) { load_new_image_from_storage(); } else { load_default_kernel(); } jump_to_os_entry_point(); // Transfer control to OS kernel. } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值