0%

芯片的启动和bootLoader

bootloader

8086芯片

  • reset引脚跳变的时候
  • CS(代码段寄存器)和IP(指令指针寄存器)分别初始化为0xffff0x0000,组合成一个20位的长度地址,再从这个地址跳转到其他地址

    ARM芯片

  • picture 1
  • PC直接复位到0地址,然后从中断向量表的Reset位置获取下一步跳转的地址
  • 直接将代码搬运到内存中执行
  • 之后再以此为基础运行别的代码
  • 出场写好的,用于启动用户软件的软件称为boot ROM

    修改这部分代码

  • picture 2
    • 大部分芯片是用外部电路手动配置的方式
    • 拨码开关的信号会被记录下来控制部分启动信息
    • 对于电脑而言就是BIOS

      二次至多次引导代码(bootloader)

  • 一般bootloader是说这个

    为什么需要

  • boot rom不够灵活
  • 用户可控bootloader
  • MCU
    • 单核或者多核同构
    • 主频小于1GHz
    • 没有MMU
    • 最多运行RTOS
    • picture 3
    • 程序运行基本都是NOR Flash
      • 有分离的地址线和数据线
      • 运行不需要拷贝到RAM中
    • STM32的启动
      • 启动时会固定跳转到0地址位置
      • 通过两个boot引脚控制启动的代码映射
        • 引脚01的时候可以映射system boot(arm中的boot rom)
        • 第二位是0的时候,可以把存放用户代码的internal Flash映射到0
        • 引脚11的时候将internal SRAM映射到0
    • boot loader需要完成的任务
      • 关闭看门狗,初始化中断和trap向量表,进行时钟和外设初始化,让芯片正常运行起来
      • 提供CAN、UART、ETH等用于通讯功能的驱动,能够接收外部数据传输请求
      • 提供FLASH的读写与擦除驱动,设计服务来对通讯端口接收到的更新代码进行校验、存储,以及跳转操作系统或后续应用程序代码
      • 如有必要,还会开发一些基础诊断服务,串口交互程序等等
  • 嵌入式Linux的SoC和计算机
    • 系统一般存储在NAND Flash中(计算机一般是硬盘),运行前需要先将代码搬运到SRAM中
    • 主要任务就是将代码从NAND Flash或者硬盘中搬运到SRAM中
    • 转移的这部分内容就是bootloader
    • 转移的内容包括SPL和uBoot
      • SPL是接力赛中的第二棒,初始化更大的外部DRAM,再将uBoot搬运到外部RAM中运行
      • uBoot运行初始化程序,再将系统环境变量将OS内核搬运到DRAM中执行
      • OS再完成根文件系统的加载等等

        总结

  • boot rom
    • 硬件自检,部分初始化,提供外部配置引脚
  • 自己写的boot loader
    • 可以访问外部RAM,NAND Flash
    • 初始化时钟,通讯等
    • 接收,存储以及跳转代码
  • application层
    • 操作系统,文件系统
    • 用户应用程序
    • 方便更新