BootLoader——嵌入式系统的引导加载程序

  • 一、BootLoader的简介
    • 1.1 BootLoader在固态存储设备中的位置
    • 1.2 BootLoader的启动过程
    • 1.3 BootLoader的操作模式
  • 二、BootLoader的启动过程
    • 2.1 BootLoader启动简介
    • 2.2 BootLoader启动的stage1
    • 2.3 BootLoader启动的stage2
  • 引导加载程序(BootLoader)是系统上电后运行的第一段代码,在嵌入式系统中,通常没有像PC体系结构的BIOS固态启动程序,因此嵌入式系统的加载启动任务是由BootLoader来完成的。例如,基于ARM core的嵌入式系统中,系统在启动时通常从地址0x00000000处开始执行,在这个地址存放的通常是系统的BootLoader程序。

一、BootLoader的简介

  • BootLoader是操作系统内核系统运行之前,需要首先运行的一段小程序,通过BootLoader程序,可以初始化硬件设备、建立内存空间的映射图,为调用操作系统内核做好环境准备。
  • 由于嵌入式系统硬件的多样性,且BootLoader与系统硬件具有密不可分的关系,因此,设计一个通用的Bootloader几乎是不可能的。然而,我们却可以归纳出一个通用的BootLoader概念,用以指导用户设计特定的BootLoader。

1.1 BootLoader在固态存储设备中的位置

  • 系统上电或复位后,所有的CPU通常从CPU预先指定的起始地址上读取指令,嵌入式系统通常将某种类型的固态存储设备(例如ROM、EEPROM、FLASH等)安排在这个起始位置。下图就是一个同时安装了BootLoader、内核启动参数、内核映射和跟文件系统映像的固态存储设备的典型空间分配结构。

1.2 BootLoader的启动过程

  • BootLoader的启动过程分为单阶段(Single Stage)和多阶段(Multi-Stage)两种。通常多阶段的BootLoader能够提供更为复杂的功能与更好的移植性。从固态存储设备上启动BootLoader通常经过两个阶段启动(分为stage1和stage2)。由于启动过程比较复杂,因此这两个步骤的启动过程放到下面进一步展开讨论。

1.3 BootLoader的操作模式

  • BootLoader通常包括两种操作模式:启动加载(Boot Loading)模式和下载模式(Down Loading)模式。
  • 1、启动加载模式
  • 启动加载模式也成为自主(Autonomous)模式,即BootLoader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行。这种模式是BootLoader的正常工作模式,因此嵌入式产品发布时,BootLoader应该工作该模式下。
  • 2、下载模式
  • 在该模式下,目标机上的BootLoader将通过串口连接或网络连接从主机(Host)上下载文件(通常包括内核映像与跟文件系统映像等)。从主机下载的文件通常首先被BootLoader保存到目标机(Target)的RAM中,最终被BootLoader载入到目标机的FLASH类固态存储设备中。在第一次安装内核、根文件系统时以及更新系统时两种情况下,BootLoader采用下载模式。

二、BootLoader的启动过程

2.1 BootLoader启动简介

  • 嵌入式系统的内核映像、根文件系统映像可以运行于RAM、ROM以及FLASH设备上,本文以加载到RAM上为例讨论BootLoader的启动过程。
  • 由于BootLoader的实现依赖于CPU的体系结构,并且通常分为两个阶段。其中,stage1通常对设备的代码进行初始化,并且通常是采用汇编语言实现的;而stage2通常采用C语言实现,以实现复杂功能,并可以使得代码具有很好的可读性与可移植性。BootLoader的stage1通常包括如下步骤:
