文档库 最新最全的文档下载
当前位置:文档库 › 嵌入式Bootloader机制的分析与移植_王亚刚

嵌入式Bootloader机制的分析与移植_王亚刚

嵌入式Bootloader机制的分析与移植_王亚刚
嵌入式Bootloader机制的分析与移植_王亚刚

—267—

嵌入式Bootloader 机制的分析与移植

王亚刚

(西安邮电学院计算机科学与技术系,西安 710121)

摘 要:由于嵌入式系统的专用性和多样性,嵌入式启动引导程序(Bootloader)的移植工作繁琐复杂。为了减少Bootloader 移植工作的盲目性,加速产品进入市场的时间,以U-Boot-1.1.1为例,对嵌入式Bootloader 进行分析,结合HHPPC852T 嵌入式开发板的具体情况,提出在嵌入式系统上移植Bootloader 的一般方法,该方法简单可行。 关键词:嵌入式系统;启动引导程序;移植

Analysis and Transplant of Embedded Bootloader Mechanism

WANG Ya-gang

(Department of Computer Science and Technology, Xi’an Institute of Post and Telecommunications, Xi’an 710121)

【Abstract 】Due to the specialty and diversity of the embedded systems, much tedious transplant work must be done when embedded Linux is deployed on the target embedded system. In order to overcome the blindness of transplant work and speed up the entry markets time of the embedded products, a brief introduction to the embedded system Bootloader(U-Boot as an example) is given, with emphasis on its basic structure and mechanism. Based on the implementation of transplanting U-Boot to HHPPC852T target, a typical method for transplanting Bootloader to a new target is presented, which is simple and practicable. 【Key words 】embedded system; Bootloader; transplant

计 算 机 工 程 Computer Engineering 第36卷 第6期

Vol.36 No.6 2010年3月

March 2010

·开发研究与设计技术· 文章编号:1000—3428(2010)06—0267—03

文献标识码:A

中图分类号:TP274

1 概述

Bootloader 是嵌入式系统在引导操作系统内核或用户应用程序之前运行的一段程序,其主要功能是完成处理器和周边电路正常运行所需要的初始化工作,建立内存空间的映射(包括设置系统堆栈和系统启动参数区等),从而将系统的软硬件环境带到一个合适的状态,并从ROM, Flash 等非易失存储器上,或者从网络上加载操作系统映像文件(或者用户的应用程序映像),以便最终引导操作系统或执行用户应用程序。

然而对于嵌入式系统来说,由于其固有的专用性和多样性,通常都缺少一个类似于PC 机上BIOS 的通用底层软件支持,因此,嵌入式系统上的Bootloader 的功能要求更加多样化,不仅包括从存储介质中读取操作系统并加以执行,还必须负责最初的硬件初始化和一些硬件的检测功能(即PC 机上BIOS 所完成的部分功能)。

通常,Bootloader 是高度依赖于CPU 体系结构等硬件环境而设计和实现的。另外,除了依赖于CPU 的体系结构外,Bootloader 的实现也依赖于具体的嵌入式板卡设备的配置,比如板卡的硬件地址分配情况、RAM 芯片的类型及其大小、Flash 芯片的类型以及与其片选(Chip Select, CS)的设置等。

2 Bootloader 的一般结构

为了满足Bootloader 的专有性和灵活性需要,大多数Bootloader 的代码都由2个阶段完成,即stage1和stage2[1]。其中,依赖于CPU 体系结构的代码,例如CPU 及存储管理部件初始化代码等,通常都放在stage1中,并用汇编语言来实现,以达到短小精悍的目的;stage2则通常用C 语言等高级语言来实现,这样可以实现比较复杂的功能,并且使程序具有更好的可读性和可移植性。

Bootloader 的stage1通常包括硬件设备初始化,例如配

置处理器中的关键寄存器和一些必要的硬件参数,为加载Bootloader 的stage2代码准备RAM 空间,拷贝Bootloader 的stage2的代码到RAM 空间中,设置好堆栈并跳转到stage2的C 程序入口点。

Bootloader 的stage2通常包括以下步骤:初始化本阶段要使用到的硬件设备,检测系统内存映射(memory mapping),将操作系统映像文件从Flash 等非易失性存储器或者网络文件系统加载到RAM 空间中,为操作系统设置启动参数,跳转到操作系统入口执行。

3 U-Boot 分析

3.1 U-Boot 简介

U-Boot(Universal Bootloader)是遵循GNU GPL 条款而开发的开放源代码项目,是从8xxrom, PPCBoot 等Bootloader 逐步发展演化而来,其源代码目录、编译形式与Linux 内核非常相似[2]。U-Boot 中Universal 具有2层含义:(1)U-Boot 支持Linux, NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS 等嵌入式操作系统;(2)U-Boot 支持PowerPC, MIPS, x86, ARM, XScale 等诸多常见的处理器系列。这2个特点正是U-Boot 项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。U-Boot 源码开放,支持多种嵌入式操作系统,支持多个处理器系列,具有较高的可靠性和稳定性,同时可以进行灵活的功能设置,便于进行调试和产品发布等。另外U-Boot 源码中有丰富的设备驱动程序源码,如串口、以太网、SDRAM 、Flash 、LCD 、NVRAM 、EEPROM 、RTC 、

基金项目:陕西省科技创新专项基金资助重大项目(2008ZKC02-11) 作者简介:王亚刚(1972-),男,讲师、博士研究生,主研方向:嵌入式系统,SoC 设计

收稿日期:2009-11-10 E-mail :wangyg@https://www.wendangku.net/doc/ef14526938.html,

—268

— 键盘等,同时也提供丰富的开发调试文档与强大的网络技术支持。正是基于以上特点,目前U-Boot 已被广泛地应用到嵌入式系统产品开发之中。

3.2 U-Boot 源码结构

U-Boot 的源码结构与Linux 内核源码的组织方式比较类似,主要包括以下主要目录:(1)board :目标板相关文件,主要包含SDRAM, Flash 驱动等。(2)common :独立于处理器体系结构的通用代码,如内存大小探测等,另外U-Boot Monitor 中的交互命令一般也在这里定义。(3)cpu :处理器体系结构相关的实现部分,主要包括CPU 的初始化、中断初始化及与处理器相关的硬件驱动等,如mpc8xx 子目录下包括串口、SCC 、FEC 、I2C 及LCD 等驱动程序及等文件。(4)driver :通用设备驱动,如CFI, Flash 驱动。(5)include :U-Boot 源代码头文件,其中的configs 子目录下包含了许多U-Boot 支持的标准板的硬件配置选项,这些头文件在移植过程中经常需要修改。(6)lib_xxx :处理器体系相关的通用程序的实现部分,例如lib_ppc 及lib_arm 目录分别包含了与PowerPC, ARM 体系结构相关的通用程序的实现。(7)net :与网络功能相关的文件目录,如bootp, nfs, tftp 。(8)tools :用于创建U-Boot S-RECORD 和BIN 镜像文件的工具。

