第5章_Bootloader_设计基础
bootloader

引导程序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原理

bootloader原理引言:在计算机系统中,bootloader(引导加载程序)是启动计算机操作系统的第一个程序。
它的主要作用是初始化系统硬件并加载操作系统内核,使计算机能够正常启动。
本文将详细介绍bootloader的原理和工作流程。
一、bootloader的作用bootloader是计算机启动过程中的重要组成部分,其作用主要有以下几个方面:1. 初始化硬件:bootloader负责初始化计算机系统的硬件设备,包括CPU、内存、外设等。
通过与硬件交互,确保系统能够正常运行。
2. 加载操作系统内核:bootloader从硬盘或其他存储设备中读取操作系统内核的镜像文件,并将其加载到内存中。
加载完成后,将控制权交给操作系统。
3. 提供启动选项:bootloader可以提供多个启动选项,允许用户选择不同的操作系统或系统配置。
这在多系统或多配置的计算机中尤为重要。
二、bootloader的工作流程1. 加电自检:当计算机加电时,CPU会首先执行自检程序,检测硬件设备是否正常工作。
自检完成后,将转移到bootloader程序上。
2. 加载bootloader:在计算机的硬盘或其他存储设备中,有一个固定的位置存放着bootloader程序。
CPU会通过读取存储设备上的引导扇区,将bootloader加载到内存中。
3. 初始化硬件:bootloader会初始化计算机的硬件设备,包括CPU、内存、硬盘、显示器等。
这些初始化操作是为了确保系统能够正常运行,并为操作系统的加载做好准备。
4. 加载操作系统内核:bootloader会从存储设备中读取操作系统内核的镜像文件,并将其加载到内存中的指定位置。
加载完成后,bootloader将控制权交给操作系统。
5. 启动操作系统:操作系统接管控制权后,会执行自己的初始化操作,并进入正常的工作状态。
至此,计算机的启动过程完成。
三、bootloader的实现方式bootloader的实现方式因计算机架构和操作系统而异。
Bootloader

•
1.
Bootloader的启动模式
正常启动模式 Bootloader启动后完成软硬件初始化、加载启动OS。启动过程中没有任 何用户介入。该模式是产品发布后的工作模式 2. 下载模式 Bootloader完成软硬件初始化后,用户可以介入使用各种命令进行开 发调试和文件传输。该模式只用于开发阶段。
Bootloader一般支持两种模式(能在两种模式下自由切换)
Bootloader的启动过程
• 第二阶段
(1)初始化第二阶段需要使用的硬件设备。 (2)建立内存映射。建立内存映射的任务就是把虚拟地址空间映射到物 理内存空间中。 (3)把存储在Flash中的内核镜像和文件系统镜像加载到内存中的指定 位置。 (4)设置内核启动参数。 需要与内核约定参数的地址。 (5)跳转到内核入口处。 1. CPU处于SVC模式,并关闭IRQ和FIQ。 2.关闭MMU和Cache。 3. CPU寄存器R0的值为0。 4. CPU寄存器R1的值等于处理器平台类型的值(所有处理器平台类型的 值都记录在内核arch/arm/tools/mach-types文件中)。 5. CPU寄存器R2的值是内核启动参数的物理地址
Bootloader的启动过程
• 谢谢大家!
BootLoader
吴士力 e-mail: wsl.wushili@
ቤተ መጻሕፍቲ ባይዱ
Bootloader概述
• Bootloader的概念
1. PC机中的Bootloader(BIOS) 加电启动BIOS 硬件初始化 MBR中的OS引导程序 启动OS 2. 嵌入式系统中的Bootloader 加电启动Bootloader 硬件初始化 软件初始化 加载启动OS
•
Bootloader的功能
单片机bootloader原理