#mermaid-svg-CwrdFYjw0hF8A35c .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-CwrdFYjw0hF8A35c .label text{fill:#333}#mermaid-svg-CwrdFYjw0hF8A35c .node rect,#mermaid-svg-CwrdFYjw0hF8A35c .node circle,#mermaid-svg-CwrdFYjw0hF8A35c .node ellipse,#mermaid-svg-CwrdFYjw0hF8A35c .node polygon,#mermaid-svg-CwrdFYjw0hF8A35c .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-CwrdFYjw0hF8A35c .node .label{text-align:center;fill:#333}#mermaid-svg-CwrdFYjw0hF8A35c .node.clickable{cursor:pointer}#mermaid-svg-CwrdFYjw0hF8A35c .arrowheadPath{fill:#333}#mermaid-svg-CwrdFYjw0hF8A35c .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-CwrdFYjw0hF8A35c .flowchart-link{stroke:#333;fill:none}#mermaid-svg-CwrdFYjw0hF8A35c .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-CwrdFYjw0hF8A35c .edgeLabel rect{opacity:0.9}#mermaid-svg-CwrdFYjw0hF8A35c .edgeLabel span{color:#333}#mermaid-svg-CwrdFYjw0hF8A35c .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-CwrdFYjw0hF8A35c .cluster text{fill:#333}#mermaid-svg-CwrdFYjw0hF8A35c div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-CwrdFYjw0hF8A35c .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-CwrdFYjw0hF8A35c text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-CwrdFYjw0hF8A35c .actor-line{stroke:grey}#mermaid-svg-CwrdFYjw0hF8A35c .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-CwrdFYjw0hF8A35c .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-CwrdFYjw0hF8A35c #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-CwrdFYjw0hF8A35c .sequenceNumber{fill:#fff}#mermaid-svg-CwrdFYjw0hF8A35c #sequencenumber{fill:#333}#mermaid-svg-CwrdFYjw0hF8A35c #crosshead path{fill:#333;stroke:#333}#mermaid-svg-CwrdFYjw0hF8A35c .messageText{fill:#333;stroke:#333}#mermaid-svg-CwrdFYjw0hF8A35c .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-CwrdFYjw0hF8A35c .labelText,#mermaid-svg-CwrdFYjw0hF8A35c .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-CwrdFYjw0hF8A35c .loopText,#mermaid-svg-CwrdFYjw0hF8A35c .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-CwrdFYjw0hF8A35c .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-CwrdFYjw0hF8A35c .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-CwrdFYjw0hF8A35c .noteText,#mermaid-svg-CwrdFYjw0hF8A35c .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-CwrdFYjw0hF8A35c .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-CwrdFYjw0hF8A35c .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-CwrdFYjw0hF8A35c .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-CwrdFYjw0hF8A35c .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CwrdFYjw0hF8A35c .section{stroke:none;opacity:0.2}#mermaid-svg-CwrdFYjw0hF8A35c .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-CwrdFYjw0hF8A35c .section2{fill:#fff400}#mermaid-svg-CwrdFYjw0hF8A35c .section1,#mermaid-svg-CwrdFYjw0hF8A35c .section3{fill:#fff;opacity:0.2}#mermaid-svg-CwrdFYjw0hF8A35c .sectionTitle0{fill:#333}#mermaid-svg-CwrdFYjw0hF8A35c .sectionTitle1{fill:#333}#mermaid-svg-CwrdFYjw0hF8A35c .sectionTitle2{fill:#333}#mermaid-svg-CwrdFYjw0hF8A35c .sectionTitle3{fill:#333}#mermaid-svg-CwrdFYjw0hF8A35c .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CwrdFYjw0hF8A35c .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-CwrdFYjw0hF8A35c .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CwrdFYjw0hF8A35c .grid path{stroke-width:0}#mermaid-svg-CwrdFYjw0hF8A35c .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-CwrdFYjw0hF8A35c .task{stroke-width:2}#mermaid-svg-CwrdFYjw0hF8A35c .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CwrdFYjw0hF8A35c .taskText:not([font-size]){font-size:11px}#mermaid-svg-CwrdFYjw0hF8A35c .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CwrdFYjw0hF8A35c .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-CwrdFYjw0hF8A35c .task.clickable{cursor:pointer}#mermaid-svg-CwrdFYjw0hF8A35c .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-CwrdFYjw0hF8A35c .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-CwrdFYjw0hF8A35c .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-CwrdFYjw0hF8A35c .taskText0,#mermaid-svg-CwrdFYjw0hF8A35c .taskText1,#mermaid-svg-CwrdFYjw0hF8A35c .taskText2,#mermaid-svg-CwrdFYjw0hF8A35c .taskText3{fill:#fff}#mermaid-svg-CwrdFYjw0hF8A35c .task0,#mermaid-svg-CwrdFYjw0hF8A35c .task1,#mermaid-svg-CwrdFYjw0hF8A35c .task2,#mermaid-svg-CwrdFYjw0hF8A35c .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-CwrdFYjw0hF8A35c .taskTextOutside0,#mermaid-svg-CwrdFYjw0hF8A35c .taskTextOutside2{fill:#000}#mermaid-svg-CwrdFYjw0hF8A35c .taskTextOutside1,#mermaid-svg-CwrdFYjw0hF8A35c .taskTextOutside3{fill:#000}#mermaid-svg-CwrdFYjw0hF8A35c .active0,#mermaid-svg-CwrdFYjw0hF8A35c .active1,#mermaid-svg-CwrdFYjw0hF8A35c .active2,#mermaid-svg-CwrdFYjw0hF8A35c .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-CwrdFYjw0hF8A35c .activeText0,#mermaid-svg-CwrdFYjw0hF8A35c .activeText1,#mermaid-svg-CwrdFYjw0hF8A35c .activeText2,#mermaid-svg-CwrdFYjw0hF8A35c .activeText3{fill:#000 !important}#mermaid-svg-CwrdFYjw0hF8A35c .done0,#mermaid-svg-CwrdFYjw0hF8A35c .done1,#mermaid-svg-CwrdFYjw0hF8A35c .done2,#mermaid-svg-CwrdFYjw0hF8A35c .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-CwrdFYjw0hF8A35c .doneText0,#mermaid-svg-CwrdFYjw0hF8A35c .doneText1,#mermaid-svg-CwrdFYjw0hF8A35c .doneText2,#mermaid-svg-CwrdFYjw0hF8A35c .doneText3{fill:#000 !important}#mermaid-svg-CwrdFYjw0hF8A35c .crit0,#mermaid-svg-CwrdFYjw0hF8A35c .crit1,#mermaid-svg-CwrdFYjw0hF8A35c .crit2,#mermaid-svg-CwrdFYjw0hF8A35c .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-CwrdFYjw0hF8A35c .activeCrit0,#mermaid-svg-CwrdFYjw0hF8A35c .activeCrit1,#mermaid-svg-CwrdFYjw0hF8A35c .activeCrit2,#mermaid-svg-CwrdFYjw0hF8A35c .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-CwrdFYjw0hF8A35c .doneCrit0,#mermaid-svg-CwrdFYjw0hF8A35c .doneCrit1,#mermaid-svg-CwrdFYjw0hF8A35c .doneCrit2,#mermaid-svg-CwrdFYjw0hF8A35c .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-CwrdFYjw0hF8A35c .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-CwrdFYjw0hF8A35c .milestoneText{font-style:italic}#mermaid-svg-CwrdFYjw0hF8A35c .doneCritText0,#mermaid-svg-CwrdFYjw0hF8A35c .doneCritText1,#mermaid-svg-CwrdFYjw0hF8A35c .doneCritText2,#mermaid-svg-CwrdFYjw0hF8A35c .doneCritText3{fill:#000 !important}#mermaid-svg-CwrdFYjw0hF8A35c .activeCritText0,#mermaid-svg-CwrdFYjw0hF8A35c .activeCritText1,#mermaid-svg-CwrdFYjw0hF8A35c .activeCritText2,#mermaid-svg-CwrdFYjw0hF8A35c .activeCritText3{fill:#000 !important}#mermaid-svg-CwrdFYjw0hF8A35c .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CwrdFYjw0hF8A35c g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-CwrdFYjw0hF8A35c g.classGroup text .title{font-weight:bolder}#mermaid-svg-CwrdFYjw0hF8A35c g.clickable{cursor:pointer}#mermaid-svg-CwrdFYjw0hF8A35c g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-CwrdFYjw0hF8A35c g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-CwrdFYjw0hF8A35c .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-CwrdFYjw0hF8A35c .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-CwrdFYjw0hF8A35c .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-CwrdFYjw0hF8A35c .dashed-line{stroke-dasharray:3}#mermaid-svg-CwrdFYjw0hF8A35c #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-CwrdFYjw0hF8A35c #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-CwrdFYjw0hF8A35c #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-CwrdFYjw0hF8A35c #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-CwrdFYjw0hF8A35c #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-CwrdFYjw0hF8A35c #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-CwrdFYjw0hF8A35c #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-CwrdFYjw0hF8A35c #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-CwrdFYjw0hF8A35c .commit-id,#mermaid-svg-CwrdFYjw0hF8A35c .commit-msg,#mermaid-svg-CwrdFYjw0hF8A35c .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CwrdFYjw0hF8A35c .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CwrdFYjw0hF8A35c .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CwrdFYjw0hF8A35c g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CwrdFYjw0hF8A35c g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-CwrdFYjw0hF8A35c g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-CwrdFYjw0hF8A35c g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-CwrdFYjw0hF8A35c g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-CwrdFYjw0hF8A35c g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-CwrdFYjw0hF8A35c .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-CwrdFYjw0hF8A35c .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-CwrdFYjw0hF8A35c .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-CwrdFYjw0hF8A35c .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-CwrdFYjw0hF8A35c .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-CwrdFYjw0hF8A35c .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-CwrdFYjw0hF8A35c .edgeLabel text{fill:#333}#mermaid-svg-CwrdFYjw0hF8A35c .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-CwrdFYjw0hF8A35c .node circle.state-start{fill:black;stroke:black}#mermaid-svg-CwrdFYjw0hF8A35c .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-CwrdFYjw0hF8A35c #statediagram-barbEnd{fill:#9370db}#mermaid-svg-CwrdFYjw0hF8A35c .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-CwrdFYjw0hF8A35c .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-CwrdFYjw0hF8A35c .statediagram-state .divider{stroke:#9370db}#mermaid-svg-CwrdFYjw0hF8A35c .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-CwrdFYjw0hF8A35c .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-CwrdFYjw0hF8A35c .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-CwrdFYjw0hF8A35c .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-CwrdFYjw0hF8A35c .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-CwrdFYjw0hF8A35c .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-CwrdFYjw0hF8A35c .note-edge{stroke-dasharray:5}#mermaid-svg-CwrdFYjw0hF8A35c .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-CwrdFYjw0hF8A35c .error-icon{fill:#522}#mermaid-svg-CwrdFYjw0hF8A35c .error-text{fill:#522;stroke:#522}#mermaid-svg-CwrdFYjw0hF8A35c .edge-thickness-normal{stroke-width:2px}#mermaid-svg-CwrdFYjw0hF8A35c .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-CwrdFYjw0hF8A35c .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-CwrdFYjw0hF8A35c .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-CwrdFYjw0hF8A35c .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-CwrdFYjw0hF8A35c .marker{fill:#333}#mermaid-svg-CwrdFYjw0hF8A35c .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-CwrdFYjw0hF8A35c {color: rgba(0, 0, 0, 0.75);font: ;}

