Bootloader概述

Bootloader概述为了加深对 Bootloader 的理解 特转载此文章 http blog chinaunix net uid 24951403 id 2212588 htmlBootload 中文解释为启动引导程序可以工作在无操作系统的环境下 也可以工作在有操作系统的环境下在无操作系统环境下 通常表现为 与应用程序编译在一起 在应用程序之前运行的一段代码 一般由汇

为了加深对Bootloader的理解,特转载此文章。

http://blog.chinaunix.net/uid-24951403-id-2212588.html



Bootloader:中文解释为启动引导程序

可以工作在无操作系统的环境下,也可以工作在有操作系统的环境下

在无操作系统环境下:

通常表现为:与应用程序编译在一起,在应用程序之前运行的一段代码,一般由汇编编写

完成节基本硬件及对战的初始化,为应用程序做准备

人们通常说的bootloader一般特指在操作系统下:

在操作系统运行之前运行的一段或多段程序

初始化硬件设备、建立系统的内存空间映射图,将系统的软件硬件环境带到一个合适的状态,为调用操作系统内核准备好正确的环境

把操作系统内核映像加载到RAM中,并将系统控制权交给它

Bootloader的种类非常的繁多

针对不同的cpu架构对bootloader的要求不同

针对X86上有LILOGRUBntloader

针对ARM架构的有u-bootviviarmboot

针对ppc架构的有ppcboot

针对不同的操作系统也有所不同:

比如专门用来启动linuxvivi

启动Winceeboot、启动eCosereboot,可以启动多种操作系统的u-boot

下表将一些常用bootloader做简单对比介绍

Bootloader Monitor 描述 X86 ARM

LILO  Linux磁盘引导程序  

GRUB  GNULILO替代程序  

Loadlin  DOS引导Linux  

ntldr   x86上引导windowsNT系列  

armboot  专门为arm架构设计的boot  

ppcboot  专门设计用来引导基于ppc架构操作系统的loaderu-boot前身  

U-Boot  通用引导程序,支持多种CPU架构、多种操作系统引导  

RedBoot  基于eCos的引导程序  

vivi  Mizi公司针对SAMSUNGARM CPU设计的引导程序  

下面我们以ntldrgrub为例讲解一下在PC机上windowsXPlinux是如何引导起来的

无论windows还是linux都是采用多阶段引导方式从大的角度分为:硬件+软件

硬件部分由固化在PC主板上的BIOS完成

    windowslinux完全一致

软件部分由安装在硬盘的bootloader完成

linux常用LILOGRUB

windows有引导2000\XP\2003系列的ntloader

   引导vistawin7系列的Bootmgr

首先介绍一下BIOS的相关知识:

BIOS是固化在计算机主板上一个芯片,里面固化着我们常说的bios程序

bioscpu开机启动时首先被启动

bios读取CMOS中的配置参数,完成硬件检测(内存、CPU、显卡、鼠标等)、中断初始化等工作

cmos也是主板上的一块芯片,保存了bios的一些配置及硬件检测信息,采用ram结构,掉电丢失需要电池供电

最终bios根据启动选项读取硬盘MBR分区(0柱面0磁头1扇区)上的引导程序,完成第二阶段引导过程

Bios程序一般固化在EEROMFLASH中,掉电不丢失数据,可以使用特定的软件进行升级、更新

系统开机时可以通过特定按键(delF2等)启动“系统设置程序”(我们常见的蓝色屏幕)进行基本功能设置

设置完成后结果会保存在cmos中,cmos采用ram电路构成,由主板上的一个电池供电,保证信息不丢失

目前市面上较流行的主板BIOS主要有 Award BIOSAMI BIOSPhoenix BIOS三种类型

绝大多数台式机都采用的Award BIOS,笔记本上一半采用Phoenix BIOS较多

Bios最后一阶段会读取硬盘0柱面0磁头1扇区上程序完成后续初始化,此分区称为MBR分区,由三部分组成:共512字节

主引导程序:446个字节

负责从活动分区中装载、运行系统引导程序

硬盘分区表(DPT):64个字节

记录了硬盘中分区的数量以及每一分区的大小

  每个分区占16个字节,最多只能有4个主分区

第三部分是magic number,占2个字节,固定为55AA

MBR主引导代码扫描硬盘分区表,找到一个可引导分区

(活动分区)

将该分区的第一个扇区读到内存,并将控制转移给它

