文章目录

  • MCUBoot 简介
    • 组成
  • 前提条件
  • 构建Bootloader
  • 为Bootloader构建APP
  • 签名
    • 密钥创建
    • 公钥提取
  • 程序烧录
  • APP中使用MCUBoot

MCUBoot 简介

  • MCUBoot 是可配置的安全引导加载程序,由多个行业领导者维护。它可以作为 第一或第二阶段的引导加载程序运行,支持软件映像的加密验证, 支持的加密方式如下:

    • ECDSA-P256
    • RSA-2048
    • RSA-3072
  • 默认情况下,它支持映像回滚,下载的固件会被试验性地启动一次。 初次升级引导时,如果升级映像将自身标记为已确认,则其将被保留为主映像文件。如果升级映像未被确认,则后续引导将回退至 上一个被确认的映像。如果没有可用的有效映像,作为一种安全 预防措施,设备会将自己变砖。

组成

  • MCUBoot 由两部分组成

    • bootutil (boot/bootutil)
    • boot application (每个平台在 boot目录下都有其对应的boot程序)
  • bootutil 实现了bootloader的大部分功能,但是跳转到主映像程序,这一部分是缺失的,这部分由boot application 替代实现,bootloader的功能是分离的,这样做的目的是为了方便对bootloader进行单元测试。

前提条件

  1. Zephyr所需的第一步是确保您的板子在其设备树中定义了闪存分区,这些分区包括:

    • boot_partition: for MCUboot itself
    • slot0_partition: the primary slot of Image 0
    • slot1_partition: the secondary slot of Image 0
  2. 就目前而言,两个镜像分区必须是连续的。如果MCUboot作为您的第一阶段引导加载程序,则必须配置boot_partition,以便您的SoC从复位时运行它。如果有多个可更新的映像,则其余映像的相应主分区和备用分区也必须定义(例如,Image 1的slot2_partition和slot3_partition)。

  3. 闪存分区通常在zephyr/boards文件夹中名为boards/<arch>/<board>/<board>.dts的文件中定义。

构建Bootloader

  1. 从Zephyr的角度来看,botloader也是一个普通的Zephyr应用程序,虽然CMakeLists.txt中已经完成了绝大部分操作,但是在编译之前仍然需要对一些配置进行修改,例如签名算法和主映像文件是否在每次启动之后都要对其进行验证,设置完成之后跳转到bootloader/mcuboot/boot/zephyr 目录下,然后进行编译:
cd bootloader/mcuboot/boot/zephyr
west build -b <board>
  1. 除了定义在设备树中的分区表,构建bootloader还需要一些和flash 布局有关的信息,这些信息是通过 boot/zephyr/include/target.h 进行收集的,信息源自和board相关的头文件,设备树,以及MCUBoot对不同SOC的配置。

为Bootloader构建APP

  1. 配置文件中启用 MCUboot 组件:打开 Zephyr 的配置文件 prj.conf 或 prj.{board}.conf(其中 {board} 是您所使用的开发板名称),并添加以下选项(选项开启后会自动从设备树中读取主映像分区信息,详细描述请查看partitions章节):
CONFIG_BOOTLOADER_MCUBOOT=y
  • 如果需要使用 MCUboot 的其他特性,如加密或签名,还需要配置相应的选项,MCUBOOT_GENERATE_UNSIGNED_IMAGE 选项未使能时,会开启镜像签名机制,MCUBOOT_SIGNATURE_KEY_FILE 用于设置签名文件的路径,MCUBOOT_ENCRYPTION_KEY_FILE 用于设置加密文件路径,如果没有设置签名和加密文件的路径,最后必须要手动为镜像签名。
  • 为了让app能够正确的运行,chosen节点下的zephyr,code-partition属性必须设置,否则最终生成的程序会链接出错无法运行:
/{chosen{zephyr,code-partition = &slot0_partition;};&flash0 {partitions {compatible = "fixed-partitions";#address-cells = <1>;#size-cells = <1>;/* 64KB for bootloader */boot_partition: partition@0 {label = "mcuboot";reg = <0x00000000 DT_SIZE_K(64)>;read-only;};/* storage: 64KB for settings */storage_partition: partition@10000 {label = "storage";reg = <0x00010000 DT_SIZE_K(64)>;};/* application image slot: 256KB */slot0_partition: partition@20000 {label = "image-0";reg = <0x00020000 DT_SIZE_K(256)>;};/* backup slot: 256KB */slot1_partition: partition@60000 {label = "image-1";reg = <0x00060000 DT_SIZE_K(256)>;};/* swap slot: 128KB */scratch_partition: partition@a0000 {label = "image-scratch";reg = <0x000a0000 DT_SIZE_K(128)>;};};
};
};
  1. 构建 Zephyr 应用程序:使用 west build 命令构建 Zephyr 应用程序,其中<board> 是您所使用的开发板名称,<app> 是您的应用程序名称:
west build -b <board> <app>

签名

  • 为了对程序进行升级,或者是引导应用程序(当 MCUBOOT_VALIDATE_PRIMARY_SLOT 使能后),必须要对程序进行签名,在MCUBoot中提供了一些用于功能测试的例程,但一定不要将其运用到产品中,因为这些密钥已经被公开到网络上。

密钥创建

./scripts/imgtool.py keygen -k mykey.pem -t rsa-2048
  • 其中-t选项用于指定加密算法

公钥提取

  • 生成的密钥对中包含了公钥和私钥,需要从密钥对中提取公钥并插入bootloader和APP中,CONFIG_BOOT_SIGNATURE_KEY_FILE 选项用于设置生成的密钥对的路径,编译系统会从中提取出C编译器可以使用的公钥,提取出的公钥会被放到 build/zephyr/autogen-pubkey.h 中,然后被编译到程序中。

程序烧录

  • 先将bootloader烧录到芯片中,然后将主程序烧录到 flash 对应分区中,
  • 主镜像程序烧录时不可以进行全片擦除,这样会导致bootloader被擦掉。

APP中使用MCUBoot

  • 在应用程序中使用 MCUboot 库:在应用程序代码中包含 mcuboot.h 头文件,例如:
#include <mcuboot.h>
  • 然后使用其中的 API 来进行固件升级和回滚。例如,以下代码将触发一个固件升级:
int rc = boot_request_upgrade(0);
if (rc) {printk("Failed to request upgrade (%d)\n", rc);
}

Zephyr MCUBoot相关推荐

  1. zephyr 的MCUBOOT 使用笔记---基于Nordic 52840

    MCUBOOT 什么是MCUBOOT mcuboot 和常用的BootLoader有一些区别,实际上mcuboot相当于一个安全的引导程序,(注意这里的mcuboot只关注于安全引导,像我们常用的Bo ...

  2. Zephyr应用笔记:mcuboot引导程序简单介绍

    本文对mcuboot(version 1.1.0)做一个简单介绍供参考,Github地址:https://github.com/runtimeco/mcuboot 以下内容都是针对(version 1 ...

  3. Zephyr应用笔记:mcuboot引导zephyr镜像

    第一次写博客且本人文字组织水平一直很low,所以大家将就看吧. 博客的宗旨:看过这篇文章的人都能够顺利开发zephyr的boot. boot采用mcuboot(version 1.1.0),Githu ...

  4. zephyr笔记 5.3.1 Zephyr 版本 MCUboot 的编译和使用

    1 前言 这一节是翻译自 MCUboot 网站上 MCUboot with Zephyr . MCUboot 最初是 Mynewt 的引导程序.此后,它也成为了 Zephyr 的引导程序.Zephyr ...

  5. 桌面版应用_【Nordic博文分享系列】开发你的第一个NCS(Zephyr)应用程序

    Nordic有2套并存的SDK 1.老的nRF5 SDK 2.新的NCS SDK 两套SDK相互独立, 大家选择其中一套进行开发即可. 一般而言,如果你选择的芯片是nRF51或者nRF52系列,那么推 ...

  6. 安装zephyr流程与问题解决

    安装zephyr流程与问题解决 参考教程:https://docs.zephyrproject.org/latest/getting_started/index.html 两边对比着看,不要刻舟求剑! ...

  7. Zephyr (nrf)

    记录开发zephyr的两三事 微信:bangYS 刚听到zephyr是前些年,一个朋友跟我说的,嵌入式的Linux. 的确,Zephyr跟Linux有千丝万缕的联系. 1. Zephyr用dts管理设 ...

  8. zephyr在Ubuntu18.04安装使用

    zephyr在Ubuntu18.04安装使用 1. 安装 参考官网:https://docs.zephyrproject.org/latest/getting_started/index.html 首 ...

  9. Zephyr内核到1.5版本的改进

    Zephyr内核从1.0到1.5版本发生了很大改变,这些改变给开发人员带来了很大方便,具体如下: ①消除微内核和超微内核构建类型的分离 ②消除微内核应用程序中的MDEF ③更简单易用的内核API ④宽 ...

最新文章

  1. kibana智能检索发送多次_msearch —— 配置index pattern,同时设置时间段,就知道到底是在哪些索引里去查找数据了...
  2. 实例介绍,如何在开发中将各层日志归类输出.
  3. 洛谷—— P1714 切蛋糕
  4. WPF-MVVM学习心德(WinForm转WPF心德)
  5. 匹配printf()说明符的类型
  6. C++语言基础(20)-模板的非类型参数
  7. ST17H26开发小总结
  8. 前端教程之Intro.js轻松实现新手引导效果
  9. 7-13 简单计算器 (25 分)
  10. 西瓜哥:公有云也“All-Flash”?
  11. VMware时钟不准的解决之道
  12. C# 从文本列中检索数据
  13. VMware 15.6版本下载安装
  14. 大数据技术与人工智能的关系
  15. luogu P4238 【模板】多项式乘法逆
  16. Flink Watermark 机制浅析(透彻)
  17. 关于大淘客CMS免费二次开发分享的曝光
  18. 爬虫爬取实时新闻标题、时间及新闻内容并保存
  19. 计算机网络网卡作用是什么,什么是网卡?它的作用是什么?
  20. 百子作业 —— 中国邮递员问题

热门文章

  1. vue buid打包,修改环境变量
  2. 485与232的区别
  3. python程序sum函数的用法_python 运行sum函数的使用
  4. 正版软件 Directory Opus 12 Pro Windows 平台上的资源管理器,定是功能完全、可定制化程度高的那款。
  5. OA项目之部门管理的功能实现
  6. 《北洋军阀统治时期的政治经济与文化》教学设计
  7. day10-阶段测评
  8. 深度学习实现安全帽佩戴的检测
  9. java 电梯类图,电梯控制系统(用UML图理解)
  10. 免费听好歌曲,音乐下载工具