硬件初始化
为加载BootLoader的stage2准备RAM空间
拷贝BootLoader的stage2到RAM空间中
设置好堆栈
跳到stage2的C语言入口点
  • stage2通常包括以下步骤:
#mermaid-svg-Uk1g1MICYp3z6a9u .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-Uk1g1MICYp3z6a9u .label text{fill:#333}#mermaid-svg-Uk1g1MICYp3z6a9u .node rect,#mermaid-svg-Uk1g1MICYp3z6a9u .node circle,#mermaid-svg-Uk1g1MICYp3z6a9u .node ellipse,#mermaid-svg-Uk1g1MICYp3z6a9u .node polygon,#mermaid-svg-Uk1g1MICYp3z6a9u .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-Uk1g1MICYp3z6a9u .node .label{text-align:center;fill:#333}#mermaid-svg-Uk1g1MICYp3z6a9u .node.clickable{cursor:pointer}#mermaid-svg-Uk1g1MICYp3z6a9u .arrowheadPath{fill:#333}#mermaid-svg-Uk1g1MICYp3z6a9u .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-Uk1g1MICYp3z6a9u .flowchart-link{stroke:#333;fill:none}#mermaid-svg-Uk1g1MICYp3z6a9u .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-Uk1g1MICYp3z6a9u .edgeLabel rect{opacity:0.9}#mermaid-svg-Uk1g1MICYp3z6a9u .edgeLabel span{color:#333}#mermaid-svg-Uk1g1MICYp3z6a9u .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-Uk1g1MICYp3z6a9u .cluster text{fill:#333}#mermaid-svg-Uk1g1MICYp3z6a9u div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-Uk1g1MICYp3z6a9u .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-Uk1g1MICYp3z6a9u text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-Uk1g1MICYp3z6a9u .actor-line{stroke:grey}#mermaid-svg-Uk1g1MICYp3z6a9u .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-Uk1g1MICYp3z6a9u .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-Uk1g1MICYp3z6a9u #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-Uk1g1MICYp3z6a9u .sequenceNumber{fill:#fff}#mermaid-svg-Uk1g1MICYp3z6a9u #sequencenumber{fill:#333}#mermaid-svg-Uk1g1MICYp3z6a9u #crosshead path{fill:#333;stroke:#333}#mermaid-svg-Uk1g1MICYp3z6a9u .messageText{fill:#333;stroke:#333}#mermaid-svg-Uk1g1MICYp3z6a9u .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-Uk1g1MICYp3z6a9u .labelText,#mermaid-svg-Uk1g1MICYp3z6a9u .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-Uk1g1MICYp3z6a9u .loopText,#mermaid-svg-Uk1g1MICYp3z6a9u .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-Uk1g1MICYp3z6a9u .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-Uk1g1MICYp3z6a9u .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-Uk1g1MICYp3z6a9u .noteText,#mermaid-svg-Uk1g1MICYp3z6a9u .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-Uk1g1MICYp3z6a9u .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-Uk1g1MICYp3z6a9u .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-Uk1g1MICYp3z6a9u .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-Uk1g1MICYp3z6a9u .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Uk1g1MICYp3z6a9u .section{stroke:none;opacity:0.2}#mermaid-svg-Uk1g1MICYp3z6a9u .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-Uk1g1MICYp3z6a9u .section2{fill:#fff400}#mermaid-svg-Uk1g1MICYp3z6a9u .section1,#mermaid-svg-Uk1g1MICYp3z6a9u .section3{fill:#fff;opacity:0.2}#mermaid-svg-Uk1g1MICYp3z6a9u .sectionTitle0{fill:#333}#mermaid-svg-Uk1g1MICYp3z6a9u .sectionTitle1{fill:#333}#mermaid-svg-Uk1g1MICYp3z6a9u .sectionTitle2{fill:#333}#mermaid-svg-Uk1g1MICYp3z6a9u .sectionTitle3{fill:#333}#mermaid-svg-Uk1g1MICYp3z6a9u .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Uk1g1MICYp3z6a9u .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-Uk1g1MICYp3z6a9u .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Uk1g1MICYp3z6a9u .grid path{stroke-width:0}#mermaid-svg-Uk1g1MICYp3z6a9u .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-Uk1g1MICYp3z6a9u .task{stroke-width:2}#mermaid-svg-Uk1g1MICYp3z6a9u .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Uk1g1MICYp3z6a9u .taskText:not([font-size]){font-size:11px}#mermaid-svg-Uk1g1MICYp3z6a9u .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Uk1g1MICYp3z6a9u .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-Uk1g1MICYp3z6a9u .task.clickable{cursor:pointer}#mermaid-svg-Uk1g1MICYp3z6a9u .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-Uk1g1MICYp3z6a9u .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-Uk1g1MICYp3z6a9u .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-Uk1g1MICYp3z6a9u .taskText0,#mermaid-svg-Uk1g1MICYp3z6a9u .taskText1,#mermaid-svg-Uk1g1MICYp3z6a9u .taskText2,#mermaid-svg-Uk1g1MICYp3z6a9u .taskText3{fill:#fff}#mermaid-svg-Uk1g1MICYp3z6a9u .task0,#mermaid-svg-Uk1g1MICYp3z6a9u .task1,#mermaid-svg-Uk1g1MICYp3z6a9u .task2,#mermaid-svg-Uk1g1MICYp3z6a9u .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-Uk1g1MICYp3z6a9u .taskTextOutside0,#mermaid-svg-Uk1g1MICYp3z6a9u .taskTextOutside2{fill:#000}#mermaid-svg-Uk1g1MICYp3z6a9u .taskTextOutside1,#mermaid-svg-Uk1g1MICYp3z6a9u .taskTextOutside3{fill:#000}#mermaid-svg-Uk1g1MICYp3z6a9u .active0,#mermaid-svg-Uk1g1MICYp3z6a9u .active1,#mermaid-svg-Uk1g1MICYp3z6a9u .active2,#mermaid-svg-Uk1g1MICYp3z6a9u .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-Uk1g1MICYp3z6a9u .activeText0,#mermaid-svg-Uk1g1MICYp3z6a9u .activeText1,#mermaid-svg-Uk1g1MICYp3z6a9u .activeText2,#mermaid-svg-Uk1g1MICYp3z6a9u .activeText3{fill:#000 !important}#mermaid-svg-Uk1g1MICYp3z6a9u .done0,#mermaid-svg-Uk1g1MICYp3z6a9u .done1,#mermaid-svg-Uk1g1MICYp3z6a9u .done2,#mermaid-svg-Uk1g1MICYp3z6a9u .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-Uk1g1MICYp3z6a9u .doneText0,#mermaid-svg-Uk1g1MICYp3z6a9u .doneText1,#mermaid-svg-Uk1g1MICYp3z6a9u .doneText2,#mermaid-svg-Uk1g1MICYp3z6a9u .doneText3{fill:#000 !important}#mermaid-svg-Uk1g1MICYp3z6a9u .crit0,#mermaid-svg-Uk1g1MICYp3z6a9u .crit1,#mermaid-svg-Uk1g1MICYp3z6a9u .crit2,#mermaid-svg-Uk1g1MICYp3z6a9u .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-Uk1g1MICYp3z6a9u .activeCrit0,#mermaid-svg-Uk1g1MICYp3z6a9u .activeCrit1,#mermaid-svg-Uk1g1MICYp3z6a9u .activeCrit2,#mermaid-svg-Uk1g1MICYp3z6a9u .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-Uk1g1MICYp3z6a9u .doneCrit0,#mermaid-svg-Uk1g1MICYp3z6a9u .doneCrit1,#mermaid-svg-Uk1g1MICYp3z6a9u .doneCrit2,#mermaid-svg-Uk1g1MICYp3z6a9u .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-Uk1g1MICYp3z6a9u .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-Uk1g1MICYp3z6a9u .milestoneText{font-style:italic}#mermaid-svg-Uk1g1MICYp3z6a9u .doneCritText0,#mermaid-svg-Uk1g1MICYp3z6a9u .doneCritText1,#mermaid-svg-Uk1g1MICYp3z6a9u .doneCritText2,#mermaid-svg-Uk1g1MICYp3z6a9u .doneCritText3{fill:#000 !important}#mermaid-svg-Uk1g1MICYp3z6a9u .activeCritText0,#mermaid-svg-Uk1g1MICYp3z6a9u .activeCritText1,#mermaid-svg-Uk1g1MICYp3z6a9u .activeCritText2,#mermaid-svg-Uk1g1MICYp3z6a9u .activeCritText3{fill:#000 !important}#mermaid-svg-Uk1g1MICYp3z6a9u .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Uk1g1MICYp3z6a9u g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-Uk1g1MICYp3z6a9u g.classGroup text .title{font-weight:bolder}#mermaid-svg-Uk1g1MICYp3z6a9u g.clickable{cursor:pointer}#mermaid-svg-Uk1g1MICYp3z6a9u g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-Uk1g1MICYp3z6a9u g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-Uk1g1MICYp3z6a9u .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-Uk1g1MICYp3z6a9u .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-Uk1g1MICYp3z6a9u .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-Uk1g1MICYp3z6a9u .dashed-line{stroke-dasharray:3}#mermaid-svg-Uk1g1MICYp3z6a9u #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Uk1g1MICYp3z6a9u #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Uk1g1MICYp3z6a9u #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-Uk1g1MICYp3z6a9u #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-Uk1g1MICYp3z6a9u #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Uk1g1MICYp3z6a9u #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Uk1g1MICYp3z6a9u #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Uk1g1MICYp3z6a9u #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-Uk1g1MICYp3z6a9u .commit-id,#mermaid-svg-Uk1g1MICYp3z6a9u .commit-msg,#mermaid-svg-Uk1g1MICYp3z6a9u .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Uk1g1MICYp3z6a9u .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Uk1g1MICYp3z6a9u .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Uk1g1MICYp3z6a9u g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Uk1g1MICYp3z6a9u g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-Uk1g1MICYp3z6a9u g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-Uk1g1MICYp3z6a9u g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-Uk1g1MICYp3z6a9u g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-Uk1g1MICYp3z6a9u g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-Uk1g1MICYp3z6a9u .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-Uk1g1MICYp3z6a9u .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-Uk1g1MICYp3z6a9u .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-Uk1g1MICYp3z6a9u .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-Uk1g1MICYp3z6a9u .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-Uk1g1MICYp3z6a9u .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-Uk1g1MICYp3z6a9u .edgeLabel text{fill:#333}#mermaid-svg-Uk1g1MICYp3z6a9u .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-Uk1g1MICYp3z6a9u .node circle.state-start{fill:black;stroke:black}#mermaid-svg-Uk1g1MICYp3z6a9u .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-Uk1g1MICYp3z6a9u #statediagram-barbEnd{fill:#9370db}#mermaid-svg-Uk1g1MICYp3z6a9u .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-Uk1g1MICYp3z6a9u .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-Uk1g1MICYp3z6a9u .statediagram-state .divider{stroke:#9370db}#mermaid-svg-Uk1g1MICYp3z6a9u .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-Uk1g1MICYp3z6a9u .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-Uk1g1MICYp3z6a9u .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-Uk1g1MICYp3z6a9u .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-Uk1g1MICYp3z6a9u .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-Uk1g1MICYp3z6a9u .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-Uk1g1MICYp3z6a9u .note-edge{stroke-dasharray:5}#mermaid-svg-Uk1g1MICYp3z6a9u .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-Uk1g1MICYp3z6a9u .error-icon{fill:#522}#mermaid-svg-Uk1g1MICYp3z6a9u .error-text{fill:#522;stroke:#522}#mermaid-svg-Uk1g1MICYp3z6a9u .edge-thickness-normal{stroke-width:2px}#mermaid-svg-Uk1g1MICYp3z6a9u .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-Uk1g1MICYp3z6a9u .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-Uk1g1MICYp3z6a9u .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-Uk1g1MICYp3z6a9u .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-Uk1g1MICYp3z6a9u .marker{fill:#333}#mermaid-svg-Uk1g1MICYp3z6a9u .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-Uk1g1MICYp3z6a9u {color: rgba(0, 0, 0, 0.75);font: ;}

