嵌入式之旅之bootloader介绍


一个嵌入式系统从软件角度来看分为三个层次:

  1. 引导加载程序
    包括固化在固件(firmware)中的boot程序(可选),和BootLoader两大部分。
  2. Linux内核
    特定于嵌入式平台的定制内核
  3. 文件系统
    包括了系统命令和应用程序。

BootLoader概念

BootLoader 就是在操作系统运行之前运行的一段小程序。通过这段小程序,可以初始化硬件设备,从而将系统的软硬件系统带到一个合适的状态,以便为最终调用操作系统做好准备。

为什么需要进行 bootloader 移植?

  1. 每种不同的CPU体系结构都有不同 BootLoader。除了依赖于CPU的体系结构外,BootLoader 还依赖于具体的嵌入式板级设备的配置,比如板卡的硬件地址分配,外设芯片的类型等。
  2. 这就是说,对于两块不同的开发板而言,即使它们是基于同一种CPU而搭建的,但如果它们的硬件资源或配置不一致的话,要想在一块开发板上运行的 BootLoader 程序也能在另一块板子上运行,还是需要修改。

BootLoader 的启动流程

BootLoader 的启动过程可分为单阶段(Single-Stage)和多阶段(Multi-Stage)两种,通常的 BootLoader 具有更复杂的功能,更好的可移植性。从固态存储设备上启动的 BootLoader 大多采用两阶段,即启动过程可以分为 stage1 和 stage2:stage 1完成初始化硬件,为 stage2 准备内存空间,并将 stage2 复制到内存中,设备堆栈,然后跳转到stage 2.

stage 1通常包括以下步骤:

  • 硬件设备初始化
  • 为加载 BootLoader 的stage 2 准备RAM空间
  • 拷贝 BootLoader 的stage 2 到RAM空间
  • 设置好堆栈
  • 跳转到 stage 2 的 C 入口点

stage 2通常包括以下步骤:

  • 初始化本阶段要使用到的硬件设备
  • 将内核映像和根文件系统映像从 flash 上读到 RAM 中
  • 调用内核

bootloader概述

bootloader 分为boot + loader

  • boot目的:
    跳转到C语言中
    (1)关闭看门狗,关闭中断,关闭MMU和CACHE
    (2)配置系统工作时钟
    (3)配置SDRAM控制器(行地址数,列地址数,多少块,周期性的充电)
    (4)让sp(栈指针)指向可读可写的设备区间中,满足递减栈的规则,SDAM —
    —用哪些模式,就要初始化哪些模式下的SP
    —每个模式的值不能覆盖其他模式。
    (5)代码搬移:执行速度问题,把程序从存储器(nor-flash)搬移到快速的内存;
    只把存储器的一部分代码执行出来,把存储在其他位置上的代码搬移到内存,对应存储器的控制器的初始化;
    (6)bl main
  • loader目的:
    执行应用逻辑,点灯,uart,load linux kernel

创建接口的开发工程

  • Makefile
    1.通用Makefile,支持SD卡启动和uboot下直接运行ram
    (1)程序运行时地址不同
    DDR2:0x20000000
    SD:0x0
    (2)SD 16KB 需要加一个头信息,校验
    RAM:不需要加头信息
    2.变量集合
    IARGET:DEP 目标:依赖
    COMMAND 命令

【课程简介】本课程是《Armv8/Armv9架构从入门到精通 第二期》中的第四章。建议购买大课程。本课程以为armv8-aarch64、armv9为基准,不涉及armv7及其以前的版本,也不涉及aarch32。本课程包含但不限于以下内容MMU的基础学习:啥是MMU?工作原理?MMU和cache之间的关系?及其怎样相互影响的?哪些是MMU硬件自动的行为?哪些是软件可配置的行为?地址空间基础:啥是虚拟地址空间?啥是物理地址空间?啥时memory-map? 代码程序中的虚拟地址空间是怎样的?arm core硬件决定的物理地址空间是怎样的?SOC memory-map时的地址空间是怎样的?具体的外设又是怎样的地址空间?Translation Regime:系统里有多少个MMU?系统里有多少个Translation Regime?他们之间的关系是怎样的?页表翻译:MMU是怎样翻译的?页表有几级?这些信息是怎么告诉MMU的,MMU又是怎样工作的,软件又需要怎样设计?stage1和stage2的区别和使用?Descriptor:啥是Descriptor、页表项、entry、条目、页表条目? Descriptor的格式是怎样的?每一个属性位是怎样的?MMU除了完成地址转换,属性权限的控制/cache的缓存策略是怎样配置的?optee中使用MMU的示例MMU深度思考篇:开启MMU瞬间可能出现的问题以及多种常用的解决方案。注意这里提到的是多种方案,绝大多数人只知道第一种,除此之外还有没有其它的设计方式? MMU关闭时cache的缓存策略会怎样?【思考】01、一个大系统中有多少个MMU ?02、一个ARM Core中有多少个Translation regime?03、EL1&0 Translation regime Stage2、EL2 Translation regime stage1、EL2&0 Translation regime stage1 这三者的区别是什么?04、TTBR1_EL2寄存器有啥特殊性,这个寄存器是给谁使用的?05、有没有TTBR1_EL3寄存器?为什么?06、什么是memory-map? 一个ARM的系统中,有几套物理地址空间?07、页表到底有几级? 页表最少可以有几级?页表最多可以有几级?08、页表有多大? 页表存放在哪里?页表由谁来管理?09、页表是否能放在cache中?10、什么是Translation Table walk? 什么是TLB?11、请简述页表查询的过程?12、在一个大系统中,物理地址是多少位的? 物理地址是多少位指的是什么?虚拟地址又是多少位的? 物理地址的位数和虚拟地址的位数都是由谁来决定的?13、请说明entry、descriptor、页表项、条目 这个四个词汇的由来?14、TCR中有缓存属性和共享属性、页表的entry中也有缓存属性和共享属性,这俩有什么区别?15、请简述TTBR0和TTBR1的概念和意义?16、请简述cacheability和shareability属性的含义?17、stage1和stage2有何区别?18、stage1和stage2的descriptor中,有很多重复的属性,当两者属性有冲突了怎么办?19、L1、L2、L2的descriptor中也有部分相同的属性,重复时怎么办?20、Descriptor的格式有哪几种?21、Descriptor的类型有哪几种?22、简述您所观察到的系统软件中(操作系统或hypervisor)的shareability和cacheability一般都是怎样配置的?23、开启一个MMU的步骤是怎样的?24、啥是flat map? 啥是full level table?25、页表中的AF属性位、DBM属性位分别是干啥的?26、页表中的nG属性位是干啥的?27、页表中的Contiguous属性位是干啥的?28、在开启MMU的瞬间会考虑哪些事情?【课程目录】当前21节课,6.8小时
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值