第七章 嵌入式Linux的BootLoader
嵌入式系统中Bootloader的设计与实现_马学文
嵌入式系统中Bootloader 的设计与实现马学文1,朱名日1,2,程小辉1 (1. 桂林工学院电子与计算机系,桂林541004;2.中南大学信息物理工程学院,长沙410083)—97—作者所承研的项目中硬件平台是基于ARM7TDMIRISC 内核的三星公司S3C4510B 微处理器,采用的嵌入式Linux 系统为uCLinux。
系统有64MB SDRAM, 其地址从0x 0800.0000 ~0x0bff.ffff, 还有32MB Flash, 其地址从0x0c00.0000~0x0dff.ffff。
32MB Flash 具体规划如下:从0x0c00.0000 开始的第1 个1MB 放Bootloader,从0x0c10.0000开始的2MB放Linux kernel, 从0x0c30.0000开始的余下部分都给rootdisk。
64MB SDRAM 启动后的具体程序分布示意图如图2 所示。
图2 64MB SDRAM 的程序分布示意图Bootloader 一般有几个文件组成。
先是START.s,也是唯一的一个汇编程序,其余的都是C 语言写成的,START.s主要用来初始化堆栈:_start:ldr r1,=StackInit /* r1 是参数字符串的地址*/ldr sp,[r1]int main().equ StackInitValue,_end_data+0x1000/* 在连结脚本中指定4K __end_data*/StackInit:.long StackInitValue.global JumpToKernelJumpToKernel: /*拷贝内核的代码*/mov pc, r0 /*获得Kernel 地址*/.global JumpToKernel0x /*用来扩展内核*/JumpToKernel0x: /*拷贝获得的扩展内核*/mov r8, r0mov r0, r1mov r1, r2mov r2, r3mov r3, r4mov pc, r8.section“.data.boot”.section“.bss.boot”其中main 函数的C 语言实现过程如下:int main(){U32 *pSource, *pDestin, count;U8 countDown, bootOption;U32 delayCount;U32 fileSize, i;char c;char *pCmdLine;char *pMem;init(); /*初始化Flash 控制器和CPU 时钟*/EUARTinit(); /*串口初始化*/EUARTputString("\n\n Linux Bootloader\n"); /*打印信息*/ EUARTputString((U8 *)cmdLine); /*command_line 支持, 用于定制内核*/EUARTputString("\n\n");用command_line 可以给内核传一些参数,自己定制内核的行为。
嵌入式系统第七讲 嵌入式Linux系统启动分析
嵌入式LINUX内核的版本控制 (2)
嵌入式Linux的版本号后面还会加一个后缀,如 “rmk4-mx1bsp0.3.6” ,该后缀往往表示针对某 个开发平台的补丁。几个常用的后缀:
– – –
–
rmk:表示由Russell King维护的ARM Linux; np:表示由Nicolas Pitre维护的基于StrongARM和 Xscale的ARM Linux; ac:表示由Alan Cox(Alan Cox是仅次于Linus的 Linux维护人员,主要负责网络部分和OSS等的维护 工作)维护的Linux代码; hh : 表 示 由 网 站 发 布 的 ARM Linux代码,主要是基于Xscale的,它包括工具链 、内核补丁、嵌入式图形系统等。
Bootloader空间位置
在flash中的典型空间分配情况
BootLoader 的主要功能(1/2)
初始化系统在启动阶段必需的硬件设备; 准备后续软件系统(如操作系统)运行所需 的软件环境,如复制操作系统内核代码到 RAM中等。 向内核传递启动参数; [可选]配置系统各种参数;
BootLoader 的主要功能(2/2)
BootLoader的特点
BootLoader是操作系统内核运行前的核心程 序,它具有如下特点: 代码量大; 由C语言写成,大多数时候需要嵌入式汇编 语言; 运行于SDRAM等随机存储器 由于它是启动内核前运行的最后一个程序, 它必须把控制权交给内核,因此它最后是一 条跳转到系统内核的语句。
嵌入式LINUX的内核源代码结构 (1)
COPYING
– GPL版权申明。
CREDITS
– 光荣榜。对Linux做出过重大贡献的人员信息。
嵌入式Linux应用编程模块二:安装嵌入式BootLoader技术
上一页 下一页 返回
任务3:GRUB引导加载程序
• ⑥加载内核的相关设置(/etc/sysctl.conf)。 • ⑦设置系统时间。 • ⑧设置终端控制台的字型。 • ⑨设置RAID与LVM等硬盘功能。 • ⑩以fsck检验磁盘文件系统。 • (6)启动系统服务与相关启动设置文件。 • (7)用户自定义引导启动程序/etc/rc.d/rc.loc
l/dev/sdax来重新安装gru:引导加载程序viv
• 子任务1:vivi简介
• vivi是韩国MIZIResearch公司为其开发的SMDK 2410开发板编写的一款Bootloader,目前的版本是0 .1.4。vivi也有两种工作模式:启动加载,可以在一段时间后 自行启动Linu内核,这是vivi的默认模式;下载模式,vi vi为用户提供一个命令行接口,通过接口可以使用vivi提供的 一些命令。
AM空间中。 • (4)为内核设置启动参数。 • (5)调用内核。
上一页
返回
任务3:GRUB引导加载程序
• 子任务1:Linux操作系统的启动流程
• (1)加载BIOS的硬件信息,并获取第一个启动设备的代号。 • (2)读取第一个启动设备的MBR (主引导记录) 的引导加载程
序(即lilo,grub,spfdisk等)的启动信息。 • (3)加载核心操作系统的内核信息,内核开始解压缩,并且尝试驱
上一页
返回
任务2:BootLoader
• 一、BootLoader所支持的CPU和嵌入式板 • 一般来说,不同的CPU体系结构需要不同的BootLoader
,但有些功能强大的也会同时支持不同体系结构的CPU。U-Bo ot就同时支持多种体系结构,如X85、ARM、DSP等。除了 依赖CPU的体系结构外,也依赖于具体的嵌入式板级设备的配置, 如板卡的硬件地址的分配、RAM芯片的类型以及其他外设的类型等 。 • 现有的各种BootLoader所支持的CPU,有LILO ( X86)、GRUB (X86)、Blob(ARM),U-Bo ot(X86、ARM、PowerPC)、vivi(ARM)等 。
嵌入式系统的Bootloader
• 应用程序部分 ➢构建基本的嵌入式Linux文件系统 ➢应用程序开发与移植
嵌入式系统设计
-目标机开发模式
并口/串口
嵌入式系统设计
JTAG
BootLoader和嵌入式Linux嵌入式系统计BootLoader分类
• BootLoader ➢LILO ➢GRUB ➢U-BOOT
嵌入式系统设计
嵌入式系统的BootLoader
嵌入式系统设计
• 嵌入式Linux系统从整体上讲,可以分为五大部分:
– BootLoader(引导加载程序) – Kernel(内核) – File System(文件系统) – Device drivers(驱动程序) – Applications(应用程序)
Stage1:(阶段一主要通过汇编语言实现,依赖cpu体系结构初始化 • 进行硬件的初始化(watchdog,ram初始化)。复制Stage2阶段代码到RAM空间。 • 为Stage2加载代码准备RAM空间。 • 设置好栈。
• 跳转到第二阶段代码的入口点。
Stage2:(阶段2主要通过c语言实现,具有好的可读性和移植性) • 初始化该阶段所用到的硬件设备。 • 检测系统内存映射。 • 将uImage, Rootfs, dtb文件从flash读取到RAM内存中。 • 设置内核启动参数。(如通过寄存器传递设备树文件的内存地址)
包括正确地设置系统的内存控制器的功能寄存器以及各内存控 制寄存器等
➢ 初始化 LED
典型地,通过 GPIO 来驱动 LED,其目的是表明系统的状态是 OK 还是 Error。如果板子上没有 LED,那么也可以通过初始化 UART 向串口打印 BootLoader 的 Logo 字符信息来完成这一点 ➢ 关闭 CPU 内部指令/数据 cache
嵌入式课件之——第7章_嵌入式Linux软件设计
嵌入式Linux软件设计 嵌入式Linux软件设计
嵌入式Linux Linux软件设计 第7章 嵌入式Linux软件设计
主要内容
1 Bootloader引导程序 引导程序 的移植 2 Linux的移植
3
驱动程序开发
4
应用程序开发
2
Bootloader的启动过程 7.1.1 Bootloader的启动过程
嵌入式Linux Linux软件设计 第7章 嵌入式Linux软件设计
BootLoader的实现依赖于 的实现依赖于CPU的体系结构,因此大多 的体系结构, 的实现依赖于 的体系结构 都分为stage1和stage2两大部分. 两大部分. 数BootLoader都分为 都分为 和 两大部分 BootLoader的stage1通常包括以下步骤: 通常包括以下步骤: 的 通常包括以下步骤 硬件设备初始化. 硬件设备初始化. 为加载BootLoader的stage2准备 准备RAM空间. 空间. 为加载 的 准备 空间 复制BootLoader的stage2到RAM空间中. 空间中. 复制 的 到 空间中 设置好堆栈. 设置好堆栈. 跳转到stage2的入口点. 的入口点. 跳转到 的入口点 BootLoader的stage2通常包括以下步骤: 的 通常包括以下步骤: 通常包括以下步骤 初始化本阶段要使用的硬件设备. 初始化本阶段要使用的硬件设备. 检测系统内存映射. 检测系统内存映射. 映像和根文件系统映像从Flash读到 读到RAM中. 将kernel映像和根文件系统映像从 映像和根文件系统映像从 读到 中 为内核设置启动参数. 为内核设置启动参数. 调用内核. 调用内核.
4
嵌入式Linux Linux软件设计 第7章 嵌入式Linux软件设计
电子科大 第7章 嵌入式Linux软件设计——bootloader
7.2 Uboot介绍及移植
Uboot常用命令 环境变量相关 Printenv打印环境变量
第7章 嵌入式Linux软件设计
打印Uboot的环境变量,包括串口波特率、IP地址、 MAC地址、内核启动参数、服务器IP地址等。 setenv设置环境变量 对环境变量的值进行设置,保存在SDRAM中,但不写 入Flash。这样系统掉电后设置的环境变量就不存在了。
17
7.2 Uboot介绍及移植
Uboot目录结构
第7章 嵌入式Linux软件设计
doc:文档目录。Uboot有非常完善的文档。 drivers:uboot支持的设备驱动程序都放在该目录,比如 各种网卡、支持CFI的Flash、串口和USB总线等。 dtt:数字温度测量器或者传感器的驱动。 examples:一些独立运行的应用程序的例子。 fs:支持文件系统的文件,u-boot现在支持cramfs、fat、 fdos、jffs2、yaffs和registerfs。
系统加电或复位后,所有的CPU通常都从CPU制造商 预先安排地址开始执行。比如,S3C2410在复位后从地址 0X00000000起开始执行。而嵌入式系统则将固态存储设 备(比如Flash)安排在这个地址上,而bootloader程序又 安排在固态存储器的最前端,这样就能保证在系统加电后, CPU首先执行Bootloader程序。
3
7.1 Bootloader介绍
定义:
第7章 嵌入式Linux软件设计
在嵌入式中,通常没有像BIOS那样的固件程序,因 此整个系统的加载启动任务就完全由Bootloader来完成。 比如在一个基于ARM7TDMI core的嵌入式系统中,系统在 上电或复位时都从地址0X00000000开始执行。而在这个地 址处安排的通常就是系统的Bootloader程序。
嵌入式系统设计-BootLoader
u32 size; /*the byte number of the memory region*/
int
used;
}memory_area_t;
Boot Loader划分
• 大多数Boot Loader 都分为stage1 和stage2
两大部分。依赖于CPU 体系结构的代码, 比如设备初始化代码等,通常都放在stage1 中,而且通常都用汇编语言来实现,以达 到短小精悍的目的。而stage2 则通常用C语 言来实现,这样可以实现给复杂的功能, 而且代码会具有更好的可读性和可移植性。
好准备。
跳转到 stage2 的 C 入口点
Stage2
• 通常包括以下步骤(以执行的先后顺序):
– 初始化本阶段要使用到的硬件设备。 – 检测系统内存映射(memory map)。 – 将kernel 映像和根文件系统映像从flash 上读到
RAM 空间中。 – 为内核设置启动参数。 – 调用内核。
来作为 main() 函数的外部包裹(external wrapper)
• 用汇编语言写一段trampoline 小程序,并
将这段 trampoline 小程序来作为 stage2 可执行映象的执行入口点。
• 在 trampoline 汇编小程序中用 CPU 跳转
指令跳入 main() 函数中去执行;
60KB 4KB 704KB 1280KB
Bootloader空间结构划分
控制Boot Loader 的设备或机制
• 主机和目标机之间一般通过串口建立连接,
Boot Loader 软件在执行时通常会通过串口 来进行I/O,比如:输出打印信息到串口, 从串口读取用户控制字符等
Boot Loader 的操作模式
嵌入式系统Bootloader学习笔记
在嵌入式系统学习过程中涉及到了在嵌入式系统学习过程中涉及到了Bootloader,下面讲述了Bootloader的基本作用,在后续的文章中我将对如何编写自己的Bootloader进行介绍。
1. Bootloader的基本概念:简单地说,bootloader就是在操作系统内核运行前运行地一段小程序。
通过这段小程序,可以对硬件设备,如CPU、SDRAM、Flash、串口等进行初始化,也可以下载文件到系统板、对Flash进行擦除和编程,真正起到引导和加载内核镜像的作用,但是随着嵌入式系统的发展,bootloader已经逐渐在基本功能的基础上,进行了扩展,bootloader可以更多地增加对具体系统的板级支持,即增加一些硬件模块功能上的使用支持,以方便开发人员进行开发和调试。
从这个层面上看,功能扩展后bootloader可以虚拟地看成是一个微小的系统级的代码包。
bootloader是依赖于硬件而实现的,特别是在嵌入式系统中。
不同的体系结构需求的bootloader是不同的;除了体系结构,bootloader还依赖于具体的嵌入式板级设备的配置。
也就是说,对于两块不同的嵌入式板而言,即使它们基于相同的CPU构建,运行在其中一块电路板上的bootloader,未必能够运行在另一块电路开发板上。
BootLoader为系统复位或上电后首先运行的代码,一般应写在起始物理地址0x0开始。
Bootloader的启动过程可以是单阶段的,也可以是多阶段的。
通常多阶段的bootloader能提供更为复杂的功能,以及更好的可移植性。
从固态存储设备上启动的bootloader大多数是二阶段的启动过程,也即启动过程可以分为stage 1和stage 2两部分。
2. ARM Bootloader的一般作用对于一个ARM系统来说,本质上,bootloader作为引导与加载内核镜像的“工具”,在实现上,必须提供以下几个功能,更确切地说,必须做到以下几点:(1)初始化RAM(必需):bootloader必须能够初始化RAM,因为将来系统要通过它保存一些Volatile数据,但具体地实现要依赖与具体的CPU以及硬件系统。
第7章 嵌入式BootLoard技术及Linux根文件系统
从主机下载的文件通常首先被 Boot Loader 保存到目标机 的 RAM 中,然后再被 Boot Loader 写到目标机上的 FLASH 类固态存储设备中。
这种模式通常在第一次安装内核与根文件系统时 被使用;此外,以后的系统更新也会使用 Boot Loader 的这种工作模式。 工作于这种模式下的 Boot Loader 通常都会向它的 终端用户提供一个简单的命令行接口。
7.3.2 Boot Loader 的 stage2 (1/2)
通常包括以下步骤(以执行的先后顺序):
初始化本阶段要使用到的硬件设备。 检测系统内存映射(memory map)。 将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中。 为内核设置启动参数。 调用内核。
依赖于处理器体系结构和板级初始化的代码, 通常都放在 stage1 中,用汇编言实现 而 stage2 则通常用C语言来实现,这样可以实 现更复杂的功能,而且代码会具有更好的可 读性和可移植性。
7.3.1 Boot Loader 的 stage1
通常包括以下步骤(以执行的先后顺序):
硬件设备初始化。 为加载 Boot Loader 的 stage2 准备 RAM 空间。 拷贝 Boot Loader 的 stage2 到 RAM 空间中。 设置好堆栈。 跳转到 stage2 的 C 入口点。
设置复位模式 板上其他外设初始化 内存映射,MMU初始化 系统堆(heap)空间初始化 MTD设备(分区)初始化 初始化vivi命令 进入命令行或者引导系统
7.4.6vivi的启动流程-装载主要组件
初始化文件系统
ARM-Linux嵌入式系统的BootLoader分析与设计.
ARM-Linux嵌入式系统的BootLoader分析与设计0引言由BootLoader和固化在固件(firmware)中的Boot代码(可选)共同组成一个嵌入式系统的引导加载程序。
它的作用和功能就像固化到计算机内主板上的一个ROM芯片程序BIOS(basicinputoutputsystem)。
但是它一般不配置像BIOS那样的固件程序,这是因为要考虑经济方面的原因,因此必须自己完成这方面的工作。
BootLoader可以初始化硬件设备,建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准0 引言由Boot Loader和固化在固件(firmware)中的Boot代码(可选)共同组成一个嵌入式系统的引导加载程序。
它的作用和功能就像固化到计算机内主板上的一个ROM芯片程序BIOS(basic input output system)。
但是它一般不配置像BIOS那样的固件程序,这是因为要考虑经济方面的原因,因此必须自己完成这方面的工作。
Boot Loader可以初始化硬件设备,建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
它的实现严重地依赖于硬件,特别是在嵌入式系统中,即使基于同一个CPU的Boot Loader,对于不同的板子,也有很大的不同。
1 Boot Loader分析系统加电,然后复位后,基本上所有的CPU都是从复位地址上取得指令的。
以微处理器为核心的嵌入式系统中,通常都有某种类型的固态存储设备(FLASH,E2PROM等),这个固态存储设备被映射到一个预先设置好的地址上。
在系统加电复位后,一开始处理器就会去执行存放在复位地址处的程序,而且通过开发环境可以将Boot Loader定位在复位地址一开始的存储空间上,因此Boot Loader是系统加电后,在操作系统内核或者一些应用程序被运行之前,首先会运行的程序。
第七章 嵌入式Linux的BootLoader
7.1.2 Bootloader 的启动
Flash 启动方式
大多数嵌入式系统上都使用Flash存储介质,NOR Flash(线性Flash)使用最为普遍。 Bootloader一般放在Flash的底端或者顶端,这需要 根据处理器的复位向量来进行设置。 可以配置成MTD设备来访问Flash分区。
10
Bootloader-启动举例
11
Bootloader-启动举例
12
Bootloader-启动举例
13
7.1.2 Bootloader 的启动
网络启动方式
14
7.1.2 Bootloader 的启动
诸如u-boot的BootLoader本身集成网络功能支持 这种方式开发板不需要配置较大的存储介质,跟无 盘工作站有点类似。但是使用这种启动方式之前, 需要把BootLoader安装到板上的EPROM或者 Flash中。BootLoader通过以太网接口远程下载 Linux内核映象或者文件系统。 BootLoader下载文件一般都使用TFTP网络协议, 还可以通过DHCP的方式动态配置IP地址。
3
7.1 Bootloader 简介
7.1.1 Bootloader 的概念 7.1.2 Bootloader 的启动 7.1.3 Bootloader 的种类
4
7.1.1 Bootloader 的概念
引入:对于计算机系统来说,从开机上电到操作系统 引入 启动需要一个引导过程。嵌入式Linux系统同样离不开 引导程序,这个引导程序就叫做BootLoader。 对比:回忆一下PC的体系结构我们可以知道,PC机中 对比 的引导加载程序由BIOS(其本质就是一段固件程序) BIOS 和位于硬盘MBR中的引导程序一起组成。
嵌入式操作系统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 设计与实现。
第7章 嵌入式Linux设备驱动程序开发(inode解释说明)PPT课件
//文件最后修改的时间
time_t
i_ctime;
//结点最后修改的时间
unsigned int
i_blkbits; //位数
unsigned long i_blksize; //块大小
unsigned long i_blocks;
//文件所占用的块数
unsigned long i_version; //版本号
struct address_space i_data;
//数据
struct dquot *i_dquot[MAXQUOTAS];
//索引结点的磁盘限额
struct list_head
i_devices;
//设备文件形成的链表
struct pipe_inode_info
*i_pipe; //指向管道文件
struct semaphore
i_sem;
//用于同步操作的信号量结构
第7章 嵌入式Linux设备驱动程序开发
struct semaphore
i_zombie;
//索引结点的信号量
struct inode_operations
*i_op; //索引结点操作
struct *i_fop; //指向文件操作的指针
loff_t *); ssize_t (*writev) (struct file *, const struct iovec *, unsigned long,
loff_t *); ssize_t (*sendpage) (struct file *, struct page *, int, size_t,
struct { struct module *owner; loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char *, size_t, loff_t *); ssize_t (*write) (struct file *, const char *, size_t, loff_t *); int (*readdir) (struct file *, void *, filldir_t); unsigned int (*poll) (struct file *, struct poll_table_struct *); int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned
3_4构建嵌入式linux系统-bootloader
00:19
Linux嵌入式操作系统 文全刚
26/69
U-boot的配置编译
• U-Boot 的源码是通过 GCC 和 Makefile 组织编译 的。 – 首先顶层 Makefile 设置开发板的定义; – 然后递归地调用各级子目录下的 Makefile; – 最后把编译生成的目标文件链接成U-Boot 映像。
构建嵌入式Linux系统-Bootloader
主讲教师:文全刚 wen_sir_125@
00:19
Linux嵌入式操作系统 文全刚
1/69
内容提要:
• Bootloader 介绍 • 实例分析Uboot • 实例分析Vivi
00:19
Linux嵌入式操作系统 文全刚
2/69
一. Bootloader 介绍
00:19
Linux嵌入式操作系统 文全刚
10/69
• 6.ViVi • Vivi 是韩国mizi 公司开发的bootloader, 适 用于ARM9处理器。 Vivi有两种工作模式: 启动加载模式和下载模式。启动加载模式 可以在一段时间后(这个时间可更改)自 行启动linux内核,这时vivi的默认模式。在 下载模式下,vivi为用户提供一个命令行接 口,通过接口可以使用vivi提供的一些命令。
• Stage2 的代码:
• 用C语言实现 • 可以实现更复杂的功能 • 具有更好的可读性和可移植性
00:19
Linux嵌入式操作系统 文全刚
14/69
Bootloader的stage1通常要完成以下 工作
• • • • • 硬件设备初始化 为加载bootloader本身准备内存空间 复制bootloader本身到内存 设置好堆栈 跳转到stage2的C入口点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8
7.1.2 Bootloader 的启动
嵌入式Linux系统也是通过Bootloader引导启动的。 一上电,就要执行Bootloader来初始化系统。 系统加电或复位后,所有CPU都会从某个地址开始 执行,具体的地址值是由处理器设计决定的。
比如,基于 ARM7TDMI core 的 CPU 在复位时通常都 从地址 0x00000000 取它的第一条指令。而基于ARM 处理器构建的嵌入式系统通常都有某种类型的固态存储 设备(比如:ROM、EEPROM 或 FLASH 等)被映射到这 个预先安排的地址上。因此在系统加电后,CPU将首先 执行Bootloader程序。
比如在一个基于ARM7TDMI core的嵌入式系统中, 系统在上电或复位时都从地址0x00000000开始执 行.而在这个地址处安排的通常就是系统的 BootLoader程序。
6
7.1.1 Bootloader 的概念
Bootloader的概念和功能
BootLoader是一段汇编代码,存放在MBR中,它 的主要作用就是将操作系统启动代码读入内存。 从功能上看,Bootloader就是在操作系统内核或用 户应用程序运行之前运行的一段小程序。通过这段 小程序可以初始化硬件设备、建立内存空间的映射 图,从而将系统的软硬件环境带到一个合适的状态, 以便为最终调用操作系统内核或用户应用程序准备 好正确的环境。
Bootloader 的种类
Bootloader Lilo Grub Loadlin ROLO Etherboot Linux BIOS Blob U-Boot Monitor 否 否 否 否 否 否 否 是 描述 Linux磁盘引导程序 GNU引导的Lilo替代程 序 从DOS引导Linux 从ROM引导Linux而不需 要BIOS 通过以太网卡启动Linux 引导程序 完全替代BUIS的Linux引 导程序 LART等硬件平台的引导 程序 通用引导程序 X86 是 是 是 是 是 是 否 是 ARM 否 否 否 否 否 否 是 是 PowerPC 否 否 否 否 否 否 否 是
16
7.1.2 Bootloader 的启动
Flash 启动方式
大多数嵌入式系统上都使用Flash存储介质,NOR Flash(线性Flash)使用最为普遍。 Bootloader一般放在Flash的底端或者顶端,这需要 根据处理器的复位向量来进行设置。 可以配置成MTD设备来访问Flash分区。
29
7.3.2 Bootloader 的使用
工作正常的时候,Bootloader处于加载模式或 者交换模式 如使用vivi的时候,其交互模式的界面是
30
Bootloader-举例
利用vivi升级内核
31
ห้องสมุดไป่ตู้
Bootloader-举例
利用vivi升级文件系统
32
作业
以U-Boot为代表总结BootLoader的工作原 理和使用方法,形成报告.
10
Bootloader-启动举例
11
Bootloader-启动举例
12
Bootloader-启动举例
13
7.1.2 Bootloader 的启动
网络启动方式
以太网连接 HOST BOOTP 内核映象 目标板文 件系统 TFTP NFS TARGET BIOS 启动内核
14
7.1.2 Bootloader 的启动
24
第七章 Agenda
7.1 Bootloader 简介 7.2 常用Bootloader 的介绍 7.3 Bootloader 的烧写和使用
25
7.3 Bootloader 的烧写和使用
7.3.1 Bootloader 的烧写 7.3.2 Bootloader 的使用
26
7.3.1 Bootloader 的烧写
27
Bootloader-举例
板子上没有任何东西(包括BootLoader)的时候, 需要专门的工具对vivi等BootLoader进行烧写
28
Bootloader-举例
板子上诸如vivi等BootLoader后,再进行升级,就可 以利用Target上已经存在的(旧的)BootLoader了
7
7.1.1 Bootloader 的概念
Bootlaoder的不统一性/不通用性
通常,BootLoader 是依赖于硬件而实现的,特别是在 嵌入式领域,为嵌入式系统建立一个通用的BootLoader 是很困难的。当然,我们可以归纳出一些通用的概念来, 以便我们了解特定BootLoader的设计与实现。当前在嵌 入式Linux系统中,有了一些流行和通用的Bootloader 框架。 现实开发中,我们都是采用现有的BootLoader进行修改 Vivi,blob,u-boot是最常见的,它们都是开源的 Vivi是三星公司的,我们的实验板子就是使用的它
15
7.1.2 Bootloader 的启动
磁盘启动方式
传统的Linux系统运行在台式机或者服务器上, 这些计算机一般都使用BIOS引导,并且使用磁 盘作为存储介质。 Linux传统上是通过Lilo(Linux Loader)引导 的,后来又出现了GNU的软件Grub(Grand Unified Bootloader)。这两种Bootloader广 泛应用在X86的Linux系统上。 在嵌入式系统领域应用的并不多。
22
7.2.2 U-Boot
U-Boot支持的处理器构架包括PowerPC , ARM , MIPS,x86 U-Boot的功能强大,涵盖了绝大部分处理器构架, 提供大量外设驱动,支持多个文件系统,附带调试、 脚本和引导等工具 U-boot可配置性非常强 ,它所支持的命令也可以通 过配置来增减。U-boot的命令主要包括以下几类: 信息类命令、环境变量类命令、存储器命令、 Flash专用命令、载类命令、启动类命令和Cache 类命令,参见表7.2
9
7.1.2 Bootloader 的启动
用户可以利用串口和Bootloader进行交互 Bootloader多数是两阶段的启动过程
第一个启动阶段是和硬件平台相关的,大都采用汇 编程序编写 第二个启动阶段是和硬件平台无关的,大都采用C 语言编写。
大多数Bootloader都包含两种不同的操作模式: 本地加载模式和远程下载模式。
Bootloader的烧写有两种方式:通过JTAG口 烧写和通过串口烧写。
在Flash被格式化且内存里也没有Bootloader的 时候,此时目标板是一个完全干净的开发板, 就需要通过JTAG口把Bootloader烧写到板子上 串口烧写主要用于更新和升级Bootloader。 在Windows下可以通过超级终端来访问目标板 来进行烧写,在Linux下可以通过MiniCom烧 写。
21
7.2.1 ARM boot
ARMboot是一个ARM平台的开源固件项目,它基 于PPCBOOT,已经与PPCBOOT 项目合并,新的 项目为U-Boot。 ARMboot支持的处理器构架有StrongARM、 ARM720T和PXA250 等 ARMboot的目标是成为通用的、容易使用和移植 的引导程序,非常轻便地运用于新的平台上。 ARMboot是GPL下的ARM固件项目中唯一支持 Flash闪存、BOOTP、DHCP和TFTP网络下载
33
End of Chapter 7
34
RedBoot
是
基于eCos的引导程序
是
是
是
19
第七章 Agenda
7.1 Bootloader 简介 7.2 常用Bootloader 的介绍 7.3 Bootloader 的烧写和使用
20
7.2 常用Bootloader 的介绍
7.2.1 ARM boot 7.2.2 U-Boot 7.2.3 Blob
17
7.1.3 Bootloader 的种类
嵌入式系统世界已经有各种各样的Bootloader, 种类划分的方法也不是唯一的。
一般可以按照它所支持处理器体系结构不同进行 划分。 具体参见表7.1 嵌入式比较常见的Uboot,vivi和blob PC系统上是grub和lilo
18
3
7.1 Bootloader 简介
7.1.1 Bootloader 的概念 7.1.2 Bootloader 的启动 7.1.3 Bootloader 的种类
4
7.1.1 Bootloader 的概念
引入:对于计算机系统来说,从开机上电到操作系统 启动需要一个引导过程。嵌入式Linux系统同样离不开 引导程序,这个引导程序就叫做BootLoader。 对比:回忆一下PC的体系结构我们可以知道,PC机中 的引导加载程序由BIOS(其本质就是一段固件程序) 和位于硬盘MBR中的引导程序一起组成。
诸如u-boot的BootLoader本身集成网络功能支持 这种方式开发板不需要配置较大的存储介质,跟无 盘工作站有点类似。但是使用这种启动方式之前, 需要把BootLoader安装到板上的EPROM或者 Flash中。BootLoader通过以太网接口远程下载 Linux内核映象或者文件系统。 BootLoader下载文件一般都使用TFTP网络协议, 还可以通过DHCP的方式动态配置IP地址。
BIOS在完成硬件检测和资源分配后,将硬盘MBR中的引导 程序读到系统的RAM中,然后将控制权交给引导程序。 引导程序的主要运行任务就是将内核映象从硬盘上读到RAM 中然后跳转到内核的入口点去运行,也即开始启动操作系统。
5
7.1.1 Bootloader 的概念
而在嵌入式系统中,通常并没有像BIOS那样 的固件程序。 因此整个系统的加载启动任务就完全由 BootLoader来完成.