初始化本阶段需要使用的硬件设备
检测系统内存映射
将内核映像与根间映像从FLASH载入到RAM中
为内核设置启动参数
调用内核

2.2 BootLoader启动的stage1

1、基本硬件初始化

  • BootLoader一开始就执行基本硬件初始化,其目的是为stage2执行以及kernel的执行的执行准备好基本的硬件环境。基本硬件初始化包括以下步骤:
  • (1)屏蔽所有中断:BootLoader的执行过程不必响应任何中断,为中断提供服务通常是操作系统驱动程序的责任。中断的屏蔽可以通过写CPU的中断屏蔽寄存器活状态寄存器来完成。
  • (2)设置CPU的速度和时钟频率。
  • (3)RAM初始化:正确地设置系统内存控制器的功能寄存器。
  • (4)初始化LED系统指示灯:通过GPIO来驱动LED系统指示灯,以表明系统的状态是正常的。
  • (5)关闭CPU内部指令/数据cache。
  • 2、为加载stage2准备RAM空间
  • 为了获得更快的执行速度,通常把stage2加载到RAM空间中执行,因此必须为加载BootLoader的stage2准备一段可用的RAM空间范围。为了便于表述,这里将RAM空间范围大小标记为:是stage2_size(字节),并把起始地址与终止地址分别标记为:stage2_start与stage2_end(这两个地址均以4字节边界对齐):