3.3 U-Boot 工作过程分析

以U-Boot-1.1.1为对象,分析U-Boot 引导HHPPC852T 标准板的过程。根据U-Boot 运行的环境,U-Boot 的启动过程大致可以分成2个部分:在Flash 中运行的阶段与在RAM 中运行的阶段。cpu/mpc8xx/start.S 是U-Boot 启动的起点,用PowerPC 汇编语言编写,入口为_start 。

第1阶段:U-Boot 在Flash 中运行。这一阶段主要完成CPU 寄存器的设置及板卡的部分硬件初始化,包括获取CPU 和总线时钟、波特率发生器的初始化、串口及终端的初始化、CPU 的检测、板卡的检测、DRAM 的检测等,最后U-Boot 调用relocate_code 把自己的运行代码从Flash 搬运到RAM 中,并跳转到in_ram 处继续执行U-Boot 第2阶段的代码。

第2阶段:U-Boot 在RAM 中运行。这一阶段U-Boot 运行在RAM 中,主要进行进一步的初始化和设置,包括重新定位交互命令的地址、trap 的初始化、Flash 初始化;初始化malloc 内存区域;重定位环境函数指针;设置Ethernet 的MAC 地址;设备初始化;应用程序跳转表;初始化终端;初始化中断;设置时钟;Ethernet 初始化等。最后U-Boot 调用函数main_loop()自动加载操作系统或者进入用户交互环境。

U-Boot-1.1.1中主要函数之间的调用关系如图1所示。

图1 U-Boot 主要函数调用关系

4 U-Boot 的移植

尽管U-Boot 本身支持众多的CPU 体系结构及操作系统,但由于嵌入式系统硬件设计千差万别,因此要在特定的目标板上正确地运行U-Boot 还需要做适当的移植修改工作。一般来说,系统差异可能存在于以下几个方面:用户定制的硬件设计与U-Boot 所支持的硬件不相同或者有差异;用户使用的Flash 类型还未被U-Boot 所支持;用户需要增加新的硬件调试功能;用户需要用U-Boot 直接引导自定义的应用程序。 4.1 移植方法与移植环境

当前,对于U-Boot 的移植方法,大致分为2种[3]。一种是用BDI2000等在线调试器(On-Chip Debugger)创建目标板初始运行环境,将U-Boot 映像文件u-boot.bin(RAM 版本)下载到目标板RAM 中的指定位置,然后使用调试器进行跟踪调试。其优点是无需每次都将U-Boot 镜像文件烧写到Flash 中,可以减少Flash 的擦写次数,延长Flash 芯片的使用寿命,但是由于被调试的U-Boot 映像文件是从RAM 中开始运行的,和U-Boot 从Flash 中启动的实际过程不一致,因此调试的结果和实际运行的情况有一定差别。另外一种被广泛采用的方法是先用BDI2000等调试器将U-Boot 映像文件烧写到Flash 中去,然后从Flash 中开始运行,并使用BDI2000或BDM 调试器进行跟踪调试。这种方法所用调试器的配置文件较为简单,调试过程与U-Boot 移植后运行过程相吻合,即U-Boot 先从Flash 中运行,然后把自身重新搬动至RAM 中的新位置,并从那里正式投入运行。此方法唯一的缺点就是需要不断地擦写Flash 芯片,影响Flash 的使用寿命。但考虑到Flash 常规擦写次数基本为10万次左右,作为U-Boot 移植,不会使用太多的次数,所以可以忽略这个因素。

在进行U-Boot-1.1.1移植的过程中,使用的移植环境如图2所示。其中,开发主机上安装Redhat Linux 9.0操作系统及移植U-Boot 所需要的交叉开发环境ELDK3.0。为了给目标板提供U-Boot 映像的网络下载,可以在开发主机上开启TFTP 服务。同时开发主机上运行NFS 服务器及DHCP 服务器程序,可为开发板的运行系统提供NFS 文件系统及DHCP 服务。串行终端作为移植及调试过程中目标板系统信息输出的主要途径,可以使用Windows 中的HyperTerm 或者Linux 下的minicom 等终端程序。连接开发主机和目标板的BDM 调试接口是系统调试的主要途径。

图2 移植环境

4.2 移植的一般过程

对于U-Boot 的移植,一般包括以下几个步骤:获得最新发布的U-Boot 源码版本;建立GNU 交叉开发环境;根据移

植目标板的硬件配置确定U-Boot 移植时的参考板类型;

根据移植目标板的硬件配置对U-Boot 源代码进行修改,并重新编译;在目标板与开发主机间接入硬件调试器进行调试。

其中,移植参考板的类型选择尤为重要,这是进行U-Boot 移植首先要明确的一个关键问题。一般情况下为特定的开发板移植U-Boot 并不需要从头开始,因为在U-Boot 已

经支持的众多的开发板中,总会有一些标准板与用户的开发板配置比较相似,通过参考这些已有开发板的程序和配置文件,用户可以大大减少移植的工作量。因此,必须根据目标板上CPU的体系结构、Flash、SDRAM等存储器的硬件配置等情况,以尽可能相一致为原则,找出一个与移植目标板相同或相近的、U-Boot所支持的标准板的类型作为移植的参考板。

结合本文所介绍的U-Boot移植,移植时参考板的选择可以基于以下步骤:

(1)明确目标板硬件的配置。对于采用Motorola处理器的嵌入式目标板来说,几乎每种目标板都有其独特的设计,包括处理器类型、内存地址映射等。例如,处理器可以选择MPC860, MPC866或者MPC852T等;有些目标板使用SMC1作为串行口,有些则使用SMC2作为串行口,有些板卡使用SCC3作为以太网接口,有些则使用SCC4等。因此,作为移植的依据,在把U-Boot移植到目标板的过程中,必须了解目标板的一些基本硬件配置,主要包括CPU型号、频率等;Flash, SDRAM等存储器的型号、容量、数量以及片选等;串口通道选择及波特率、以太网控制器及端口选择、FEC控制器及端口选择等。

表1描述了与U-Boot移植密切相关的目标板HHPPC852T的硬件配置信息。如果对开发板的硬件配置不清楚,那么移植的工作将会非常困难,因此,需要与硬件工程师密切配合并寻求帮助。

表1 目标板硬件配置

硬件配置信息

CPU 型号MPC852TZT100,晶振频率10 MHz,CPU频率100 MHz,倍频数10,IMMR地址0xFFF00000,串行口SMC1,串行口波特率115 200 Baud/s,10 M Ethernet SCC4,100 M Ethernet FEC

SDRAM 型号Hynix HY57V641620HG T-6,容量16 MB,起始地址0x00000000,片选CS2