单片机bootloader原理一、引言单片机是一种集成了微处理器核心、存储器和输入输出接口的微型计算机系统。
在单片机的开发过程中,bootloader(引导程序)被广泛应用,其作用是在系统上电或复位时,负责加载和启动应用程序。
本文将介绍单片机bootloader的原理和工作流程。
二、bootloader的作用bootloader是单片机系统的第一个运行的程序,其主要作用如下:1. 初始化系统的硬件资源,如时钟、中断等。
2. 加载和运行应用程序。
3. 支持固件更新,可以通过串口或其他接口加载新的应用程序。
4. 提供调试和故障排除的功能。
三、bootloader的原理bootloader的原理可以简要概括为以下几个步骤:1. 系统上电或复位后,单片机会从固定的地址开始执行代码,这个地址就是bootloader的入口地址。
2. bootloader首先会进行硬件初始化,包括时钟设置、中断向量表的初始化等。
3. 然后,bootloader会检查是否存在新的固件更新。
如果有更新,bootloader会加载新的固件到指定的存储空间。
4. 如果没有固件更新,bootloader会加载应用程序到内存中,并跳转到应用程序的入口地址开始执行。
5. 应用程序执行完毕后,bootloader可以对系统进行复位或其他操作。
四、bootloader的工作流程下面以一个简单的bootloader工作流程来说明其原理:1. 单片机上电或复位后,开始执行bootloader的代码。
2. bootloader首先进行硬件初始化,设置时钟、中断等。
3. bootloader会检查是否存在固件更新的标志。
如果有标志,则执行固件更新操作。
4. 如果没有固件更新标志,bootloader会加载应用程序到内存中,并跳转到应用程序的入口地址开始执行。
5. 应用程序执行完毕后,bootloader可以对系统进行复位或其他操作。
五、bootloader的优点bootloader具有以下几个优点:1. 灵活性高:bootloader可以根据需求加载不同的应用程序,实现系统的灵活升级和更新。
单片机自编程及Bootloader设计

•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程序编写

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锁定本词条由“科普中国”百科科学词条编写与应用工作项目审核。
行之前运行。
可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最U也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。
在一个基于ARM7TDM I00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader程序。
中文名启动装载外文名BootLoader说明系统启动前引导程序操作模式启动模式、交互模式1背景介绍Bootloader是嵌入式系统在加电后执行的第一段代码,在它完成CPU和相关硬件的初始化之后,再将操作系统映像或固化的嵌入式应用程序装在到内存中然后跳转到操作系统所在的空间,启动操作系统运行。
[1]对于嵌入式系统,Bootloader是基于特定硬件平台来实现的。
因此,几乎不可能为所有的嵌入式系统建立一个通用的Bootloader,不同的处理器架构都有不同的Bootloader 。
Bootloader不但依赖于CPU的体系结构,而且依赖于嵌入式系统板级设备的配置。
对于2块不同的嵌入式板而言,即使它们使用同一种处理器,要想让运行在一块板子上的B ootloader程序也能运行在另一块板子上,一般也都需要修改Bootloader的源程序。
反过来,大部分Bootloader仍然具有很多共性,某些Bo otloader也能够支持多种体系结构的嵌入式系统。
例如,U-Boot就同时支持PowerPC、ARM、MIPS和X86等体系结构2操作模式1.自启动模式:在这种模式下,bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。
2.交互模式:在这种模式下,目标机上的bootloader将通过串口或网络等通行手段从开发主机(Host)上下载内核映像等到RAM中。
可以被bootloader写到目标机上的固态存储媒质中,或者直接进入系统的引导。
bootloader通俗解释