stage2_end=stage2_start+stage2_end
  • 另外,必须确保所安排的地址范围确定是可读写的RAM空间,并且需要对所安排的地址范围进行测试。具体测试方法为:以memory page(4K的倍数)作为测试单位,测试每个memory page开始的两个字是否可读写,为了便于后续的描述,将这种测试算法叫做test_mempage,其具体步骤如下:
  • (1)首先保存memory page开始的两个字的内容。
  • (2)向这两个字中写入任意的数字(比如0x12,0x13)。
  • (3)立刻将这两个字的内容读回,如果读回的内容为0x12,0x13,则说明这个memory page所占据的地址范围是一段有效的RAM空间,否则不是。
  • (4)恢复这两个字的原始内容,测试完毕。
  • 3、拷贝stage2到RAM中
  • 拷贝时需要确定两点:第一,stage2的可执行映像在固态存储设备的起始地址与终止地址;第二,RAM空间的起始地址。
  • 4、设置堆栈指针sp
  • 堆栈指针的设置是为执行C语言代码做好准备。
  • 执行完以上四个步骤后,系统的物理内存布局如下图所示:
  • 5、跳转到stage2的C语言入口点
  • 至此,就可以跳转到BootLoader的stage2去执行了,在ARM系统中,通过修改PC寄存器指向合适的地址来实现跳转。