此分区被称为“引导分区”,引导分区的第一个扇区称为“引导扇区”,引导扇区上运行着软件引导的第二部分(OBR

windowsNT系列为例,假如我们在C盘下安装了windows xp,系统安装时会自动在MBR分区、引导分区安装相应的软件程序

MBR主引导程序找到了活动分区C

然后执行C盘(0柱面1磁头1扇区)上的引导程序OBR(操作系统引导扇区)

OBR找到c盘目录下的NTLDR引导程序并加载,NTLDR读取BOOT.ini文件显示引导项

最后加载系统内核

Linux下常见的引导程序有两种,LILOGRUB

LILO是历史比较悠久、功能比较强大的一款bootloader,在linux刚开始时就已经出现

GNU GRUB(简称“GRUB”)是一个来自GNU项目的多操作系统启动程序,逐渐已经代替了的LILO的地位

GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统

不但可以引导linux还可以windows

GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数

GRUB引导linuxwindows的引导过程有些类似

MBR分区安装主引导程序(grub第一阶段代码)

  (会覆盖windows分区写入的信息)

在引导分区安装grub第二阶段代码

此阶段代码会寻找配置文件(menu.lst),根据menu.lst的列表启动操作系统

(windowslinux均可以引导)

如果menu.lst损坏或按下了特定按键,可以进入一个命令行接口,由用户手动操作引导操作系统

在专用的嵌入式系统上运行GNU/Linux系统已经变得越来越流行

一个嵌入式Linux系统从软件的角度看通常可以分为四个层次:

   引导加载程序:

      BootLoader(一般仅由软件部分组成)

Linux内核:

  特定于嵌入式系统的定制内核以及内核启动参数

文件系统:

  根文件系统和建立于Flash内存设备之上文件系统

用户应用程序:

  特定于用户的应用程序

嵌入式领域通常Bootloader对硬件的依赖性非常强,建立一个通用的Bootloader几乎是不可能的

Bootloader依赖于CPU体系结构,不同的CPU架构,如armx86mips等要求的启动配置不同

基于同一架构的不同芯片,例如同样基于ARM920TS3C2410S3C2440,要求配置不同

基于同一芯片设计的不同开发板,由于外设资源的不同,同样需要修改配置

Bootloader还依赖于内核的具体格式与类型:

如压缩、非压缩内核,nandnor启动的内核等

因此bootloader的移植与修改工作就是围绕以上几点进行的

从最终用户的角度看,Bootloader的作用就是加载操作系统

对于开发人员来说,Bootloader包含两种不同的操作模式:启动加载模式和下载模式

启动加载(Boot loading)模式:

BootLoader从目标机上某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入

      在嵌入式产品发布时,BootLoader工作在此模式

下载(Down loading)模式:

    开发人员可以使用各种命令,通过串口连接或网络连接等通信手段从主机下载文件。比如:下载应用程序、数据文件、内核映像等

       BootLoader的这种模式通常在系统更新时使用

Bootloader的安装地址

嵌入式系统一般采用统一编址方式管理数据/程序区,同时使用三总线进行寻址

系统加电复位后,所有的CPU通常都从某个CPU制造商预先安排的地址上取指令,如基于ARM核的CPU通常从0x00000000取它的第一条指令

嵌入式系统通常都有某种类型的固态存储设备(如ROMFLASH)被映射到这个预先安排的地址上

Bootloader被烧写到其中,所以在系统加电后,CPU将首先执行Bootloader程序

Bootloader启动方式:

   基于以上原理,bootloader提供了多种启动方式:NOR启动、nand启动、SD卡启动、网络启动、DRAM启动等

NOR FLASH启动:

NOR FLASHintel公司推出的一款总线型FLASH存储器

NOR FLASH一般安装在总线0x0000000xXX地址范围内,并且将bootloader烧写在NOR0x00000000地址上

当系统复位时就可以执行NORFLASH上的bootloader、内核、根文件

有些芯片有内置的FLASH芯片,如atmel系列

有些芯片需要外置FLASH芯片,如三星系列等

NOR FLASH可以片上执行应用程序,但是速度、大小都受到限制,一般在一些简单系统中比较多

     很多bootloader采用NOR FLASH中存储、ram中运行的方式引导系统,即将bootloader烧写在NOR FLASH中,最终还要读入ram中运行

NAND FLASH启动:

NAND是由东芝率先推出,得到各大厂商广泛支持的一种大容量FLASH,在U盘、SD卡等数据存储中大量应用

NAND FLASHNOR FLASH不同,采用的非总线接口,不能通过总线寻址,不支持片上执行,因此需要进行一步中转读入SDRAM才可以运行

SD卡启动

FLASH必须固化在板子上,烧写、编程需要专门的工具,因此在一些最新的CPU中,如三星的6410提供了一种新型的启动方式,将bootloader烧入SD中,进行设备的引导与启动

NAND启动类似,SD卡也不是采用总线结构,也需要进行过渡启动

我们以S3C2440s3c6410为例讲解以上启动过程

S3C2440采用总线结构管理片上外设及内存,存储器管理器提供访问外部存储器的所有控制信号

27位地址信号、32位数据信号、8个片选信号、以及读/写控制信号等

总共有8个存储器bankbank0bank7)共1GB