bootloader通俗解释【实用版】目录1.Bootloader 的通俗解释2.Bootloader 的功能和作用3.Bootloader 的种类和应用正文一、Bootloader 的通俗解释Bootloader,中文俗称“引导程序”,是计算机系统启动时运行的第一个程序。
它可以理解为一个“中介”,负责在操作系统启动前,协调硬件与软件之间的沟通,将操作系统从存储设备加载到内存中,并最终将控制权交给操作系统。
二、Bootloader 的功能和作用1.硬件初始化:Bootloader 负责对计算机硬件进行初始化,包括内存、外设、总线等,为操作系统运行做好准备。
2.加载操作系统:Bootloader 将操作系统从存储设备(如硬盘、U 盘等)中读取到内存中,为操作系统的启动提供支持。
3.设置启动参数:Bootloader 可以根据用户需求,设置不同的启动参数,例如选择不同的操作系统、进入 BIOS 设置等。
4.诊断和自检:Bootloader 可以对计算机硬件进行自检,诊断硬件是否存在问题,并在启动时显示相关信息,方便用户了解系统状态。
三、Bootloader 的种类和应用1.BIOS:BIOS(Basic Input/Output System,基本输入输出系统)是一种最基本的 Bootloader,主要应用于早期的计算机系统。
它主要负责硬件的初始化和操作系统的加载。
2.UEFI:UEFI(Unified Extensible Firmware Interface,统一可扩展固件接口)是一种更先进的 Bootloader,主要应用于现代计算机系统。
相较于 BIOS,UEFI 具有更好的兼容性和可扩展性,可以支持更多的硬件设备和操作系统。
3.GRUB:GRUB(GNU GRand Unified Bootloader,GNU 统一引导加载程序)是一种开源的 Bootloader,广泛应用于 Linux 系统。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6. BootLoader 与主机之间进行文件传输所用通信设备及协议 最常见的情况就是,目标机上的 Boot Loader 通过串口与主机之
间进行文件传输,传输协议通常是 xmodem/ymodem/zmodem 协议中
的一种。但是,串口传输的速度是有限的,因此通过以太网连接并借 助 TFTP 协议来下载文件是个更好的选择。
3.将 kernel 映像和根文件系统映像从 flash 上读 到 RAM 空间中。
4.为内核设置启动参数。 5.调用内核。
Boot Loader 的 stage1
1. 基本的硬件初始化
屏蔽所有的中断
– 为中断提供服务通常是 OS 设备驱动程序的责任,因此在 Boot Loader 的执行全过程中可以不必响应任何中断。中断屏蔽可以通 过写 CPU 的中断屏蔽寄存器或状态寄存器(比如 ARM 的 CPSR 寄 存器)来完成。
来实现,以达到短小精悍的目的。而 stage2 则通常用C 语言来实现,这样可以实现给复杂的功能(比如串口、以
太网接口的支持等) ,而且代码会具有更好的可读性和下步骤(以执行 的先后顺序): 1. 硬件设备初始化 2. 为加载 Bootloader 的 stage2 准备 RAM 空间
系统映像的固态存储设备的典型空间分配结构图。
3. 用来控制 Boot Loader 的设备或机制 主机和目标机之间一般通过串口建立连接,Boot Loader 软件在 执行时通常会通过串口来进行 I/O,比如:输出打印信息到串口,从 串口读取用户控制字符等。
4. Boot Loader 的启动过程是单阶段(Single Stage)还是多阶段 (Multi-Stage) 通常多阶段的 Boot Loader 能提供更为复杂的功能,以及更好的 可移植性。从固态存储设备上启动的 Boot Loader 大多都是 2 阶段
这段程序是用汇编语言编写的,其后就用C语言编写。
总体上Bootloader主要完成以下工作:
初始化CPU速度; 初始化内存,包括启用内存库,初始化内存配置寄存器等; 初始化中断控制器,在系统启动时,关闭中断,关闭看门狗; 初始化串行端口(如果在目标上有的话); 启用指令/数据高速缓存;
3.拷贝 stage2 到 RAM 中
拷贝时要确定两点:(1) stage2 的可执行映象在固态存储设备的存 放起始地址和终止地址;(2) RAM 空间的起始地址。 4. 设置堆栈指针 sp 堆栈指针的设置是为了执行 C 语言代码作好准备。通常我们可以把 sp 的值设置为(stage2_end-4),也即在 前面所安排的那个 1MB 的 RAM 空间的最顶端(堆栈向下生长)。 此外,在设置堆栈指针 sp 之前,也可以关闭 led 灯,以提示用户 我们准备跳转到 stage2。
经过上述这些执行步骤后,系统的物理内存布局应该如下图2所示。
5.跳转到 stage2 的 C 入口点 在上述一切就绪后,就可以跳转到 Boot Loader 的 stage2 去执行。
此外,在论及这个话题时,主机方所用的软件也要考虑。比如,在 通过以太网连接和 TFTP 协议来下载文件时,主机方必须有一个软件
用来的提供 TFTP 服务。
5.1.2 Bootloader主要完成的工作
Bootloader从第一条指令跳转后,就开始初始化各
种最重要的硬件,比如CPU的工作频率、定时器、中断、 看门狗、检测RAM大小和Flash等。一般,硬件初始化的
Boot Loader 读到系统的 RAM 中,然后将控制权交给 OS Boot Loader。 Boot Loader 的主要运行任务就是将内核映象从硬盘上读到 RAM 中,然 后跳转到内核的入口点去运行,也即开始启动操作系统。
而在嵌入式系统中,通常并没有像 BIOS 那样的固件程序(注:有 的嵌入式 CPU 也会内嵌一段短小的启动程序),因此整个系统的加载启 动任务就完全由 Boot Loader 来完成。比如在一个基于 ARM7TDMI core 的嵌入式系统中,系统在上电或复位时通常都从地址 0x00000000 处开 始执行,而在这个地址处安排的通常就是系统的 Boot Loader 程序。
5.1.3 Bootloader 的启动流程
由于 Boot Loader 的实现依赖于 CPU 的体系结构, 因此大多数 Boot Loader 都分为 stage1 和 stage2 两 大部分。依赖于 CPU 体系结构的代码,比如设备初始化
代码等,通常都放在 stage1 中,而且通常都用汇编语言
不可能的。尽管如此,仍然可以对 Boot Loader 归纳出一些通用的概
念来,以指导用户特定的 Boot Loader 设计与实现
1. Boot Loader 所支持的 CPU 和嵌入式板
每种不同的 CPU 体系结构都有不同的 Boot Loader。有些 Boot Loader 也支持多种体系结构的 CPU,比如 U-Boot 就同时支持 ARM 体系结构和MIPS 体系结构。除了依赖于 CPU 的体系结构外,Boot Loader 实际上也依赖于具体的嵌入式板级设备的配置。这也就是说, 对于两块不同的嵌入式板而言,即使它们是基于同一种 CPU 而构建 的,要想让运行在一块板子上的 Boot Loader 程序也能运行在另一 块板子上,通常也都需要修改 Boot Loader 的源程序。
式与下载工作模式的区别。
启动加载(Boot loading)模式: 这种模式也称为"自主"(Autonomous)模式。也即 Boot Loader 从目标机上的某个固态存储设备上将操作 系统加载到 RAM 中运行,整个过程并没有用户的介入。 这种模式是 Boot Loader 的正常工作模式,因此在嵌入 式产品发布的时侯,Boot Loader 显然必须工作在这种 模式下。
设置堆栈指针;
设置参数区域并构造参数结构和标记,即引导参数;
执行POST(上电自检)来标识存在的设备并报告有何问题; 为电源管理提供挂起/恢复支持; 传输操作系统内核镜像文件到目标机。也可以将操作系统 内核镜像文件事先存放在Flash中,这样就不需要 Bootloader和主机传输操作系统内核镜像文件,这通常是 在做成产品的情况下使用。而一般在开发过程中,为了调 试内核的方便,不将操作系统内核镜像文件固化在Flash中, 这就需要主机和目标机进行文件传输; 跳转到内核的开始,在此又分为ROM启动和RAM启动。所谓 ROM启动就是用XIP技术直接在Flash中执行操作系统镜像文 件;所谓RAM启动就是指把内核镜像从Flash复制到RAM中, 然后再将PC指针跳转到RAM中的操作系统启动地址。
引导加载程序是系统加电后运行的第一段软件代码。回忆一下 PC 的体系结构可以知道,PC 机中的引导加载程序由 BIOS(其本质就是一段 固件程序)和位于硬盘 MBR 中的 OS Boot Loader(比如LILO 和 GRUB
等)一起组成。BIOS 在完成硬件检测和资源分配后,将硬盘 MBR 中的
下载(Downloading)模式: 在这种模式下,目标机上的 Boot Loader 将通过串 口连接或网络连接等通信手段从主机(Host)下载文件, 比如:下载内核映像和根文件系统映像等。从主机下载的 文件通常首先被 Boot Loader 保存到目标机的 RAM 中, 然后再被 Boot Loader 写到目标机上的FLASH 类固态存 储设备中。 Boot Loader 的这种模式通常在第一次安装内核与根 文件系统时被使用;此外,以后的系统更新也会使用 Boot Loader 的这种工作模式。工作于这种模式下的 Boot Loader 通常都会向它的终端用户提供一个简单的命 令行接口。
2. Boot Loader 的安装媒介(Installation Medium)
系统加电或复位后,所有的 CPU 通常都从某个由 CPU 制造商预先安排的地 址上取指令。比如,基于 ARM7TDMI core 的 CPU 在复位时通常都从地址 0x00000000 取它的第一条指令。而基于 CPU 构建的嵌入式系统通常都有某种类 型的固态存储设备(比如:ROM、EEPROM 或 FLASH 等)被映射到这个预先安排的 地址上。因此在系统加电后,CPU 将首先执行 Boot Loader 程序。 下图1就是一个同时装有 Boot Loader、内核的启动参数、内核映像和根文件
3. 拷贝 Bootloader的 stage2 到 RAM 空间中
4. 设置好堆栈
5. 跳转到 stage2 的 C 入口点main()函数处
Boot Loader 的 stage2 通常包括以下步骤(以执行 的先后顺序): 1.初始化本阶段要使用到的硬件设备。 2.检测系统内存映射(memory map)。
5.1.1 Bootloader基本概念
简单地说,Boot Loader 就是在操作系统内核运行之前运行的一 段小程序。通过这段小程序,可以初始化硬件设备、建立内存空间的 映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终 调用操作系统内核准备好正确的环境。
通常,Boot Loader是严重地依赖于硬件而实现的,特别是在嵌入 式世界。因此,在嵌入式世界里建立一个通用的 Boot Loader 几乎是
嵌入式系统设计—基于ARM微处理器S3C2410A
第5章 Bootloader设计基础
5.1 引言
在专用的嵌入式板子运行 GNU/Linux 系统已经变得越来越流行。
一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次:
1. 引导加载程序--包括固化在固件(firmware)中的 boot 代码(可选),和 Boot Loader 两大部分。
具体的地址范围可以任意安排。为了后面的叙述方便,这里把所
安排的 RAM 空间范围的大小记为:stage2_size(字节),把起始地 址和终止地址分别记为:stage2_start 和 stage2_end(这两个地址