Flash 型号AMD AM29LV-160DB-90EC,数据宽度16,单片容量1 M×16 bit,单片扇区数35,Flash数量2片, Bank 1:起始地址0x40000000 片选CS0,Bank 2:起始地址0x40200000 片选CS1

(2)根据移植目标板的硬件配置,确定移植参考板的类型。本文在进行U-Boot移植时选取参考板的类型为TQM866M,主要基于以下原因:

1)U-Boot不支持HHPPC852T标准开发板;

2)U-Boot支持TQM866M标准开发板。

Motorola处理器MPC866P, MPC866T, MPC859P, MPC859T, MPC859DSL, MPC853T, MPC852T在体系结构上是一致的。另外,MPC866及MPC852T等这些处理器都采用全新的、与MPC860等处理器不同的锁相环(PLL)设计,因此,MPC866处理器的大部分初始化代码可以直接应用到MPC852处理器上。

HHPPC852T开发板的硬件设计与TQM866M标准板有很多相似的地方,主要包括硬件复位向量、存储器(包括Flash 和RAM)地址分配、存储器片选设置以及CPM通信通道的分配等。

5 结束语

通过本文的分析和实践,已经能够成功地将U-Boot移植到MPC852T目标板上了,为基于平台的U-Boot移植提供了一个成功范例,同时也为移植U-Boot到其他目标板积累了丰富的实践经验。尽管U-Boot移植的具体过程千差万别,但是总体上来说,必须围绕以下几个要点,包括:U-Boot移植参考板;CPU寄存器参数设置;串口调试;与Flash相关的寄存器BRx, ORx的参数设置;SDRAM的驱动等。应尽量参考已经可以在目标板上成功运行的Bootloader,从中可以获得很多有价值的资料,从而降低移植难度,缩短移植调试的时间。另外,在移植过程中,必须通过各种渠道获取帮助[4]。

如果在自主设计的目标板上移植U-Boot,那么除了考虑上述软件因素以外,还需要借助硬件测试工具排查目标板硬件可能存在的问题,如原理设计、PCB布线、元件好坏等。因此,在移植过程中,需要对移植的问题进行综合考虑,积极与硬件工程师配合,敏锐地区分硬件问题和软件问题。

参考文献

[1] 詹荣开. 嵌入式Bootloader技术内幕[EB/OL]. (2003-12-22).

https://www.wendangku.net/doc/ef14526938.html,/developerWorks/cn/linux/l-btloader/index.

html.

[2] 李毅, 李连云, 张伟宏, 等. Bootloader面向不同结构Flash的

实现[J]. 计算机工程, 2008, 34(4): 82-83.

[3] 宋国军, 张侃谕, 林学龙. 嵌入式系统中U-Boot基本特点及其

移植方法[J]. 单片机与嵌入式系统应用, 2004, (10): 78-81.

[4] Denk W. The DENX U-Boot and Linux Guide(DULG) for

TQM8xxL[EB/OL]. (2004-11-18). http://www.denx.de/wiki/bin/ view/DULG/Manual.

编辑 顾逸斐

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (上接第266页)

参考文献

[1] Bao Tie, Liu Shufen. A Method for Network Data Collection and

Processing in the Pervasive Computing Environment[C]//Proc. of International Symposium on Pervasive Computing and Applications.

[S. l.]: IEEE Press, 2006: 599-603.

[2] Kim Do-Hyeon, Kang Kyung-Woo. Design and Implementation of

Integrated Information System for Monitoring Resources in Grid Computing[C]//Proc. of the 10th International Conference on Computer Supported Cooperative Work in Design. Nanjing, China: IEEE Press, 2006. [3] 张淑英, 刘淑芬, 包铁. 一种基于机群的分布式数据采集系

统[J]. 计算机工程, 2006, 32(14): 46-48.

[4] Song Hengjie, Shen Zhiqi, Miao Chuyan. The Multi-Agent Data

Collection in HLA-based Simulation System[C]//Proc. of the 21st

International Workshop on Principles of Advanced and Distributed

Simulation. San Diego, California, USA: IEEE Computer Society, 2007.

[5] 缪嘉嘉, 邓苏, 刘青宝. ETL综述[J]. 计算机工程, 2004, 30(3):

4-5.

编辑张正兴

—269—

阐述对BootLoader的理解和分析