2.3 BootLoader启动的stage2

  • 在该阶段,与普通C语言应用程序不同,在编译与连接BootLoader程序时,不能使用glibc库的任何支持函数。BootLoader启动过程中的stage2打流程如下所示:
  • 1、初始化本阶段需要使用的硬件设备
  • 首先许需要点亮系统指示LED等,这表明系统已经进入main()函数,并进而初始化至少一个串口,以便和终端用户进行I/O输出信息;还需要初始化计时器等硬件设备。初始化阶段完成后,系统就可以输出一些打印信息、程序名称字符串、版本号等。
  • 2、检测系统的内存映射(memory map)
  • 内存映射就是指在整个4GB物理地址空间中那些地址范围被分配以用作寻址系统的RAM单元。在具体的嵌入式系统中,CPU通常会预留处足够大的地址空间给RAM,而不一定预留全部的RAM地址空间。因此,BootLoader的stage2需要检测整个系统内存映射情况,划分清楚CPU预留的全部RAM地址空间中那些被真正映射到RAM地址单元,那些处于“unused”状态。
  • 3、加载内核映像与根文件系统映像
  • 内存映像与根文件系统映像的加载包括规划内存占用的布局与从FLASH上拷贝两个步骤:
  • (1)规划内存占用的布局
  • 结合系统物理内存分布,规划内存布局的主要内容包括两个方面:第一,内核映像所占用的内存范围;第二,根文件系统所占用的内存范围。在规划内存占用的布局时,主要考虑基地址与映像大小两个方面。
  • 对于内核映像,一般将其拷贝到从MEM_START+0x8000这个基地址开始的1MB的内存范围内(嵌入式Linux的内核一般都小于1MB)。这样就空出了从MEM_START到MEM_START+0x8000这段32KB大小的内存空间,在Linux内核中,这32KB的内存空间通常防止一些全局数据结构,如启动参数与内核页表等。
  • 对于根文件系统映像,通常将其拷贝到MEM_START+0x00100000开始的地方,如果采用的是Ramdisk作为根文件系统映像,解压后的大小通常是1MB。
  • (2)从FLASH上拷贝
  • 对于ARM嵌入式系统,CPU通常在统一的内存地址空间中寻址FLASH固态存储设备,并从FLASH上读取数据。通常,用一个简单的循环就可以完成从FLASH设备上拷贝映像的工作:
while(count){*dest++ = *src++; /* they are all aligned with word boundary */count -= 4; /*byte number 8/
};

4、设置内核的启动参数

  • 在将内核映像与根文件系统映像拷贝到RAM空间后,就可以准备启动Linux内核了。但是在启动内核之前,通常需要根据需求,设置Linux内核的启动参数。
  • 在Linux 2.4x版本以后,通常以标记列表(tagged list)形式来传递内核启动参数。启动参数标记列表以标记ATAG_CORE开始,以标记ATAG_NONE结束,每个标识包括内核启动参数的tag_header结构与参数结构,数据结构tag与tag_header定义在Linux内核源码的“include/asm/setup.h”头文件中。其中,BootLoader设置的常用启动参数包括ATAG_CORE、ATAG_MEM、ATAG_CMDLINE、ATAG_RAMDISK、ATAG_INITRD等。
    5、调用内核
  • BootLoader调用Linux内核的方法是直接跳转到内核的第一条处,即直接跳转到MEM_START+0x8000地址处。在跳转时,应该满足以下条件:
  • (1)CPU寄存器的设置:R0=0;R1=机器类型ID;R2=启动参数标记列表在RAM中的起始基地址。
  • (2)CPU模式:必须禁止中断IRQs与FIQs;CPU必须处于SVC模式。
  • (3)cache与MMU的设置:MMU必须关闭;指令cache可以打开也可以关闭;数据cache必须关闭。

BootLoader——嵌入式系统的引导加载程序相关推荐

  1. cwyw不是有效的加载项_ADAS/AD开发09 - UDS与引导加载程序

    本文属于ADAS控制器开发系列.以智能前视摄像头模块为基础. 前言 引导加载程序,即Bootloader(简称BL),是ECU的基本模块,实现方式也很多. 本文介绍的Bootloader刷写功能的下载 ...

  2. 【技术分享】如何解锁高通骁龙660上的安卓引导加载程序

    本文是我们在DEF CON 29大会上的演示视频的配套文章,视频的链接地址为https://www.youtube.com/watch?v=z4gIxdFfJDg. 要想在安卓手机上获得root权限, ...

  3. 如何配置Ubuntu 16.04 GRUB 2引导加载程序

    正如你所知,GRUB 2 是大多数 Linux 操作系统的默认引导加载程序.GRUB 是 GRand Unified Bootloader 的缩写,它是 Linux 启动时首先要加载的一个程序,此后它 ...

  4. 搞一下TDA4 | 03 TDA4 辅助引导加载程序SBL

    前言 本系列请点击:<搞一下TDA4> 所有系列请点击:<汽车电子系列分享> 本文档将介绍如何在处理器SDK TDA4(RTOS/Linux) 中理解辅助引导加载程序SBL 全 ...

  5. 一加3t运行linux,【漏洞分析】获取已锁定的OnePlus 3/3T:引导加载程序漏洞

    翻译:胖胖秦 预估稿费:120RMB 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 前言 在这篇博文中,我公开了OnePlus 3/3T引导加载程序中的两个漏洞.第一个CVE- ...

  6. 引导加载程序之争: LILO 和 GRUB

    在不考虑他们的工作或专业情况下,所有 Linux 用户都会使用的是哪个工具?引导加载程序.通过本文了解引导加载程序的工作原理,认识两个流行的引导加载程序 LILO(LInux LOader)和 GNU ...

  7. Linux加载Linux的引导程序,Linux的引导-引导加载程序:LILO和GRUB

    打开计算机时,计算机执行存储在ROM中的引导代码,这些代码接下来尝试确定如何加载并启动内核.内核检测系统的硬件,然后产生系统的init进程,这个进程总是PID 1. 在出现登录提示符以前,要完成几项工 ...

  8. 备份linux分区到usb,将Linux引导加载程序备份到USB的方法

    本文介绍如何将Linux引导加载程序备份到USB以应对紧急情况.大多数Linux操作系统使用的引导加载程序称为Grub,这是一个简单的工具,可以配置为在PC启动时从菜单启动Linux发行版以及其他操作 ...

  9. Z-Wave 700应用程序框架第七章 - 固件更新和引导加载程序

    本节的目的是描述如何生成和管理固件更新映像. ZW700 SDK附带三个引导加载程序映像. 一个是FG14模块的OTW图像. 这个引导加载程序只适用于运行SerialAPI的FG14设备. 另外两个引 ...

最新文章

  1. c语言n1=(n2=(n3=0)),计算机二级C语言考试选择题(带答案)
  2. jmu-python-凯撒密码加密算法_7-30 jmu-python-凯撒密码加密算法 (10 分)
  3. linux 下编写.sh文件,不间断执行某文件
  4. python 没有了matlab的fscanf功能,我该怎么办
  5. 卓越管理的秘密(Behind Closed Doors)
  6. qscrollbar 固定滑块大小_五金模具设计:通用滑块结构形式!模具滑块的设计标准!值得收藏...
  7. FCKeditor使用方法技术详解
  8. Nvidia CUDA初级教程4 GPU体系架构概述
  9. DP学习之USACO货币系统
  10. Android通过post请求发送一个xml,解析返回xml数据
  11. LVDS 屏 format
  12. jQuery ajaxSubmit 自动重复提交表单问题解决
  13. 高清加载具体(如清明上河图)
  14. Ubuntu安装过程之磁盘分区图文教程
  15. 运筹系列63:使用ALNS求解大规模TSP问题
  16. 编译超频Android内核,安卓超频工具apk下载
  17. 谈谈浏览器中富文本编辑器的技术演进
  18. 通过宝塔面板,定时清除Docker日志空间
  19. GitHub官方出手,一针见血。Spring Boot趣味实战手册来袭(彩版)
  20. [响应式布局]响应式布局技巧

热门文章

  1. Js 加载事件(onload) 可以作用的标签
  2. 如何用 Minio SDK 访问滴滴云对象存储
  3. 20162316刘诚昊 第五周作业
  4. 最近做code review的5点经验分享
  5. PC端无线连接打印机
  6. Kindle4RSS - 好用的Kindle RSS新闻文章推送服务
  7. Java 并发编程解析 | 如何正确理解Java领域中的多线程模型,主要用来解决什么问题?
  8. 通过DIVA了解APP安全问题
  9. SSM+栾城五中的图书管理 毕业设计-附源码171727
  10. shp文件转3dtitle