s3c2440支持两种启动方式:

NOR FLASH启动

  代码直接写入NOR FLASH,运行时直接在NOR上运行

NAND FLASH启动方式

  代码烧到NAND FLASH中,借助片内4Ksram,将代码由NAND FLASH烤到SDRAM中,在SDRAM中运行

Bootloader的启动过程启动过程可以分为单阶段(Single Stage)、多阶段(Multi-Stage)两种:

通常多阶段的Bootloader能提供更为复杂的功能,以及更好的可移植性

从固态存储设备上启动的Bootloader大多都是两阶段的启动过程

第一阶段使用汇编来实现,它完成一些依赖于 CPU体系结构的初始化,并调用第二阶段的代码

第二阶段则通常使用C语言来实现,完成与体系结构无关的功能,这样可以实现更复杂的功能,而且代码会有更好的可读性和可移植性

Bootloader第一阶段的功能:

硬件设备初始化

屏蔽所有的中断

设置 CPU 的速度和时钟频率

mem初始化:

  包括正确地设置系统的内存控制器的功能寄存器以及各内存库控制寄存器等

初始化LED或串口:

通过GPIO来驱动LED或串口,用来做调试信息输出

拷贝Bootloader的第二阶段代码到RAM空间中

简单NAND FLASH读取驱动

设置好栈,为第二阶段

跳转到第二阶段代码的C入口点

Bootloader第二阶段的功能:

初始化本阶段要使用到的硬件设备

MTD设备驱动初始化

uart、电源、时钟初始化

网卡、USB设备、SD卡等设备初始化

初始化软件环境:

堆空间的初始化

Bootloader私有数据初始化,例如vivimtd分区表信息、串口传输协议,u-boot环境变量等

提供一个命令行模式:进行下载更新等工作

将内核映像从Flash上读到RAM空间中

调用内核

压缩内核、非压缩内核

在开发过程中Bootloader各功能的实现通常需要人的介入,因此bootloader需要提供一定的通信方式进行信息与数据的交换

Bootloader与主机进行信息交互:

   通常会通过串口来进行信息的交互,例如:输出打印信息到串口,从串口读取用户控制字符等

Bootloader与主机进行数据交互

   最基本会通过串口连接,文件传输协议通常是xmodem/ymodem/zmodem/kermit协议中的一种

      很多bootloader会提供网络、usbsd发等硬件设备进行大量数据的传输

      网络一般基于dhcptftpnfs等协议,sd卡一般基于fat文件系统等

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218727.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午11:36
下一篇 2026年3月17日 下午11:36


相关推荐

  • Integer对象范围

    Integer对象范围Integerinteg newInteger 10 Integerinteg newInteger 10 System out println integer integer1 falseInteger 127 Integerb 127 System out println a b true Integera1 128

    2026年3月18日
    2
  • Eurake注册中心

    Eurake注册中心 eureka找到了 有了服务端server用于服务注册与发现,系统中其他的微服务使用客户端client链接服务端,并且维持心跳连接,server端会不断的检查client端是否存活,心跳检测,健康检查,负载均衡功能eureka.client.fetch-registry=false一个服务可以即是…

    2022年6月11日
    43
  • navicat15万能激活码-激活码分享

    (navicat15万能激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlFZP9ED60OK-eyJsa…

    2022年4月1日
    2.2K
  • 什么是高维数据可视化的降维方法_数据降维具体算法有哪几种

    什么是高维数据可视化的降维方法_数据降维具体算法有哪几种  t-SNE是目前来说效果最好的数据降维与可视化方法,但是它的缺点也很明显,比如:占内存大,运行时间长。但是,当我们想要对高维数据进行分类,又不清楚这个数据集有没有很好的可分性(即同类之间间隔小,异类之间间隔大),可以通过t-SNE投影到2维或者3维的空间中观察一下。如果在低维空间中具有可分性,则数据是可分的;如果在高维空间中不具有可分性,可能是数据不可分,也可能仅仅是因为不能投影到低维空间。

    2022年8月31日
    3
  • java四舍五入保留小数「建议收藏」

    java四舍五入保留小数「建议收藏」//方式一:doublef=3.1516;BigDecimalb=newBigDecimal(f);doublef1=b.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue(); //方式二:newjava.text.DecimalFormat("#.00").format(3.1415926);//#.00表示两位小数…

    2022年5月30日
    34
  • 通读音_Android API

    通读音_Android API所谓工欲善其事,必先利其器,所以通读了cheerio的API,顺便翻译了一遍,有些地方因为知道的比较少,不知道什么意思,保留了英文,希望各位不吝告诉我,然后一起把这个翻译完成。###cheerio为服务器特别定制的,快速、灵活、实施的jQuery核心实现.###Introduction将HTML告诉你的服务器varcheerio=require(‘cheerio’),$

    2025年6月21日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号