第七章 嵌入式Linux的BootLoader

合集下载

嵌入式系统中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系统启动分析

嵌入式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技术

嵌入式Linux应用编程模块二:安装嵌入式BootLoader技术
.modules)。
上一页 下一页 返回
任务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

嵌入式系统的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软件设计

嵌入式课件之——第7章_嵌入式Linux软件设计
第 7 章
嵌入式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章 嵌入式Linux软件设计——bootloader
21
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

嵌入式系统设计-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的基本作用,在后续的文章中我将对如何编写自己的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以及硬件系统。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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来完成.
相关文档
最新文档