bootloader
第三节 Bootloader
第三节BootLoaderUn Re gi st er ed本节目标•深入理解BootLoader 启动过程•掌握uBoot 的定制•了解uBoot 的代码树构成•uBoot 的下载烧写Un Re gi st er edBootloader 定义•Bootloader 是硬件启动的引导程序,是启动操作系统的根本;•是在操作系统内核或用户应用程序运行之前运行的一段小程序。
通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用准备好环境;•在一般典型的系统中,整个系统的加载启动任务就完全由Bootloader 来完成。
Un Re gi st er edBootloader 特点•Bootloader 不属于操作系统内核,采用汇编语言编写,因此针对不同的CPU 体系结构,这一部分代码不具有可移植性;•在移植操作系统时,这部分代码必须加以改写。
•Bootloader 不但依赖于CPU 的体系结构,而且依赖于嵌入式系统板级设备的配置。
Un Re gi st er edBootloader 启动模式•启动加载模式:在这种模式下,Bootloader 从目标机上的某个固态存储设备上将操作系统加载到RAM 中运行,整个过程并没有用户的介入。
•下载模式:在这种模式下,目标机上的Bootloader 将通过串口或网络等通信手段从开发主机(Host )上下载内核映像和根文件系统映像等到RAM 中。
然后可以再被Bootloader 写到目标机上的固态存储媒质中,或者直接进行系统的引导。
Un Re gi st er edBootloader 基本功能•初始化硬件•将操作系统内核从Flash 拷贝到SDRAM 中,如果是压缩格式的内核,还要解压缩•改写系统的内存映射,原先Flash 起始地址映射为0地址,这时需要将RAM 的起始地址映射为0•提供Linux 内核的启动参数•启动Linux 内核•设置堆栈指针并将bss 段清零将来执行C 语言程序和调用子函数时要用到•改变pc 值,使得CPU 开始执行真正的操作系统内核。
bootloader结构
Bootloader结构
Bootloader的结构主要依赖于CPU的体系结构,因此大多数Bootloader都分为stage1和stage2两大部分。
依赖于CPU体系结构的代码,比如设备初始化代码等,通常都放在stage1中,而且通常都用汇编语言来实现,以达到短小精悍的目的。
而stage2则通常用C语言来实现,这样可以实现给复杂的功能,而且代码会具有更好的可读性和可移植性。
一般来说,stage1通常包括以下步骤(以执行的先后顺序):
1.硬件设备初始化。
2.为加载Bootloader的stage2准备RAM空间。
3.复制Bootloader的stage2代码到RAM空间中。
4.设置好栈(原因:为下一步准备的,因为C语言的运行需要堆栈)。
5.跳转到stage2的C入口点。
而stage2通常包括以下步骤(以执行的先后顺序):
1.初始化本阶段要使用到的硬件设备。
2.检测系统内存映射(memory map)。
3.为内核设置启动参数。
4.调用内核。
Bootloader过程简介
堆栈指针sp:stage_end-4
RAM地址空间
stage1为stage2可执行 映像准备的RAM地址范
围,大小:1MB
......
stage2_start
...
...(blank)
ramdisk
...(blank)
Flash地址空间
内核映像 ...(blank)
0x0001,0000(64KB)
11
下载模式应用场合:Bootloader的这种模式通常 在第一次安装内核与根文件系统时被使用;此外, 以后的系统更新也会使用到这种工作模式。
用户应用接口:工作于这种模式下的Bootloader 通常都会向它的终端用户提供一个简单的命令行接 口。 如在RedBoot下,将出现“RedBoot>”提示符; 在vivi Bootloader 下出现“vivi>”提示符。
stage2可执行映像可能 的最大大小:1MB
stage1可执行映像大 小:1MB
0x0000,0400(1KB) 0x0000,0000
Bootloader的 stage2可执行映像 刚被拷贝到RAM空 间时的系统内存布 局
18
2、第二阶段
阶段2通常用C语言来实现,以便实现更复杂 的功能,也使程序有更好的可读性和可移植性。 这个阶段的主要任务有5:
back
14
3.4 Bootloader启动过程
Bootloader的启动可以分为两个阶段
1、第一阶段
阶段1主要包含依赖于CPU体系结构及硬件设备的初始 化等。通常都用汇编语言来实现。这个阶段的任务有5:
(1)、基本的硬件设备初始化 这是 Bootloader 一开始就执行的操作,其目的是为阶 段2 的执行、以及随后kernel 的执行准备好一些基本的硬 件环境。
认识Bootloader
Boot Loader 软件在执行时通常会通过串口来进行 I/O,比如
输出打印信息到串口 从串口读取用户控制字符等。
最常用的串口通信软件
Linux:minicom Windows:附件中的超级终端
BootLoader的启动过程
Boot Loader的启动过程可以是 单阶段(Single Stage)
BootLoader的操作模式
大多数 Boot Loader 包含两种不同的操作模式 启动加载(Boot loading)模式 下载(Downloading)模式 这种区别仅对于开发人员才有意义,从最终用户的角度看,Boot Loader 的作用就是加载操作系统,并不存在上述两种模式的区别
启动加载模式
也称为自主(Autonomous)模式 Boot Loader从目标机上的某个固态存储设备上将操作系统加载
到 RAM 中运行,整个过程并没有用户的介入。 这种模式是 Boot Loader 的正常工作模式
在嵌入式产品发布时,Boot Loader必须工作在该模式下
下载模式
目标机的 Boot Loader通过串口或网络等通信手段从主机(Host)下载文件 比如内核映像和根文件系统映像 Hosttarget ram target FLASH 该模式的使用时机 通常在第一次安装内核与根文件系统时被使用 也用于此后的系统更新 工作于该模式下的 Boot Loader 通常都会向它的终端用户提供一个简单的命令 行接口
基于CPU 构建的嵌入式系统通常都有某种类型的固态存储设备被映射到这个预先安排的地址上。
比如:ROM、EEPROM 或 FLASH 等。
因此在系统加电后,CPU将首先执行Bootloader 程序。
bootloader压缩算法
一、引言bootloader是计算机系统中用于引导操作系统的程序,它负责将操作系统从存储设备中加载到计算机内存中并执行。
由于存储设备的容量有限,bootloader的体积通常也需要尽可能小,这就需要使用一种高效的压缩算法对bootloader进行压缩,以节省存储空间并提高启动速度。
本文将介绍bootloader压缩算法的原理、常用的压缩算法以及在实际应用中的优缺点。
二、bootloader压缩算法的原理1. bootloader的特点bootloader通常具有体积小、启动速度快的特点,因此对于其压缩算法的要求也较为特殊。
传统的通用压缩算法通常无法满足bootloader 的需求,因此需要专门针对bootloader设计压缩算法。
2. 压缩算法的选择在选择bootloader压缩算法时,需要考虑压缩速度、压缩比、解压速度和适应性等因素。
常用的bootloader压缩算法包括LZMA、LZO、LZ4等。
三、常用的bootloader压缩算法1. LZMALZMA是一种基于LZ77算法的压缩算法,它具有较高的压缩比和较小的解压时间。
但是,由于其压缩速度较慢,适用于对压缩比要求较高的bootloader。
2. LZOLZO是一种快速的压缩算法,它具有较快的压缩速度和解压速度,适用于对启动速度要求较高的bootloader。
3. LZ4LZ4是一种专门为快速解压而设计的压缩算法,它具有优秀的解压速度和适应性,适用于对启动速度和压缩比都有要求的bootloader。
四、bootloader压缩算法的优缺点1. LZMA的优缺点优点:较高的压缩比和较小的解压时间。
缺点:压缩速度较慢,适用于对压缩比要求较高的bootloader。
2. LZO的优缺点优点:较快的压缩速度和解压速度。
缺点:压缩比较低,适用于对启动速度要求较高的bootloader。
3. LZ4的优缺点优点:优秀的解压速度和适应性。
缺点:压缩比较低,适用于对启动速度和压缩比都有要求的bootloader。
bootloader概念和功能
bootloader概念和功能
引导加载程序(bootloader)是一段位于计算机系统上电时运行的固件,其目的是加载操作系统(OS)内核或其他引导程序。
它又被称为引导程序或引导管理器。
引导加载程序的主要功能包括:
1. 启动硬件初始化:引导加载程序会对计算机硬件进行初始化和配置,以便后续的操作系统和应用程序能够正确地运行。
2. 加载操作系统:引导加载程序会从存储设备(如硬盘、固态硬盘或网络)中读取操作系统的内核文件,并将其加载到计算机内存中。
3. 校验和验证:引导加载程序会对加载的操作系统内核文件进行校验,以确保文件的完整性和正确性。
这通常涉及到校验和、数字签名或哈希函数等技术。
4. 多重引导:引导加载程序通常可支持多个操作系统的引导,用户可以根据需要选择要启动的操作系统。
这在多系统或多操作系统共存的情况下非常重要。
5. 错误处理和故障恢复:引导加载程序还可以检测和处理系统启动过程中的错误和故障。
它能够提供一些故障恢复的选项,例如回滚操作系统更新、修复损坏的系统文件等。
总的来说,引导加载程序是计算机启动过程中重要的一环,它负责将计算机从电源关闭状态转换为正常工作状态,并加载操作系统以供用户使用。
它具有管理和控制系统启动过程的功能,确保系统的正确和稳定运行。
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 系统。
BootLoader 的概念与功能
U-Boot之一:BootLoader 的概念与功能一般情况下嵌入式Linux 系统中的软件主要分为以下几部分:1) 引导加载程序:其中包括内部ROM 中的固化启动代码和BootLoader 两部分。
内部固化ROM 是厂家在芯片生产时候固化的,作用基本上是引导BootLoader。
有的芯片比较复杂,比如Omap3 在flash 中没有代码的时候有许多启动方式:USB、UART 或以太网等等。
而S3C24x0 则很简单,只有Norboot 和Nandboot。
2) Linux kernel 和drivers。
3) 文件系统。
包括根文件系统和建立于Flash 内存设备之上的文件系统(EXT4、UBI、CRAMFS 等等)。
它是提供管理系统的各种配置文件以及系统执行用户应用程序的良好运行环境及载体。
4) 应用程序。
用户自定义的应用程序,存放于文件系统之中。
在Flash 存储器中,他们的分布一般如下:但是以上只是大部分情况下的分布,也有一些可能根文件系统是initramfs,被一起压缩到了内核映像里,或者没有Bootloader 参数区,等等。
1.2 在嵌入式Linux 中BootLoader 的必要性Linux 内核的启动除了内核映像必须在主存的适当位置,CPU 还必须具备一定的条件:但是在CPU 刚上电启动的时候,一般连内存控制器都没有初始化过,根本无法在主存中运行程序,更不可能处在Linux 内核启动环境中。
为了初始化CPU 及其他外设,使得Linux 内核可以在系统主存中运行,并让系统符合Linux 内核启动的必备条件,必须要有一个先于内核运行的程序,他就是所谓的引导加载程序(Boot Loader)。
而BootLoader 并不是Linux 才需要,而是几乎所有运行操作系统的设备都需要。
我们的PC 的BOIS 就是Boot Loader 的一部分(只是前期引导,后面一般还有外存中的各种BootLoader),对于Linux PC 来说,Boot Loader = BIOS + GRUB/LILO。
7第五章 bootloader
中国传媒大学 信息工程学院 2010学年秋季 苗方
Bootloader
Bootloader的概念
BootLoader就是在操作系统内核或用户应用程序运行 就是在操作系统内核或用户应用程序运行 之前运行的一段小程序。通过这段小程序, 之前运行的一段小程序。通过这段小程序,我们可以初 始化硬件设备、建立内存空间的映射图, 始化硬件设备、建立内存空间的映射图,从而将系统的 软硬件环境带到一个合适的状态, 软硬件环境带到一个合适的状态,以便为最终调用操作 系统内核或用户应用程序准备好正确的环境。 系统内核或用户应用程序准备好正确的环境。
Bootloader
Bootloader的任务(1)
初始化处理器以及外设的硬件资源配置, 初始化处理器以及外设的硬件资源配置,CPU片内和片 片内和片 外设备,例如正确配置SDRAM控制器 外设备,例如正确配置 控制器 芯片,可能有的设备: 初始化 I/O 芯片,可能有的设备: 串口,报告Bootloader成功 失败 成功/失败 串口,报告 成功 网络或其他接口, 网络或其他接口,准备引导操作系统 执行系统自检, 执行系统自检,报告检测结果 通过用户命令行提供特定应用程序
Bootloader
Bootloader的任务(2)
使用TFTP协议从网口接收 或者 协议从网口接收(或者 使用 协议从网口接收 或者xmodem协议从串口接 协议从串口接 操作系统镜像文件到RAM 收)操作系统镜像文件到 操作系统镜像文件到 将镜像烧写到flash中,重启后负责找到该镜像、解 将镜像烧写到 中 重启后负责找到该镜像、 压到RAM中,并跳转到解压位置处执行 压到 中 直接跳转到RAM处执行该镜像 直接跳转到 处执行该镜像
第六讲--Bootloader
嵌入式软件系统
1. 2. 3.
4.
嵌入式操作系统已经得到广泛应用 带操作系统的嵌入式软件体系一般分为: 引导加载程序 操作系统内核 文件系统(可选) 用户应用程序
PC 机的引导加载程序
1. 2.
BIOS+MBR BIOS的本质是一段固件程序(Firmware) MBR是磁盘上的一段分区,位于磁盘的第 一个扇区,大小为512B,包含了磁盘的分 区信息以及系统引导代码,比如Lilo、 Grub
Vivi代码结构
Arch:包含vivi支持的处 理器 Drivers:包含了MTD和串 口驱动程序 Init:包含main程序, stage2的入口点 Lib:与平台无关的公共 的代码,比如memory操 作、命令操作等 Include:所有头文件
目标板配置
处理器:samsung S3C2410X (ARM920T) 32M NandFlash, 用作Boot 64M SDRAM,地址 范围0x30000000— 0x33ffffff
U-boot简介
起源于PPC-BOOT 是一种通用的Bootloader 开源,高度模块化 驱动程序丰富、命令操作灵活
U-BOOT代码结构
Board:与目标板相关代码 Common:命令的实现代码 Cpu:与目标处理器相关代 码 Drivers:各种驱动程序 Fs:支持的文件系统 Lib_arm:ARM平台的公共 接口代码
4. 5.
一般的Bootloader的结构分成: 目标处理器相关代码,一般stage1的入口 代码在此目录中 目标板相关代码,一般stage2的入口代码 在此目录中 驱动代码,包括串口、网络、USB、以及 ROM操作驱动 命令处理代码 其他代码
bootloader通俗解释
bootloader通俗解释摘要:1.Bootloader的概念与作用2.Bootloader的种类与区别3.Bootloader的应用场景4.如何选择合适的Bootloader5.Bootloader的编写与定制6.Bootloader的安全性与优化7.总结与展望正文:一、Bootloader的概念与作用Bootloader,简称“boot loader”,中文意为“引导加载程序”,是计算机启动时加载操作系统之前执行的一段程序。
它的主要作用是在计算机加电后,将操作系统加载到内存中并启动操作系统。
二、Bootloader的种类与区别根据硬件平台和操作系统的不同,Bootloader有多种类型。
常见的有:1.BIOS Bootloader:适用于基于BIOS(Basic Input/Output System)的计算机,如传统的x86架构。
2.UEFI Bootloader:适用于基于UEFI(Unified Extensible Firmware Interface)的计算机,如现代的x86_64架构。
3.Linux Bootloader:主要用于加载Linux操作系统,如GRUB(GrandUnified Bootloader)。
4.Windows Bootloader:用于加载Windows操作系统,如NTLDR (Windows NT Loader)。
三、Bootloader的应用场景1.操作系统多重启动:允许用户在启动时选择不同的操作系统,如Windows和Linux。
2.操作系统修复:当操作系统无法正常启动时,通过Bootloader进入恢复模式,进行修复。
3.数据恢复:利用Bootloader启动特定的数据恢复工具,进行数据救援。
4.硬件测试:利用Bootloader启动硬件测试工具,如硬盘检测工具、内存检测工具等。
四、如何选择合适的Bootloader1.了解计算机硬件平台和操作系统:根据计算机使用的硬件架构和操作系统,选择相应的Bootloader。
bootload标准
bootload标准摘要:1.引导加载程序(Bootloader)简介2.Bootloader 的作用3.Bootloader 的两种类型:启动扇区和启动管理器4.常见的Bootloader 标准5.UEFI 标准简介6.UEFI 与传统Bootloader 的比较7.UEFI 的发展趋势和影响正文:引导加载程序(Bootloader)是计算机系统启动过程中的关键组件,负责将操作系统内核从存储介质加载到内存中并启动执行。
Bootloader 的主要作用是在计算机加电后初始化硬件,找到并加载操作系统的内核,从而使计算机能够正常运行。
Bootloader 分为两种类型:启动扇区和启动管理器。
启动扇区是计算机加电后BIOS 读取的第一个扇区,通常位于硬盘的0 磁道1 柱面1 扇区(也称为MBR,Master Boot Record),它包含一个引导程序,用于加载操作系统的内核。
而启动管理器则是在操作系统启动后,负责管理系统启动过程的程序。
在计算机发展过程中,出现了许多不同的Bootloader 标准。
早期常见的标准有:DOS 的IBM BIOS、微软的MS-DOS、GRUB(GRand UnifiedBootloader)等。
随着计算机技术的发展,UEFI(统一可扩展固件接口)标准逐渐成为主流。
UEFI 是一种基于x86 架构的Bootloader 标准,相较于传统的Bootloader,UEFI 具有更快的启动速度、更好的兼容性和更强的安全性。
UEFI 支持在计算机启动过程中直接访问网络,从而实现快速启动和网络唤醒等功能。
此外,UEFI 还支持启动多个操作系统,用户可以根据需要在UEFI 设置中选择要启动的操作系统。
UEFI 的出现对计算机产业产生了深远的影响。
随着UEFI 的普及,传统的Bootloader 逐渐被取代,计算机启动过程变得更加高效、安全和灵活。
此外,UEFI 也为计算机硬件和软件厂商提供了更大的创新空间,使得计算机技术得以不断进步。
第七章 BootLoader实例剖析
第七章BootLoader实例剖析7.1 BootLoader概述BootLoader:引导加载程序,就是在操作系统内核运行之前运行的一段小程序。
通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
BootLoader包括固化在固件(firmware)中的boot 代码(可选)和外部的BootLoader 两大部分。
大多数BootLoader 都包含两种不同的操作模式:"启动加载"模式和"下载"模式,这种区别仅对于开发人员才有意义。
但从最终用户的角度看,Boot Loader 的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。
启动加载(Boot loading)模式:这种模式也称为"自主"(Autonomous)模式。
也即Boot Loader 从目标机上的某个固态存储设备上将操作系统加载到RAM 中运行,整个过程并没有用户的介入。
这种模式是Boot Loader 的正常工作模式,因此在嵌入式产品发布的时侯,Boot Loader 显然必须工作在这种模式下。
下载(Downloading)模式:在这种模式下,目标机上的BootLoader 将通过串口连接或网络连接等通信手段从主机(Host)下载文件,比如:下载内核映像和根文件系统映像等。
从主机下载的文件通常首先被BootLoader 保存到目标机的RAM 中,然后再被Boot Loader 写到目标机上的FLASH 类固态存储设备中。
BootLoader 的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用BootLoader 的这种工作模式。
工作于这种模式下的Boot Loader 通常都会向它的终端用户提供一个简单的命令行接口。
7.2 ARM7教学平台BIOS剖析7.2.1 简介ARM7教学平台BIOS就是FS44B0Xbios--BIOS FOR FS44B0X,是优龙公司专门为FS44B0X开发板提供的。
bootloader
U-boot启动流程
• 链接脚本
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") OUTPUT_ARCH(arm) ENTRY(_start) SECTIONS { . = 0x00000000; . = ALIGN(4); .text : { cpu/arm920t/start.o (.text) __arm1_init_start = .; board/mindspeed/common/arm1_init.o (.text) __arm1_init_end = .; *(.text) }
U-Boot命令
• 这样每一个U-Boot命令有一个结构体来描述。结构体包含 的成员变量:命令名称、最大参数个数、重复数、命令执 行函数、用法、帮助。 • 从控制台输入的命令是由common/command.c中的程序 解释执行的。find_cmd()负责匹配输入的命令,从列表中 找出对应的命令结构体。 • 在u-boot中输入命令不一定输入全部命令名称,而是可以 省略后面的一些字符,例如“help”命令可以输入he。
环境变量
关于以上结构的说明: crc是u-boot在保存env 的时候加上去的校验头,在第一次启 动时一般 crc校验会出错,这很正常,因为这时 Flash中 的数据无效。 data data字段保存实际的环境变量。u-boot 的 env 按 u-boot name=value”\0”的方式存储,在所有env的最后以”\0\0” 表示整个 env 的结束。新的name=value对总是被添加到 env 数据块的末尾,当删除一个name=value对时,后面 的环境变量将前移,对一个已经存在的环境变量的修改实 际上先删除再插入。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Boot Loader的启动流程和开发经验总结Windows CE最大程度继承了桌面版Windows的丰富功能,但是Windows CE并不是一个通用的安装版操作系统。
在形形色色的嵌入式设备世界里,一款CE系统通常只会针对某一种硬件平台生成。
一般来说,Windows CE的开发过程可以分为:0AL(OEM Abstraction Layer)、驱动、应用程序开发三个步骤。
其中,0AL开发最基本的一步是板级支持包(BSP),而BootLoader设计则在BSP开发中具有极为关键的地位。
1.什么是BootLoader嵌入式系统的启动代码一般由两部分构成:引导代码和操作系统执行环境的初始化代码。
其中引导代码一般也由两部分构成:第一部分是板级、片级初始化代码,主要功能是通过设置寄存器初始化硬件的工作方式,如设置时钟、中断控制寄存器等,完成内存映射、初始化MMU等。
第二部分是装载程序,将操作系统和应用程序的映像从只读存储器装载或者拷贝到系统的RAM中并执行。
(1)什么是板级BSP?BSP(Board Support Package)是板级支持包,是介于主板硬件和操作系统之间的一层,主要是为了支持操作系统,使之能够更好的运行于硬件主板。
不同的操作系统对应于不同形式的BSP,例如WinCE的BSP和Linux的BSP相对于某CPU来说尽管实现的功能一样,可是写法和接口定义是完全不同的。
所以,BSP一定要按照该系统BSP的定义形式来写,这样才能与上层OS保持正确的接口,良好的支持上层OS。
(2)什么是Boot Loader在BSP中有一个重要的组成部分就是BootLoader,它是在操作系统内核运行之前运行的一段小程序。
通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,为调用操作系统内核准备好环境。
一般来说,在嵌入式世界里BootLoader 是严重地依赖于硬件的,因此想建立一个通用的 BootLoader 几乎是不可能的。
不同的 CPU 体系结构有不同的BootLoader,而且除了依赖于 CPU的体系结构外,BootLoader还依赖于具体的嵌入式板级设备的配置。
这也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种 CPU 结构而构建的,要想让运行在一块板子上的 BootLoader 程序也能运行在另一块板子上,通常也都需要修改BootLoader 的源程序。
2.BootLoader在PC机与嵌入式的区别比较(1)引导程序在PC机和嵌入式上的区别一般来说,在PC的硬件平台上,由于硬件启动根本就不是通过BootLoader(而是通过BIOS),所以BootLoader就不需要对CPU加电后的初始化做任何工作。
在桌面系统中,有以下几种设备可以作为启动设备使用:硬盘、USB盘、光盘驱动器、还有网卡的Boot ROM 等。
但无论选择了哪一种启动设备,操作系统都会去将该设备起始地址的内容读入内存,BIOS 将控制移交给引导装载程序。
如果启动设备是IDE硬盘,这时通常将引导装载程序装入第一个扇区(通常被称做主引导扇区,MBR),然后将内容读入内存再运行。
在嵌入式平台上,引导装载程序是在硬件上执行的第一段代码,通常将引导程序放置在不易丢失的存储器的开始地址或者是系统冷启动时PC寄存器的初始值。
在嵌入式系统中,通常并没有像BIOS那样的固件程序,因此整个系统的加载启动任务就完全由BootLoader来完成,引导程序完成自己的任务后,也将控制权移交给操作系统。
因此,BootLoader是最先被执行的程序,所以就必须包括加电初始化程序。
(2)BSP在嵌入式和桌面Windows中的区别其实运行在PC机上的桌面Windows或Linux系统也是有BSP的,只是PC机均采用统一的X86体系架构,这样操作系统的BSP相对X86架构是单一确定的,不需要做任何修改就可以很容易支持OS在X86上正常运行,所以在PC机上谈论BSP这个概念也就没什么意义了。
而对嵌入式系统来说情况则完全不同,目前市场上有多种结构的嵌入式CPU(如X86,ARM,MIPS等),而且为了性能的需要,外围设备也会有不同的选择和定义。
因此,一个嵌入式操作系统针对不同的CPU会有不同的BSP,又即使同一种CPU,由于外设的差别其BSP 也会不一样。
所以根据硬件设计编写和修改BSP,是保证嵌入式系统正常运行的一个重要环节。
(3)嵌入式BSP与PC机主板BIOS的区别PC机主板上的BIOS首先是负责在电脑开启时检测、初始化系统设备、装入操作系统并调度操作系统向硬件发出的指令。
它的Firmware代码是在芯片生产过程中固化的,一般来说用户是无法修改。
然后,为下载运行操作系统做准备,把操作系统由硬盘加载到内存,并传递一些硬件接口设置给系统。
在OS正常运行后,BIOS的作用基本上也就完成了,这就是为什么更改BIOS一定要重新关机开机。
从这个角度来说,PC机BIOS的作用就象嵌入式系统中的Bootloader,都是最底层的引导软件,初始化主板的基本设置,为接收外部程序做硬件上的准备。
但与Bootloader不同的是,BIOS在装载OS系统的同时还传递一些参数设置,而Bootloader只是简单的装载系统。
尽管BSP的开始部分和BIOS所做的工作类似,可是大部分又和BIOS不同,作用也完全不同。
因为BSP还包含和系统有关的基本驱动,程序员可以编程修改BSP,在BSP中任意添加一些和系统无关的驱动或程序,甚至可以把上层开发的统统放到BSP中。
而BIOS程序是用户不能更改和编译编程的,只能对参数进行修改设置,当然更不会包含一些基本的硬件驱动。
3.Boot Loader的启动流程大多数 BootLoader 都包含两种不同的操作模式:启动加载模式和下载模式。
启动加载模式也称为自主模式,即 BootLoader 从目标机上的某个固态存储设备上将操作系统加载到RAM 中运行,整个过程并没有用户的介入。
而下载模式则是目标机上的 BootLoader 将通过串口连接或网络连接等通信手段从主机(Host)下载文件。
从主机下载的文件通常首先被Boot Loader 保存到目标机的 RAM 中,然后再被 BootLoader 写到目标机上的FLASH 类固态存储设备中。
这种模式通常在第一次安装内核与根文件系统时被使用,或系统更新时使用。
一般嵌入式系统的Boot Loader较为常用的是启动加载模式,它的加载流程也是我们要重点讨论的内容。
(1)启动部分启动部分主要是实现初始化硬件的功能。
在参考板的BootLoader目录下,会发现一些.s 文件,可能会是init.s或者是reset.s等,这样的文件是CPU加电后最先执行的代码。
接着Oal.exe通过Startup函数完成硬件的初始化,StartUp 函数是Boot Loader的入口函数。
该函数一般是使用汇编语言编写,与CPU关系非常紧密,能完成初始化CPU、内存等核心硬件。
Startup.s代码与硬件平台的Bootloader启动代码共用。
如果是热启动,即在该函数调用之前已经启动了Bootloader程序,相当基本硬件初始化已经完成,则直接跳转到OALStartUp函数中;否则需要进行硬件中断屏蔽、内存、系统时钟频率、电源管理等硬件的基本初始化过程。
在系统硬件初始化完毕之后,Startup调用OALStartUp函数,OALStartUp 函数主要完成将OEMAddressTable表传递给内核,然后调用KernelStart函数跳转到内核。
因此,这部分工作是BootLoader的一大重点。
(2)主控部分StartUp 函数初始化CPU等核心硬件并跳转到Main函数后,系统就会转入C语言代码执行环境。
这时函数分为3个模块:BLCOMMON、Download Function、FLASH Function。
其中BLCOMMON 模块是由微软提供的,执行一些逻辑上的功能,因此建议开发人员不要对其进行修改。
而Download Function、FLASH Function中的函数与硬件平台息息相关,因此对于每种硬件平台都要将函数的实现进行修改。
其中,BLCOMMON库是与BootLoader程序链接在一起的,BLCOMMON库的入口点为BootloaderMain函数,它是Startup汇编函数完成后跳转至该入口的。
Main函数的主要任务时调用BLCommon中的 BootloaderMain()函数,这是BootLoader的主控函数,它控制了BootLoader的完整执行流程。
这部分代码由C语言实现,是BLCOMMON代码的一部分,它可以用来执行比较复杂的操作。
比如检测内存和Flash的有效性、检测外部设备接口、检测串口并且向已经连接的主机发送调试信息、通过串口等待命令、启动网络接口、建立内存映射等汇编无法完成的工作。
(3)下载部分一般在平台调试完毕后,可以在不用人工干预的情况下自动加载CE,这也是BootLoader 的功能之一。
而在调试阶段时,这需要通过Loader所支持的命令来进行操作的,借助于这些命令不仅可以完成硬件平台的部分测试,还能完成CE的BootLoader程序最为重要的一个功能--下载CE映像。
如果说硬件调试功能可以由其它的程序代替而不放入BootLoader中,但是下载映像文件却是BootLoader必需的功能。
CE映像文件通常叫做nk.bin,它是Windows CE二进制数据格式文件,不仅包含了有效的程序代码,还有按照一定规则加入的控制信息。
当然,也可以选择生成.sre格式的代码文件,但是相于对前一种格式,它的代码要长很多,所需要的下载时间也更长。
(4)支持DOC部份对于WinCE操作系统而言,丰富的多媒体功能是其一大特点。
但是随之而来的问题是,如果选择了图形界面和中文支持,系统很容易大大超出嵌入式系统上百KB的数量级。
而DOC(Disk On Chip)则提供了一种相对廉价的大存储容量的解决方案。
DOC本质上是一种加以软件控制的NAND格式的Flash,通过TFFS这一软件层提供对WinCE 的支持。
由于DOC不能像内存一样被直接访问,所以其加载WinCE的过程有些特殊,必须要在BootLoader中加入专门的代码,才能使用DOC来存放WinCE映像文件。
4.Boot Loader的开发经验总结(1)嵌入式系统中,Bootloader的意义与作用与PC上的BIOS有点类似,它对开发板上的主要部件如CPU、SDRAM、FLASH、串口等进行了初始化,也可以使用Bootloader下载文件到开发板和启动系统等。
因此,一个功能比较强大的Bootloader已经相当于一个微型的操作系统了。