` 物理与电子工程学院 《嵌入式系统设计》 设计性实验报告 题目阐述对BootLoader的理解和分析 系别 年级专业 班级学号 学生姓名 指导教师 实验时间

目录 课题要求 ................................................................ 错误!未定义书签。 1.本课题的目的.............................. 错误!未定义书签。 2.运行环境.................................. 错误!未定义书签。正文 . (2) 一.BootLoad简介 (2) 二.系统设计 (5) 三.技术实现问题 (7) 四.总结与体会 (8) 设计性实验报告成绩:指导教师签名: (10)

摘要 在嵌入式系统中,由于不具有自举开发的能力,其BootLoader除了引导操作系统之外,还要担负辅助开发的责任,如与主机通信、与用户交互、更新系统等功能。 虽然嵌入式系统不可能实现通用的BootLoader,但是各系统的BootLoader依然具有一定的相同性,因此,嵌入式系统中常用的BootLoader也都具有可移植性,可以在大部分代码不更改的情况下,根据本系统的情况,通过修改具体硬件相关的代码并进行相应的配置来使用。 关键字:概述,作用,操作模式,分类,基本原理。 正文 一.BootLoad简介 1.1 BootLoader的概述 BootLoader是操作系统和硬件的纽带,它负责初始化硬件,引导操作系统内核,检测各种参数给操作系统内核使用。事实上,一个功能完备的大型BootLoader,就相当于一个小型的操作系统。在嵌入式领域中,操作系统移植的关键在于BootLoader的移植以及操作系统内核与硬件相关部分的移植。Bootloader是在操作系统运行之前执行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射表,从而将系统软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。通常,Bootloader是严重依赖于硬件而实现的,特别是在嵌入式世界里,嵌入式产品型号众多,硬件环境复杂,建立一个通用的Bootloader几乎是不可能的。尽管如此,仍然可以对Bootloader归纳出一些通用的概念来,以指导特定的Bootloader设计与实现。因此,正确进行Linux移植的条件是具备一个与Linux配套、易于使用的Bootloader,它能够正确完成硬件系统的初始化和Linux的引导。 Bootloader不但依赖于CPU的体系结构,而且依赖于嵌入式系统板级设备的配置。对于两块不同的嵌入式板而言,即使它们使用同一种处理器,要想让运行在一块板子上的Bootloader程序也能运行在另一块板子上,一般也都需要修改Bootloader的源程序。反过来,大部分Bootloader仍然具有很多共性,某些Bootloader也能够支持多种结构的嵌入式系统。通常它们能够自动从存储介质上启动,都能够引导操作系统启动,并且大部分都可以支持串口和以太网接口。

嵌入式Linux之我行——u-boot-2009_08在2440上的移植详解(六) - Bootloader移植篇 - hbhuanggang

嵌入式Linux之我行——u-boot-2009.08在2440上的移植 详解(六) 嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验, 二希望能给想入门嵌入式Linux的朋友提供方便。如有错误之处,谢请指正。 ?共享资源,欢迎转载:https://www.wendangku.net/doc/ef14526938.html, 一、移植环境 ?主机:VMWare--Fedora 9 ?开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 ?编译器:arm-linux-gcc-4.3.2.tgz ?u-boot:u-boot-2009.08.tar.bz2 二、移植步骤 上接:u-boot-2009.08在2440上的移植详解(五) 10)u-boot利用tftp服务下载内核和利用nfs服务挂载nfs文件系统。 知识点: 1.tftp服务的安装与配置及测试; 2.nfs服务的安装与配置及测试; 3.u-boot到kernel的参数传递(重点)。 我们知道使用tftp下载内核和使用nfs挂载文件系统的好处是,当我们重新编译内核或文件系 统后不用重新把这些镜像文件再烧录到flash上,而是把这些镜像文件放到开发主机的tftp或nfs 服务的主目录下,通过网络来加载他们,不用频繁的往flash上烧,这样一可以保护flash的使用 寿命,二可以方便的调试内核或文件系统,提高开发效率。可见,让u-boot实现这个功能是一件很有意义的事情。 实现这样的功能很简单,网上也有很多资料。但有很多细节的东西如果稍不注意就导致失败,这里就结合本人实现的过程进行讲述和一些问题的分析。 ?tftp服务的安装与配置及测试 要使用tftp服务及测试它要安装两个软件包,一个就是tftp服务器,另外一个就是tftp客户端,这里安装客户端只是用于在主机本地测试tftp服务器是否正常运行的,来确保u-boot能够访 问tftp服务(u-boot中已有tftp客户端的功能,其实在前面几篇中都已经使用了tftp下载内核或 文件系统到开发板上,如果那里都做到了,这里就可以直接跳过)。 首先使用rpm命令查看你的主机上是否已经安装了tftp服务器和客户端,如果没有安装就去下 载这两个软件包进行安装或者可以使用yum命令进行在线安装,yum会自动的去搜索适合你主机平 台的最新软件包进行下载安装,如果主机已经安装了,则会提示软件包已经安装了最新的版本。如 下图所示:

F BOOTROM引导模式和程序

28335使用串口烧写程序 串口烧写是一种相对较方便的烧写方式,相对于仿真器或是CAN烧写,相对于仿真器或是USB转CAN的设备,串口是一种非常廉价的烧写方式,而且也不需要安装专业的集成开发环境CCS等,但是不能实现在线调试,因此也只适用于程序基本不用再调整或大批量的场合。 F28335的存储器映射图如下:

BOOTROM 是一块8K X 16的只读存储器,位于地址空间0x3FE000~0x3FFFFF,片内BOOTROM在出厂时固化了引导加载程序以及定点和浮点数据表,片上BOOTROM的存储映射如下图所示: 1.内BOOT ROM数学表: 在BOOT ROM中保留了4K X 16位空间,用以存放浮点和IQ数据公式表,这些数据 公式表有助于改善性能和节省SARAM空间。 向量表: CPU向量表位于ROM存储器0x3FE000~0x3FFFFF段内,如下图所示。复位后,当VMAP=1,ENPIE=0(PIE向量表禁止)时,该向量表激活。

在内部BOOT ROM引导区中能够调用的唯一向量就是位于0x3FFFC0的复位向量。复位向量在出厂时被烧录为直接指向存储在BOOT ROM空间中的InitBoot函数,该函数用于开启引导过程。然后通过通用I/O引脚上的检验判断,决定具体引导模式。引导模式与控制引脚之间的关系如下图所示: Bootloader特性: Bootloader是位于片上引导ROM中的在复位后执行的程序,用于在上电复位后,将程序代码从外部源转移到内部存储器。这允许代码暂时存储在掉电不丢失数据的外部存储器内,然后被转移到高速存储器中执行。 引导ROM中的复位向量将程序执行重定向至InitBoot函数。执行器件初始化之后,bootloader将检查GPIO引脚的状态以确定您需要执行哪种引导模式。这些选项包括:跳转至闪存、跳转至SARAM、跳转至OTP或调用其中一个片上引导加载例程。

STM32的BOOT概述

STM32的BOOT概述 STM32 三种启动模式对应的存储介质均是芯片内置的,它们是:1)用户 闪存= 芯片内置的Flash。2)SRAM = 芯片内置的RAM 区,就是内存啦。3)系统存储器= 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP 程序。这个区域的内容在芯片出厂后没有人 能够修改或擦除,即它是一个ROM 区。 在每个STM32 的芯片上都有两个管脚BOOT0 和BOOT1,这两个管脚在芯 片复位时的电平状态决定了芯片复位后从哪个区域开始执行程序,见下表:BOOT1=x BOOT0=0 从用户闪存启动,这是正常的工作模式。 BOOT1=0 BOOT0=1 从系统存储器启动,这种模式启动的程序功能由厂家设置。BOOT1=1 BOOT0=1 从内置SRAM 启动,这种模式可以用于调试。 在系统上电的时候,cpu 首先根据这两个脚来确定是哪种模式的启动,然后 就是把相应模式的起始地址映射到0 地址处,并从0 地址处开始执行。在芯片 出厂时,st 烧写了一个bootloader 到rom 中,也就是system memory。这个bootloader 的主要任务就是通过uart1 下载程序到内置flash 中去。工作流程如下:system memory boot 模式,在执行完成它的任务之后是必须要退出的。这个退出方式是通过一次硬件reset 来实现的。在reset 的时候,必须要配置BOOT[1:0]这两个脚以使cpu 在重启之后进入适当的模式。 要注意的是,一般不使用内置SRAM 启动(BOOT1=1 BOOT0=1),因为SRAM 掉电后数据就丢失。多数情况下SRAM 只是在调试时使用,也可以做其他一些用途。如做故障的局部诊断,写一段小程序加载到SRAM 中诊断板上的 其他电路,或用此方法读写板上的Flash 或EEPROM 等。还可以通过这种方法解除内部Flash 的读写保护,当然解除读写保护的同时Flash 的内容也被自动清

三级嵌入式系统

三级嵌入式系统学习总结 一第一章 1.嵌入式系统概论 嵌入式系统中的软件一般都固化在只读存储器中,用户不能随意更改其中的程序功能。 嵌入式系统的逻辑组成:1)处理器2)存储器3)I/O设备与I/O接口4)数据总线5)软件 嵌入式处理芯片有四种类型:1)微处理器2)数字信号处理器3)微控制器(单片机)4)片上系统 微控制器MCU的低端产品并不会因为高端产品的出现而衰落 在32位MCU中,绝大多数使用RAM内核 EDA:电子设计自动化 IP核可以分为三种:软核、硬核、固核 2.嵌入式系统与数字媒体 计算机中常用的最广泛的西文字符及其编码是ASCII字符集和ASCII码,即美国标准信息交换码,共有128个字符,一个字符占一个字节。 我国目前广泛使用的汉字编码国家标准有GB2312和GB18030 GB2312只有6763个汉字,不够用 GB18030字符集与国际标准UCS/Unicode字符集基本兼容。GB18030采用不等长的编码方法,单字节编码表示ASCII码,双字节编码表示汉字,与GB2312保持向下兼容,四字节编码表示其他字符 Unicode最新版本是6.3。UCS/Unicode在计算机中具体实现时采用不同的编码方案,最常用的是UTF-8和UTF-16,UTF-8采用的是单字节可变长编码;UTF-16采用的是双字节可变长编码 文本的类型可以分为简单文本、丰富格式文本、超文本 图像的数据量=图像水平分辨率*图像垂直分辨率*像素深度/8(像素深度指的是每个像素用多少个二进制数来表示) 数字视频的数据量非常大,在进行传输时必须进行压缩,压缩编码标准是国际标准化组织(ISO)制定的,其名称为MPEG。 无线局域网采用的协议主要是IEEE 802.11(俗称WIFI) 3.数字通信与计算机网络 微波是一种300MHz-300GHz的电磁波 计算机网络的组成:1)计算机等智能电子设备2)数据通信链路3)通信协议4)网络软件 以太局域网: 1)发送数据设备必须把要传输的数据分成小块(帧)进行传输,一次只能传输1帧; 2)局域网中的每一个终端都有自己唯一的标识,称为物理地址或MAC地址,在发送的每一帧数据中,必须包含自己的MAC地址和接收终端的MAC地址 3)IP协议定义了主机的概念,所有主机及使用一种统一格式的地址标识,称为IP地址。4)以太局域网大多是由集线器或者交换机组网 计算机网络的类型:1)局域网2)城域网2)广域网 IP地址分为A、B、C三类。 IP是由四段数字组成,共32位,8位一段。 A类IP段0.0.0.0 到127.255.255.255 (0段和127段不使用)

BootLoader引导程序

BootLoader引导程序 一、实验目的 1.学会配置linux下的minicom和windows下的超级终端 2.了解bootloader的基本概念和框架结构 3.了解bootloader引导操作系统的过程 4.掌握bootloader程序的编译方法 5.掌握bootloader程序的使用方法 二、实验内容 1. 学习x-loader 作用和编译过程 2.学习uboot作用和编译过程 3.学习bootloader的操作 三、实验设备 PentiumII以上的PC机, LINUX操作系统 四、BOOTLOADER程序说明 完整的系统由x-loader、u-boot、kernel(内核)、rootfs(根文件系统)组成,x-loader 是一级引导程序,其作用是初始化CPU,拷贝u-boot到内存,然后把控制权交给u-boot。当OMAP3530上电时,memory controller(内存控制器)还未初始化,这个任务便由完成的x-loader。初始化外部RAM控制器,把u-boot读到外部RAM,之后把控制入口交给。u-boot 是二级引导程序,其作用主要是引导内核,提供映像更新,同用户进行交互。系统结构图如 下: 1. BootLoader的作用 在嵌入式系统中,BootLoader的作用与PC机上的BIOS类似,其主要作用:(1)初始化硬件设备;(2)建立内存空间的映射图;(3)完成内核的加载,为内核设置启动参数。通过BootLoader可以完成对系统板上的主要部件如CPU、SDRAM、Flash、串行口等进行初始化,也可以下载文件到系统板上,对Flash进行擦除与编程。当运行操作系统时,它会在操作系统内核运行之前运行,通过它,可以分配内存空间的映射,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统准备好正确的环境。 通常,BootLoader 是依赖于硬件而实现的,特别是在嵌入式系统中。因此,在嵌入式系统里建立一个通用的 BootLoader 几乎是不可能的,不同的处理器架构都有不同的

嵌入式系统BOOTLOADER的设计与实现

复旦大学 硕士学位论文 嵌入式系统BOOTLOADER的设计与实现 姓名:朱晶 申请学位级别:硕士 专业:计算机应用技术 指导教师:涂时亮 20040427

摘要y- 一 651830 嵌入式系统是把计算机直接嵌入到应用系统中,它融合了计算机软硬件技术,通信技术和半导体微电子技术,嵌入式设备已经越来越多地应用在现代人的工作和生活中,它在当今的应用正变得越来越广泛。BOOTLOADER作为嵌入式系统软件的重要组成部分,对它的研究和实现无疑也具有重要的现实意义。 本文首先对嵌入式系统BOOTLOADER的特点和作用进行了介绍。然后从嵌入式系统的角度对如何实现BOOTLOADER进行了比较全面的分析。 本文对嵌入式系统的硬件初始化,串u驱动及传输协议,网口驱动及传输协议,USB驱动及传输协议,FLASH的驱动等等都做了比较洋细的分析。并结合EV4480丌发板,给出了实现的具体细节。 最后,对已经实现的BOOTLOADER进行了测试和评估,并就今后的改进方向提出了自己的意见。 关键字:嵌入式系统;BOOTLOADER;UCLINUX

Abstract Virtuallyeveryelectronicdevicedesignedandmanufacturedtodayisallembeddedsystem.Briefly,BOOTLOADERisthefirstsoftwareprogramthatrunswhenacomputerstarts.Itisresponsibleforloadingandtransferringcontroltotheoperatingsystemkernelsoftware.ThisessayintroduceshowtodesignBOOTLOADERinanembeddedsystem. FirstthepaperintroducesthefeaturesandthnctionofBOOTLOADER,thenindetailanalyzesBOOTLOADERfromviewofembeddedfield,andbringsupasystemmodelofBOOTLOADER. Inthispaper,italsohaveadetailresearchonsomepartofBOOTLOADER,suchashardwareinitial,UARTdriverandtransferprotocai,lancarddriverandtflp/ipprotocai,USBdriverandtransferprotocal,FLASHdriveretc. Finally,thispaperimplementsandtestsBOOTLOADERinEV4480evaluationboard,thenbringsupsortieadviceontheimprovementinthefuture. Keyword:BOOTLOADER,embeddedsystem,UCLINUX

AN945 EFM8 Factory Bootloader用户指南中文版

AN945:EFM8 Factory Bootloader用户指南 本文档介绍了工厂编程的引导加载程序可用于EFM8设备。除了描述引导程序的功能,本文档还详细介绍了如何使用引导加载程序并更新Bootloader固件源代码或python主机软件,如果需要定制。 关键点 EFM8工厂编程的引导加载程序提供基本的生产编程或现场更新支持。?主机端都提供源代码python工具和bootloader 件来启用自定义。

1介绍 EFM8设备在工厂中使用引导加载程序进行编程。此引导程序启用: 1. 生产编程- 可以在生产环境中对设备进行编程,而无需使用调试接口需要PCB上的接入点和调试适配器。 2. 2.现场更新- 可以在现场的设备上发布更新,无需最终用户访问调试引脚或使用调试适配器硬件。 引导加载程序主要用于具有最小功能集的生产编程,但也可用于现场更新。因为几个EFM8变体可以有2 KB的闪存,引导程序的设计尽可能小。例如,UART和SMBus版本消耗单个512闪存页面,USB版本消耗1.5 KB闪存。另外,bootloader通常位于代码安全页面中,以使引导程序能够写入和擦除锁定的应用程序空间。更多信息在每个设备上的引导加载程序放置位置可以在设备数据手册或参考手册中找到。 22. USB或UART引导加载程序入门 这些步骤假定使用入门套件。使用自定义硬件时,步骤相同。 这些步骤还假设应用笔记zip文件已经下载到PC,或者使用Simplicity访问文件 工作室。应用程序zip文件可以在Silicon Labs网站(https://www.wendangku.net/doc/ef14526938.html,/8bit-appnotes)上找到。 ?将Bootloader下载到设备 如果引导加载程序尚未在设备上,请使用Simplicity Studio将Bootloader下载到设备,并按以下步骤操作。 日期代码在设备勘误表中列出的日期之后的顶部标记的设备可以支持引导加载程序并可能具有 bootloader预装。在此之前的日期代码的设备将不能与引导程序一起使用。 ?打开Simplicity Studio。 ?将入门工具包连接到PC。 ?将套件开关移动到[AEM]位置。 ?单击Simplicity Studio左窗格中的[Refresh detected hardware]按钮。该套件应显示在[Detected Hardware] 区。 ?单击工具包,然后单击Simplicity Studio的[tool]区域中的[Flash Programmer]图块。 ?单击[Erase]按钮。 ?单击[Browse]按钮,导航到套件设备的预编译引导加载程序十六进制文件,单击[Open],然后单击[Program]。

bootloader分析

Bootloader分析

?熟悉BootLoader的实现原理?认识Bootloader的主要任务?熟悉BootLoader的结构框架?U-boot使用

引言本章详细地介绍了基于嵌入式系统中的OS启动加载程序――Boot Loader的概念、软件设计的主要任务以及结构框架等内容。 一个嵌入式Linux系统从软件的角度看通常可以分为四个层次: ?1.引导加载程序。包括固化在固件(firmware)中的boot代码(可 选),和Boot Loader两大部分。 ?2.Linux内核。特定于嵌入式板子的定制内核以及内核的启动参数。 ?3.文件系统。包括根文件系统和建立于Flash内存设备之上文件 系统。通常用ram disk来作为root fs。 ?4.用户应用程序。特定于用户的应用程序。有时在用户应用程序和 内核层之间可能还会包括一个嵌入式图形用户界面。常用的嵌入式GUI有:MicroWindows和MiniGUI。

?引导加载程序是系统加电后运行的第一段软件代码。回忆一下PC 的体系结构我们可以知道,PC机中的引导加载程序由BIOS(其本质就是一段固件程序)和位于硬盘MBR中的OS Boot Loader(比如,LILO和GRUB等)一起组成。 ?BIOS在完成硬件检测和资源分配后,将硬盘MBR中的Boot Loader读到系统的RAM中,然后将控制权交给OS Boot Loader。 Boot Loader的主要运行任务就是将内核映象从硬盘上读到RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。 而在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由Boot Loader来完成。 ?比如在一个基于ARM7TDMI core的嵌入式系统中,系统在上电 或复位时通常都从地址0x00000000处开始执行,而在这个地址 处安排的通常就是系统的Boot Loader程序。

bootloader流程

Bootloader 设计分析 3.1 Bootloader 的操作模式 (Operation Mode) 大多数 Bootloader 都包含两种不同的操作模式[2]: (1). 启动加载(Boot loading)模式:也称为“自主”模式。即Bootloader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。 (2).下载(Downloading)模式:在这种模式下,目标机上的Bootloader将通过串口或网络连接等通信手段从主机(Host)下载内核映像和根文件系统映像等,然后保存到目标机上的FLASH 类固态存储设备中。Bootloader的这种模式通常在系统初次安装和更新时被使用,工作于这种模式下的Bootloader通常都会向它的终端用户提供一个简单的命令行接口。 在我们的Bootloader设计中我们同时支持这两种工作模式,采用的方法是:一开始启动时处于正常的启动加载模式,但并不立即启动进入uClinux内核,而是提示延时5秒,等待终端用户如果按下某一特定按键,则切换到下载模式,否则继续启动uCLinux 内核。 3.2 Bootloader 的启动及初始化 基于ARM的芯片多数为复杂的片上系统(SoC),这类复杂系统里的多数硬件模块都是可配置的[3]。因此大多数 Bootloader 都分为 stage1 和 stage2 两大部分。依赖于 CPU 体系结构的代码,通常都放在 stage1 中,而且在这一部分,我们直接对处理器内核和硬件控制器进行编程,因此常常都用汇编语言来实现。而stage2则通常用C语言来实现,这样可以实现更复杂的功能,而且代码会具有更好的可读性和可移植性。 3.2.1 Bootloader的stage1 这部分代码必须首先完成一些基本的硬件初始化,为stage2的执行以及随后的kernel 的执行准备好一些基本的硬件环境[2]。Bootloader的stage1一般通用的内容包括: * 定义程序入口点 * 设置异常向量表 * 初始化存储系统(包括地址重映射) * 初始化有特殊要求的端口,设备 * 初始化用户程序的执行环境

嵌入式BootLoader移植实验三

合肥学院 嵌入式系统设计实验报告 (2013- 2014第二学期) 专业: 实验项目:实验三 BootLoader移植实验 实验时间: 2014 年 5 月 7 实验成员: ___ 指导老师:干开峰 电子信息与电气工程系 2014年4月制

一、实验目的 1、熟悉Bootloader工作原理。 2、了解U-Boot的代码结构。 3、掌握U-Boot移植过程。 二、实验内容 本实验熟悉Bootloader工作原理,了解U-Boot源码结构,基于S3C2440处理器,完成U-Boot移植,并在目标开发板上测试通过。 三、移植环境 u-boot版本:u-boot-2011-03 Linux平台:Fedora 14 交叉编译工具:arm-linux-gcc-4.3.3 arm开发板:micro2440 CPU:S3C2440 SDRAM:64M 1 Nor Flash:2M Nand Flash:256M 网卡:DM9000EP 四、实验过程 1、建立Micro2440配置 (1)按下图所示命令解压u-boot-2011.03-micro2440.tar压缩包 (2)输入命令:gedit boards.cfg打开boards.cfg文件。 在boards.cfg中添加一行:micro2440 arm arm920t - samsung s3c24x0 语句。 (3)创建板级支持文件 输入命令:cp -r board/samsung/smdk2410 board/samsung/micro2440 cd board/samsung/micro2440/ mv smdk2410.c micro2440.c gedit Makefile

移植Bootloader过程总结

一.linux系统上电后启动过程: ---→启动引导加载程序bootloader(一些CPU在运行bootloader之前,会先运行一段固化的程序)。 --->启动内核 --->挂载根文件系统 其中,Boot paramoters分区中放置一些可设置的参数,比如,IP地址、串口波特率、要传递给内核的命令行参数等。 二.为什么要进行bootloader移植? ---→bootloader的实现依赖于具体的硬件,而在嵌入式产品中硬件的配置千差万别,即使相同的CPU,它的外设也有可能不同,所以不可能有一个bootloader支持所有的CPU,即使是支持CPU架构比较多的U-Boot,也不是拿来就能用的,也需要做一些简单的移植。 三.Bootlader的启动过程分为两个阶段: 第一阶段: --->硬件设备的初始化(进入svc模式、关闭watchdog、禁中断、设置系统时钟频率、初始化存储控制器、初始化堆栈)。 --->uboot的代码重定位,从nand中拷贝至sdram中,默认是从norflash拷贝至sdram --->跳转到第二阶段c代码继续执行 第二阶段: --->初始化本阶段要使用的硬件设备(如串口)。 --->检测系统内存的映射(memory map)。 --->从flash读取内核镜像和文件系统到sdram中。

--->为内核设置启动参数。 --->启动内核。 注意:1、所谓检测内存映射,就是确定板子上使用了多少内存,它们的地址空间如何 2、存储在flash上的内核镜像可能是压缩的(如.cramfs 格式),在读到内存中就需要解压,但是对于带有自解压功能的内核来说,是不需要boorloader来解压。 3、将根文件系统拷贝到sdram中,这个不是必须的,具体看内核访问它的方式。

Bootloader的概念和作用

Bootloader的概念和作用 (1)Bootloader的概念和作用 Bootloader是嵌入式系统的引导加载程序,它是系统上电后运行的第一段程序,其作用类似于 PC 机上的 BIOS。在完成对系统的初始化任务之后,它会将非易失性存储器(通常是 Flash或 DOC 等)中的Linux 内核拷贝到 RAM 中去,然后跳转到内核的第一条指令处继续执行,从而启动 Linux 内核。由此可见,bootloader 和 Linux 内核有着密不可分的联系,要想清楚的了解 Linux内核的启动过程,我们必须先得认识 bootloader的执行过程,这样才能对嵌入式系统的整个启过程有清晰的掌握。 (2)Bootloader的执行过程 不同的处理器上电或复位后执行的第一条指令地址并不相同,对于 ARM 处理器来说,该地址为 0x00000000。对于一般的嵌入式系统,通常把 Flash 等非易失性存储器映射到这个地址处,而bootloader就位于该存储器的最前端,所以系统上电或复位后执行的第一段程序便是 bootloader。而因为存储 bootloader的存储器不同,bootloader的执行过程也并不相同,下面将具体分析。 嵌入式系统中广泛采用的非易失性存储器通常是 Flash,而 Flash 又分为 Nor Flash 和Nand Flash 两种。它们之间的不同在于: Nor Flash 支持芯片内执行(XIP, eXecute In Place),这样代码可以在Flash上直接执行而不必拷贝到RAM中去执行。而Nand Flash并

不支持XIP,所以要想执行 Nand Flash 上的代码,必须先将其拷贝到 RAM中去,然后跳到 RAM 中去执行。 实际应用中的 bootloader根据所需功能的不同可以设计得很复杂,除完成基本的初始化系统和调用 Linux 内核等基本任务外,还可以执行很多用户输入的命令,比如设置 Linux 启动参数,给Flash 分区等;也可以设计得很简单,只完成最基本的功能。但为了能达到启动Linux 内核的目的,所有的 bootloader都必须具备以下功能[2] :初始化 RAM处理 因为 Linux 内核一般都会在 RAM 中运行,所以在调用 Linux 内核之前 bootloader 必须设置和初始化 RAM,为调用 Linux内核做好准备。初始化 RAM 的任务包括设置 CPU 的控制寄存器参数,以便能正常使用 RAM 以及检测RAM 大小等。 初始化串口 串口在 Linux 的启动过程中有着非常重要的作用,它是 Linux 内核和用户交互的方式之一。Linux 在启动过程中可以将信息通过串口输出,这样便可清楚的了解 Linux 的启动过程。虽然它并不是bootloader 必须要完成的工作,但是通过串口输出信息是调试bootloader 和Linux 内核的强有力的工具,所以一般的 bootloader 都会在执行过程中初始化一个串口做为调试端口。 检测处理器类型

Bootloader移植

专业班级:通信一班 学号:100103011111 指导老师:胡广义 学生姓名:文定定 2013-09-17

题目:嵌入式BootLoader的移植分析 一、导读 (1 ) BootLoader定义 系统上电之后,需要一段程序来进行初始化:关闭WATCHDOG、改变系统时钟、初始化存储控制器、将更多的代码复制到内存中等。如果它能将操作系统内核复制到内存中运行,无论从本地,比如Flash;还是从远端,比如网络,就称这段程序为Bootloader。 Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。在嵌入式系统中,通常并没有像BIOS那样的固件程序,因此整个系统的加载启动任务就完全由BootLoader来完成。 (2) BootLoader的作用 加载程序由BIOS(其本质就是一段固件程序)和位于硬盘MBR中的OS BootLoader(比如,LILO和GRUB等)一起组成。BIOS在完成硬件检测和资源分配后,将硬盘MBR中的BootLoader读到系统的 RAM中,然后将控制权交给OS BootLoader。BootLoader的主要运行任务就是将内核映象从硬盘上读到 RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。而在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。比如在一个基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader 程序。 二、U-boot 启动流程分析 U-Boot简介 U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux 内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。但是 U-Boot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。就目前来看,U-Boot对PowerPC 系列处理器支持最为丰富,对Linux的支持最完善。 U-Boot 主要目录结构: - board Board dependent files 目标板相关文件,主要包含SDRAM,FLASH 驱动

ARM7的Bootloader和分散加载文件笔记

Boot Loader概述 简单地说,在操作系统内核运行之前,通过一小程序,可以初始化硬件设备、建立内存空间的映射图等,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核配置好相应的环境,也可以下载文件到系统板上的SDRAM,对Flash进行擦除与编程,这个小程序一般称为Boot Loader。可以说,一个功能完善的Boot Loader已经相当于一个微型的操作系统了。 Boot Loader作为系统复位或上电后首先运行的代码,一般应写入Flash存储器并从起始物理地址0x0开始。Boot Loader是非常依赖于硬件而实现的,而且根据实现的功能不同,其复杂程度也各不相同。一个简单的Boot Loader可以只完成USB口的初始化,而功能完善的Boot Loader可以支持比较复杂的命令集,对系统的软硬件资源进行合理的配置与管理。因此,建立一个通用的Boot Loader 几乎是不可能的。 系统初始化代码直接对ARM微处理器内核及硬件控制器编程,多采用汇编语言编程,初始化代码一般应包括如下典型任务: 1.定义程序入口点; 2.设置异常和中断向量表; 3.初始化存储设备; 4.初始化堆栈指针寄存器; 5.初始化用户执行环境; 6.呼叫主应用程序。 1.1 定义程序入口 初始化代码必须定义整个程序的入口点。通过伪指令Entry指定编译器保留该段代码,同时配合链接器的设置,确定整个程序的入口点。 1.2 设置异常和中断向量表 1.3初始化存储设备 1. 存储器类型和时序的配置 2.存储器的地址分配与地址重映射 一种典型的存储器地址重映射过程描述如下:当系统上电或复位以后,PC指针指向0x0,程序从0x0地址开始执行,因此,为了能正确读取代码,要求此时Flash (或其它类型的ROM)的起始地址为0x0。但Flash(或其它类型的ROM)的访问速度大大低于RAM,每次产生异常后,都要从Flash(或其它类型的ROM)的异常向量表调转到相应的处理程序,会影响异常的响应速度,因此,系统便提供一种灵活的地址重映射方法,在系统完成必要地初始化以后,将RAM安排到0x0 地址处,而将原来位于0x0处的Flash(或其它类型的ROM)安排到其他的地方上去,加快异常的响应速度。

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。 1.3 Boot Loader 的功能和选择 综上所述:BootLoader 是在操作系统内核启动之前运行的一段小程序。通过这段程序,我们可以初始化硬件设备,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境,最后从别处(Flash、以太网、UART)载入内核映像到主存并跳到入口地址。 由于BootLoader 需要直接操作硬件,所以它严重依赖于硬件,而且依据所引导的操作系统的不同,也有不同的选择。对于嵌入式世界中更是如此。就S3C24x0 而言,如果是引导Linux,一般选用韩国的mizi 公司设计的vivi 或者DENX 软件工程中心的Das U-boot,如果是引导Win CE,就选用Eboot。如果是开发StrongARM 构架下的LART,就可选用由Jan-Derk Bakker 和Erik Mouw 发布的Blob(Boot Loader Object)。如果是要引导eCos 系统,可 以选用同是RedHat公司开发的Redboot。 所以在嵌入式世界中建立一个通用的BootLoader 几乎是不可能的,而可能的是让一个Boot Loader 代码支持多种不同的构架和操作系统,并让她有很好的可移植性。U-boot 就是支持多平台多操作系统的一个杰出代表。这也是U-boot 的优势所在,因为如果在开发 S3C2440 时熟悉了U-boot,再转到别的平台的时候,就可以很快地完成这个平台下U-boot 的移植。而且U-boot 的代码结构越来越合理,对于新功能的添加也十分容易。

嵌入式操作系统bootloader

嵌入式系统的Boot Loader 在专用的嵌入式板子上运行GNU/Linux 系统已变得越来越流行。一个嵌入式Linux 系统从软件的角度看通常可以分为四个层次: 引导加载程序:包括固化在固件(firmware)中的boot 代码(可选)和Boot Loader 两大部分。Linux内核:特定于嵌入式板子的定制内核及内核的启动参数。 文件系统:包括根文件系统和建立于Flash 内存设备之上的文件系统。通常用RAM-Disk 来作为根文件系统。 用户应用程序:特定于用户的应用程序 引导加载程序是系统加电后运行的第一段软件代码,例如PC 机的引导加载程序,包括:BIOS(其本质就是一段固件程序)和位于硬盘MBR 中的OS Boot Loader,比如LILO、GRUB 等。BIOS的主要任务是进行硬件检测和资源分配;将MBR中的OS Boot Loader读到系统的RAM 中;将控制权交给OS Boot Loader。Boot Loader 的主要运行任务是将内核映象从硬盘上读到RAM 中和跳转到内核的入口点去运行,也即启动操作系统。 在嵌入式系统中通常并没有像BIOS 那样的固件程序(注:有的嵌入式CPU 也会内嵌一段短小的启动程序),整个系统的加载启动任务完全由Boot Loader 完成。如在一个基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000 处开始执行,而在这个地址处安排的通常就是系统的Boot Loader 程序。 Boot Loader 是在操作系统内核运行之前运行的第一段小程序,负责初始化硬件设备和建立内存空间的映射图,将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。加载操作系统内核映象到RAM中,并将系统的控制权传递给它。 在嵌入式世界里建立一个通用的Boot Loader 几乎是不可能的,Boot Loader 对硬件的依赖性非常强,特别是在嵌入式系统世界中尽管如此,仍可对Boot Loader 归纳出一些通用的概念,以指导用户特定的Boot Loader 设计与实现。 Boot Loader依赖于CPU 的体系结构和具体的嵌入式板级设备的配置。不同的CPU体系结构都有不同的Boot Loader,有些Boot Loader 也支持多种CPU体系结构,例如U-Boot 同时支持ARM和MIPS体系结构。对于两块不同的嵌入式板,即使它们基于同一种CPU,要想让运行在一块板子上的Boot Loader也能运行在另一块板子上,通常也都需要修改Boot Loader源程序。 系统加电或复位后,所有的CPU 通常都从某个由CPU 制造商预先安排的地址上取指令。比如,基于ARM7TDMI core 的CPU 在复位时通常都从地址0x00000000 取它的第一条指令。基于CPU 构建的嵌入式系统通常都有某种类型的固态存储设备被映射到该预先安排的地址上。比如:ROM、EEPROM 或FLASH 等。 烧写boot loader程序一般通过jtag烧写,需要jtag连接器和PC端的烧写程序。主机和目标机之间一般通过串口建立连接,Boot Loader 在执行时常通过串口来进行I/O,比如输出打印信息到串口、从串口读取用户控制字符等。最常用的串口通信软件有Linux下的minicom和Windows附件中的超级终端。 Boot Loader的启动过程可以是单阶段(Single Stage)或多阶段(Multi-Stage)。一些只需完成很简单功能的boot loader可能是单阶段的。通常多阶段的Boot Loader 能提供更为复杂的功能,以及更好的可移植性。从固态存储设备上启动的Boot Loader 大多都是 2 阶段的启动过程,也即启动过程可以分为stage1 和stage2 两部分。 大多数Boot Loader 包含两种不同的操作模式,启动加载(Boot loading)模式和下载(Downloading)模式。这种区别仅对于开发人员才有意义,从最终用户的角度看,Boot Loader 的作用就是加载操作系统,并不存在上述两种模式的区别。

相关文档
相关文档 最新文档