精华内容
下载资源
问答
  • 深入理解bootloader_1—– bootloader的初步概念1、引言 bootloader就是在操作系统内核运行之前运行的一小段程序。通过这个小程序我们主要完成下面几个内容: 1)初始化硬件设备。 2)建立内存空间的映射。 3)...

    深入理解bootloader_1—– bootloader的初步概念

    1、引言

     bootloader就是在操作系统内核运行之前运行的一小段程序。通过这个小程序我们主要完成下面几个内容:
    

    1)初始化硬件设备。
    2)建立内存空间的映射。
    3)创建内核需要的一些信息,并将这些信息通过相关机制,传递个给内核。
    4)将系统的软硬件环境设置成一个合适的状态。
    5)为最终调用操作系统内核准备好正确环境,真正起到引导和加载内核的作用。
    在嵌入式系统,通常没有PC 中BIOS那样的固件程序,因此整个系统的加载启动就完全由bootloader来完成。Bootloader 是CPU 上电后运行的第一段程序。不同的CPU 体系结构有不同的bootloader,有些bootloader支持多种体系结构的CPU,比如U-Boot就同时支持ARM和MIPS体系结构。除了依赖于CPU 的体系结构外,Bootloader实际上也依赖于具体的嵌入式版级设备的配置。也就是两块不同的嵌入式版,即使他们是基于同一种CPU而建,但是要想让运行在一块板子上的bootloader也运行到另一块板子上,通常个需要修改Bootloader源程序。因此每款Bootloader都是独一无二的,但我们可以总结开发或者维护Bootloader的一些背景知识,掌握这些背景知识就能够融会贯通。
    我们以ARM体系结构为参考要想掌握Bootloader起码要掌握下面一些知识:
    1)熟悉Linux的的开发环境,shell,make工程管理工具的使用。
    2)掌握ARM体系结构,指令集,独特的寻址方式。
    3)计算机的编译和链接。
    4)熟练掌握对U-Boot代码的 分析。

    2、Bootloader的角色

    当一个嵌入式开发板上电时,即使执行最简单的程序,都要初始化很多硬件。每种体系结构、处理器都有一组预定义的动作和配置,他们包含从单板的存储设备获取初始化代码的功能。最初的初始化代码是Bootloader的一部分,它负责启动处理器和相关硬件设备。
    上电复位时,大多数处理器都有一个获取第一条指令的默认初始地址。硬件设计人员利用该信息来进行存储空间的布局。这样以来,上电的时候,可从一个通用的已知地址获取代码,然后建立软件的控制。
    Bootloader提供初始化代码,并初始化单板,这样就可以执行其他程序,最初的初始化程序都是给体系结构下汇编语言写成的。在初始化相应的硬件信息之后,Bootloader会u引导完整的操作系统,他会定位加载操作系统,并将控制权交给操作系统。与传统的PC-BIOS不同,当操作系统获取控制权之后,嵌入式下
    的Bootloader将不复存在。

    3、不同体系下的BootLoader

    这里写图片描述

    文献参考:

    抄录自 《深入理解BoorLoader》 胡尔佳 编著(学习笔记仅作学习,交流,详细阅读请购买正版)

    展开全文
  • 深入了解bootloader

    2010-03-31 20:11:49
    详细的讲解了,bootloader 有例子程序讲解
  • 深入理解bootloader_3----- ARM体系结构

    千次阅读 2017-05-26 14:01:43
    深入理解bootloader_3—– ARM体系结构

    深入理解bootloader_3—– ARM体系结构

    1、ARM 简介

    ARM 是一款RISC 处理器,因此他集成了一下典型的RISC架构的特性。
    1)、数量很多的通用寄存器。
    2)、使用load/store的体系结构操作寄存器的数据,而不是直接操作内存中的数据。
    3)、简单的寻址模式,所有的load/store地址都由寄存器内容和指令格式决定。
    4)、采用统一的固定的指令格式来简化指令的代码。
    5)、在绝大多数数据处理指令中包含算数逻辑和移位逻辑,最大化的有效利用ALU和移位寄存器。
    6)、使用自增或自减的地址模式来优化程序循环处理。
    7)、load/store 指令都可以条件执行,从而提高指令的执行效率。
    8)、几乎所有的指令都可以条件执行,从而提高执行效率。

    2、处理器的模式

    ARM处理器支持表1中的7种处理器模式:

    这里写图片描述

    通过软件操作及外部的中断或一场处理可以切换模式。
    大多数应用程序在用户模式下执行。当处理器处于用户模式时,正在执行的程序不能访问保护的系统资源和切换模式,除非有异常产生。操作系统正式利用这个特性来控制系统资源使用的。
    除用户模式其他的模式都是特权模式。他们可以完全访问资源和自由切换模式,其中的5种又称为异常模式:
    1)FIQ
    2)IRQ
    3)Supervisor
    4)Abort
    5)Underfined
    当发生特定的异常时,机器就会进入相应的模式中。每一个模式都有额外的寄存器使其不影响原先的用户模式状态。
    最后一种模式是系统模式,他不是由异常进入的,而是与用户模式有完全的一样的寄存器。但他还是一种特权模式,并没有用户模式的限制。这种模式在操作系统任务需要访问系统资源,但是不希望使用其他一场模式的而外寄存器时使用。

    3、异常

    ARM 定义了7种异常类型,每种类型都有齐特权处理模式,这7种异常类型是:
    1)重启异常
    2)未定义指令异常
    3)软中断异常
    4)预取中止异常
    5)数据中止异常
    6)中断异常
    7)快速中断异常
    由内部源或外部源产生的异常引起的处理器处理一个事件,比如外部产生的中断或者试图执行一个未定义的指令。处理异常之前的处理器模式通常会保存,这样当异常处理完成后就会恢复原先的程序。同一时间可以出现多个异常。
    ARM 体系结构支持7种异常,表2列出了异常类型和对应的处理器的模式,当异常发生时,程序强制跳转到异常对应的地址。这些固定的地址称为异常向量。
    这里写图片描述

    当异常发生时,一些寄存器就由一场模式下的相应寄存器取代。所有异常模式都有替代的寄存器R13和R14。快速中断模式还有用于快速中断处理的额外的寄存器。
    当进入异常处理的程序时,R14保存异常处理的返回值。
    R13为每种异常处理保存私有的栈指针,快速中断模式还有自己的R8~R12可用,所以中断处理程序无须备份这些寄存器。
    第六种特权处理模式—–系统模式也是使用用户模式的寄存器。它用于运行需要访问存储系统和协助处理器权限的任务。

    4、ARM 寄存器

    ARM 处理器共有37 个寄存器:
    1)31个通用寄存器:包括一个程序计数器在内。这些寄存器是32位大小的。
    2)6个状态寄存器:这些寄存器同样是32位大小的,但是只有32位中的部分会分配或者需要执行。
    所有的寄存器编排为有部分重叠的分组,由当前的处理器模式决定使用那个分组。在任何时候,15个通用寄存器(R0~R14),一个或两个状态寄存器和程序计数器是可见的。图3
    所示的 是每一列显示指定处理器模式下的那些通用寄存器和状态寄存器是可见的。

    这里写图片描述

    5、通用寄存器

    通用寄存器R0~R15可以分为如下三组:
    1)为分组的寄存器:R0~R7
    2)分组的寄存器:R8~R14
    3)R15:PC

    6、为分组的寄存器:R0~R7

    寄存器R0~R7是未分组寄存器。它们中的每个在所有的处理模式下都是相同的32 位物理寄存器。他们是完全的通用寄存器,没有被处理器架构定义的特殊用途。

    7、分组的寄存器:R8~R14

    寄存器R8 ~R14 是分组寄存器。他们中的每一个代表的物理寄存器依赖于当前的处理器模式。当使用一个通用寄存器时,几乎所有的指令都可以使用这些分组寄存器。
    寄存器 R8~R12中的每一个都是两个物理寄存器:一组用于FIQ模式,另一组用于其他处理器模式。第一组可以用R8_fiq-R12_fiq表示。另一组用R8_usr-R12_usr表示。
    寄存器R8~R12在体系中没有任何制定的特殊目的。然而,在简单的中断处理中需要使用r8~R14
    ,FIQ模式下的寄存器允许更快速的中断处理。
    寄存器R13和R14都有6个分组物理寄存器,其中一个用于在user和system模式下,允许5个用在5种异常模式下。当需要区分时,也可以使用如下格式命名:
    R13_
    R14_
    其中mode是:usr、svc、abt、und、irq、fiq。
    寄存器R13通常用作栈指针。简写为SP。每一种异常模式都有自己的分组寄存器R13。
    寄存器R14(链接寄存器或者LR)在体系结构中有两种用途:
    1)在各种模式下,R14用来保存子程序返回地址,当一条BL或BLX指令执行子程序调用时,R14设为子程序的返回地址。通过复制R14中的地址值到PC中,来实现子程序的返回。
    2)当发生异常时,相关异常模式下的R14就设为异常返回地址。异常的返回和子程序的返回类似,使用指令回复异常发生前的程序状态。
    在其他情况下寄存器R14可以当作通用寄存器使用。

    8、寄存器R15:程序计数器

    R15是程序计数器(PC),其内容是处理器要取的下一条指令的地址。在ARM状态,所有的ARM指令都是4字节长,一直都是字对齐的。这意味着PC的最低两位一直都是0,因此PC只包含30位可变的位。ARM体系中的一些版本支持其它两种处理器状态。T 变种支持Thumb状态,J 变种支持Jazelle状态。这些状态下PC可以是半字节和字节对对齐的。

    9、程序状态寄存器

    当前程序寄存器(CPSR)在所有处理器模式下都是可以访问的,它包括条件标志位、中断禁止位、当前处理器模式控制以及其他状态和控制位。每种异常模式都有一个程序状态寄存器(SPSR),当异常发生时用于保存CPSR的值。
    注意:User模式和System模式都不是一场模式,在User模式和System模式下读写SPSR都会引起不可预料的结果。
    CPSR和SPSRs的格式如图4所示:

    这里写图片描述

    10、PSR位的类型

    按照更新方式PSR位可以分为四类:
    预留位: 为将来的扩展预留
    用户可写位: 在任意模式下可写。N、Z、C、V、Q、GE[3:0]和E位都是用于可写的。
    特权位: 在特权状态下可写。用户模式下写特权没有效果。A、I、F和M[4:0]都是特权位。
    执行状态位: 在特权模式下可写。用户模式下写执行状态位没有效果。J和T位都是执行状态位,在ARM状态下一直为0.

    11、条件标志位

    条件标志位
    N、Z、C、V位称为条件标志位。几乎所有的指令都会测试CPSR中的条件标志位来决定是否执行指令。
    条件标志位由以下两种方式修改:
    1)执行比较指令(CMN、CMP、TEQ、TST)
    2)执行一些其他的算数、逻辑或移动指令、并且他们的目的寄存器不是R15。
    不管哪种情况,新的标志位含义如下:
    N 设为指令结果的第31位,如果结果当做二进制补码表示的有符号整形,N=1 表示结果是负的; N=0 表示结果是非负的。
    Z 指令结果是0的情况下设为1,反之设为0.
    C 由如下四种方式设置:
    1)对于加法,包括比较指令CMN,如果加法运算产生无符号溢出,C设为1,反之设为0.
    2)对于减法,包括比较指令CMP,如果减法产生一个错位,C设为0,反之设为1.
    3)对于包含移位操作的非加减运算,C设为移位器移出的最后一位。
    4)对于其他的非加减运算,C通常保持不变。
    V 由如下两种方式设置:
    1)在两个二进制补码的有符号的加法和减法指令运算,如果发生符号溢出,V设为1.
    2)对于非加法和减法运算,V通常是不变的。

    这些标志位还可以通过如下方式修改:
    1)执行MSR指令,向CPSR或SOSR中写入新值。
    2)执行目的寄存器是R15的MRC指令。该指令的目的是将协处理器产生的条件标志位传到ARM处理器中。
    3)执行LDM指令的某些变种指令。这些变种指令会复制SPSR的值到CPSR中。他们主要用于异常返回。
    4)在特权模式下执行RFE指令可以从内存中向CPSR中加载新值。
    5)执行目的寄存器是R15的算数逻辑指令的设置标志位的 变种指令。他们也可以复制SPSR的值到CPSR中,用于异常返回。

    12、中断禁止位

    A、I、F都是中断禁止位:
    A 位 只在ARM v6以及以上版本使用。
    I 位 设置后禁止IRQ中断
    F位 设置后禁止FIQ中断

    13、模式位

    M[4:0]是模式位。他们决定了处理器运行的模式。见表5:

    这里写图片描述

    不是模式位的所有组合都定义一个有效的处理器模式,只有上面这些组合才可以使用。如果向M[4:0]中写入其他的值,结果是不可预料的。

    文献参考:

    抄录自 《深入理解BoorLoader》 胡尔佳 编著 (学习笔记仅作学习,交流,详细阅读请购买正版)

    展开全文
  • 深入理解bootloader_2 —– Linux开发环境

    深入理解bootloader_2 —– Linux开发环境

    1、编辑器vim 简介

    1.1、常用命令

    1)yy 复制
    2)p 粘贴
    3)dd 删除
    4)u 撤销
    5)/* 向下查找
    6)?* 向上查找
    7):%s/old/new/g 用new替换整篇的old
    :#,#s/old/new/g 用new 替换从第#行到第#行出现的old

    2、编译器GCC和交叉编译器

    2.1、GCC的编译器流程

    当我们使用编译器编译程序时: gcc test.c ,生成可执行文件 a.out
    然而,上述一条命令可以分为四个步骤,分别是预处理、编译、汇编、和链接
    第一步:预处理的过程相当一下命令(-E 表示只能进行预编译):
    gcc -E test.c -o test.i
    预处理的主要作用就是通过预处理的内建功能对一个资源进行等接交换。最常见的比如文件包含、条件编译、宏替换。
    第二步:对预编译处理的文件进行一系列的词法分析、语法分析、语义分析以及生成相应的汇编代码文件,这个过程是整个程序构建的核心过程,也是最复杂的部分。类似编译命令:
    gcc -S test.i -o test.s

    第三步:汇编器将汇编代码转化成机器码,每一个汇编语句都对应着机器指令,汇编过程用如下的命令:
    gcc -c test.s -o test.o
    第四步:链接是编译的最后一个阶段,他将各个目标文件链接起来,生成可执行的文件,其命令如下:
    gcc test.o -o test

    2.2、交叉编译器

    在一种计算机环境中运行的编译程序,能够编译出另一种环境中运行的代码,我们就称这种编译器为交叉编译。简单的说就是在一个平台上生成另一个平台上的可执行代码。有的平台受硬件配置等限制,可以在高配置平台下编译,然后将可执行文件出入到相应平台下。

    3、脚本和常用命令

    3.1、find命令

    1)find -iname Abc fprint file 查找包含abc的文件,并且把它输入到file文件中。
    find -name ap* -o -name may* 查找以ap或者以may开头的文件。
    3)find /mnt -name tom.txt -ftype vfat 在/mnt下查找名称为tom.txt 且文件系统类型为vfat的文件。
    4)find /mnt -name tom.txt !-ftype vfat 在/mnt下查找名称为tom.txt 且文件系统类型不为vfat的文件。
    5)find /tmp -name wa* -type l 在/tmp下查找名为wa开头且类型为符号链接的 文件。
    6)find /home -mtime -2 在home下查找最近两天改动过的文件。
    7)find /home -user cnscn 列出/home目录下属于用户cnscn的 文件或目录。
    8)find /home -gid 501 列出/home组内ID 为501的 文件或目录。
    9)find /home -size +512k 查找大于512KB的文件
    10) find /home -size -512k 查找小于512KB的文件

    3.2、grep 命令

    1)grep -nir “abc” 在当前目录所有 文件中查找abc ,不区分大小写。
    2)grep “abc” uboot.lds 在uboot.lds 中查找abc

    文献参考:

    抄录自 《深入理解BoorLoader》 胡尔佳 编著 (学习笔记仅作学习,交流,详细阅读请购买正版)

    展开全文
  • Bootloader的简单理解

    2021-01-29 13:58:26
    系统上电之后,需要一段代码来初始化,为所有的代码运行搭建环境,可以将操作系统内核复制到内存中运行,我们称这段代码为Bootloader. Bootloader的启动方式 1.启动加载模式:上电后,Bootloader从板子上某块存储...

    系统上电之后,需要一段代码来初始化,为所有的代码运行搭建环境,可以将操作系统内核复制到内存中运行,我们称这段代码为Bootloader.

    Bootloader的作用(2种模式)

    1.启动加载模式:上电后,Bootloader从板子上某块存储设备上将操作系统加载到RAM运行。比如我们拿到一台装好了操作系统的电脑。系统启动先从C盘将操作系统加载出来到RAM运行。完成这个功能的代码就叫Bootloader。

    2.下载模式:开发人员通过串口网络等通信手段从PC下载文件,将文件放在内存运行或是烧录到Flash中。

    • 典型例子

    又比如单片机:我们下载程序到板子上,1.上电烧录:当单片机的烧录口检测到启动信号(电脑点了下载),于是进入下载模式:其实是通过St-link或者USB转TTL将代码(可执行hex/bin文件)发给单片机,但此时单片机收到文件后,通过Bootloader这段代码将收到的文件依次拷贝到FLASH规定的位置,直到拷贝结束。2.掉电重启:此时烧录口没有启动信号,不进入下载模式,进入正常运行模式运行代码。

    • 小结:BootLoader是板子上电的第一部分运行的代码,它可用来烧录文件,也可为我们写的代码搭建好环境。

    Bootloader的两个阶段

    (1)第一阶段:

    硬件设备初始化(关闭Watchdog,关中断)

    为加载bootloader第二阶段代码准备好RAM空间。

    复制Bootloader第二阶段代码到RAM。

    设置好栈

    跳到第二阶段代码入口点

    (2)第二阶段

    初始化硬件设备(比如初始化串口,用于下载模式的人机交互)

    检测系统内存映射(memory map)(即确定板上用了多少内存,它们的地址空间是什么)

    将内核映像和根文件系统(Linux系统能够运行所需的必要库,程序等等)从Flash读到RAM空间。

    为内核启动设置参数

    调用内核

    展开全文
  • ARM 指令集分为以下几个大类:数据处理指令、分支指令、软中断指令、程序状态寄存器指令、协处理器指令、加载常量的伪...抄录自 《深入理解BoorLoader》 胡尔佳 编著 (学习笔记仅作学习,交流,详细阅读请购买正版)
  • Bootloader详解

    千次阅读 2019-02-20 23:02:01
    Bootloader基本认识 每一种不同的CPU系统结构都有不同的BootLoader,除了依赖于CPU的体系结构外,Bootloader还依赖于具体的嵌入式板级设备的配置,比如板卡的硬件地址分配,外设芯片的类型等。也就是说,对于两块...
  • Bootloader 的作用是加载linux kernel 镜像(包括linux kernel source code 的镜像+ Ramdisk 镜像), 一般在u-boot 的bootloader 的commandlist 中使用loadkernel 命令。 之后就是boot 命令启动linux kernel, 这...
  • [原创]自己动手编写嵌入式Bootloader之(1).pdf
  • bootloader bootloader的实现与分析.pdf
  • 深入嵌入式系统的 BootLoader

    千次阅读 2016-02-25 15:01:06
    一、简介  ... 本文将从 BootLoader 的概念、BootLoader 的主要任务、BootLoader 的框架结构以及 BootLoader 的安装等四个方面来讨论嵌入式系统的 BootLoader。   引导加载程序 。包括固化在固件
  • 深入理解Uboot

    2019-06-28 16:27:25
    转自:https://blog.csdn.net/kernel_yx/article/details/53045424
  • 此文针对是对bootloader有一定理解,汽车应用行业,有一定的汇编基础,图文并茂,深入浅出,有助于关键点理解
  • BootLoader开发经验谈

    千次阅读 2010-03-05 14:21:00
    本文不会介绍Bootloader的结构功能和启动流程等信息,如果读者对Windows CE的Bootloader不甚了解,希望补充这方面的知识,可以参考其他书籍。 1. Bootloader开发难点分析 (1) 硬件初始化: 当硬件上电之后,运行的第...
  • 阅读英文原版,可以很好的理解作者的思路。作此笔记备忘2,一直以来学习LINUXkernel的知识缺乏系统化,借对这本书的学习,系统化的学习一下LINUX kernel。3,自己一直在做一个toosmall,toosimple的单进程,特权模式...
  • bootloader启动过程分析

    2013-03-31 21:07:33
    本文详细讲解了bootloader启动过程,对深入理解bootloader和对自己写bootloader有很大帮助。
  • 起初读了书的第一/二章后,学到了以前一直没有理解的几个问题。在这里记录一下:  这段文字誊抄书中原文,看起来就像干活:  关于本书的内容,这里再多说几句。首先,组件(或插件) 是用来使用的,而架构思想...
  • iOS BootLoader详解

    千次阅读 2018-11-09 15:36:55
    目录 Pre-Introduction – EFI Pre-Introduction – NVRAM Pre-Introduction – Ramdisk...BootLoader Introduction BootLoader Process 正文 1. Pre-Introduction – EFI EFI(Extensible Firmware Inte...
  • 深入MTK平台bootloader启动之【 lk -> kernel】分析笔记

    万次阅读 多人点赞 2016-11-05 22:18:23
    接上一篇分析: 《深入MTK平台bootloader启动之【 Pre-loader -> Lk】分析笔记》 Pre-loader 运行在ISRAM,待完成 DRAM 的初始化后,再将lk载入DRAM中,最后通过特殊sys call手段实现跳转到lk的执行入口,正式进入...
  • 接上一篇分析: 《深入MTK平台bootloader启动之【 Pre-loader -> Lk】分析笔记》 Pre-loader 运行在ISRAM,待完成 DRAM 的初始化后,再将lk载入DRAM中,最后通过特殊sys call手段实现跳转到lk的执行入口,正式...
  • STM32 Bootloader原理和设计

    千次阅读 2017-07-18 16:44:57
    接下来所介绍的Bootloader就可以完成这项工作,通过Bootloader引导程序完成固件的升级。下面来浅析STM32 Bootloader设计。 首先谈谈stm32的ISP和IAP区别和联系。 ISP(In-System Programming)在系统可编程,...
  • 深入理解init 1.1 概述 init 是一个进程,确切地说,它是Linux 系统中用户空间地第一个进程。由于Android 是基于Linux 内核的,所以init 也是Android 系统中用户空间的第一个进程,它的进程号是1。它的主要指责为...
  • 嵌入式 Linux 系统从软件角度看可以分为四个部分:引导加载程序(bootloader),Linux 内核,文件系统,应用程序。 BootLoader是与系统硬件环境高度相关的初始化软件,它负责初始化硬件和引导操作系统的双重责任。其...
  • 深入研究S3C2440 bootloader

    千次阅读 2013-11-15 14:34:16
    bootloader的实现方法:  首先:在汇编中初始化堆栈,中断向量表,MMU,时钟,串口等,然后跳到C语言的Main函数。这部分代码小于4K,放在block0。这个Main函数用来将第二段代码拷备到DRAM中并执行。  其次:进入...
  • 文章目录Bootloader启动流程分析Bootloader第一阶段的功能硬件设备初始化为加载 Bootloader的第二阶段代码准备RAM空间(初始化nandflash)复制 Bootloader的第二阶段代码到SDRAM空间中(重定位)设置好栈跳转到第二...
  • STM32 BOOTLOADER

    千次阅读 2019-01-20 09:51:14
    接下来所介绍的Bootloader就可以完成这项工作,通过Bootloader引导程序完成固件的升级。下面来浅析STM32Bootloader设计。 首先谈谈stm32的ISP和IAP区别和联系。 ISP(In-System Programming)在系统可编程,指电路...
  • bootloader烧写

    千次阅读 2015-02-06 23:46:02
    关于bootloader,先简要地总结一下。经过了第一个阶段的学习,对bootloader有了一个整体的认识,其实把它当作一个功能单元就可以了,职责就是完成从硬件加电到操作系统内核运行之前的所有工作,这些工作包括硬件检测...
  • 这里就需要了解一点编译链接原理跟memory 布局的东东, 这个实际上是指memory中的一个只读数据段的起始&结束地址区间, 它定义在这个文件中: ./lk/arch/arm/system-onesegment.ld:47: __apps_start = . ; ....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,440
精华内容 1,776
关键字:

深入理解bootloader