@

1. 常用部分

编译选项 解释
BL2
指定生成fip文件的BL2镜像的路径。在这种情况下,将不会构建TF-A中的BL2
BL31
指定生成fip文件的BL31图像的路径。在这种情况下,将不会构建TF-A中的BL31
BL32
指定生成fip文件的BL32图像的路径。在这种情况下,将不会构建TF-A中的BL32
BL33
主机文件系统中BL33映像的路径。如果使用TF-A BL2,这对于fip文件是强制性的
BL2_AT_EL3 使能后,BL2镜像会运行在EL3异常等级
BL2_IN_XIP_MEM 使能后,BL2会运行在XIP存储设备上。只需要在RAM上初始化RW段,RO代码段不需要拷贝
BL32_EXTRA1 指定生成fip文件的TOS Extra1镜像路径
BL32_EXTRA2 指定生成fip文件的TOS Extra2镜像路径
DISABLE_BIN_GENERATION 禁止生成二进制镜像,默认为0。如果为1,则默认只输出ELF格式镜像
EL3_PAYLOAD_BASE 指定EL3镜像的入口地址,跳过后面镜像读取加载流程
ENABLE_ASSERTIONS 设置编译时是否使能assert()。对于调试版本,此选项默认为1,对于发行版,此选项默认为0
ENABLE_LTO 用于在TF-A的GCC中启用链接时间优化(LTO)支持。当前仅AArch64支持此选项。默认值为0
ENABLE_BACKTRACE 设置编译版本是否支持backtrace dump功能
ENABLE_PIE 用于在TF-A的通用代码中启用位置无关可执行代码功能。当前仅BL2_AT_EL3,BL31和BL32(TSP)支持此选项。默认值为0。
ENABLE_STACK_PROTECTOR 用于在GCC中启用堆栈保护检查。允许值为all、strong、default、none
FWU_FIP_NAME 指定FWU FIP文件名称,默认为fwu_fip.bin
LDFLAGS 用户添加链接命令选项
PRELOADED_BL33_BASE 使用此选项可以引导预加载的BL33映像,而不是常规引导流程
PROGRAMMABLE_RESET_ADDRESS 1允许复位vector address可配置,0是固定。默认为0
RESET_TO_BL31 启用BL31入口点作为CPU复位向量,而不是BL1入口点。它可以取值为0(使用BL1入口地址)或1(使用BL31入口点)。默认值为0
SPD 指定ATF中编译的Secure Payload Dispatcher名称,此生成选项仅在ARCH=aarch64时有效。该值值应该是相对于services/spd /的包含SPD源的目录的路径,目录下需要包含一个同名的.mk文件
SPIN_ON_BL1_EXIT 此选项在BL1中引入了无限循环。它可以取0(无循环)或1(添加循环)。默认值为0。该循环将在切换到BL31之前停止BL1中的执行。此时,所有固件映像均已加载到内存中,并且MMU和高速缓存已关闭。接入调试器进行调试
BUILD_BASE
构建的输出目录。默认为./build
FIP_NAME
指定FIP文件名称,默认为fip.bin
PLAT
指定编译ATF的平台配置,必须要plat/下的对应目录匹配,并包含一个platform.mk文件
ARCH
选择TF-A的目标构建体系结构。它可以采用 aarch64或aarch32作为值。默认情况下,它定义为 aarch64
DEBUG
选择编译调试版本还是发布版本,0发布版本,1调试版本。
BL32_EXTRA1 它为fip目标指定了Trusted OS Extra1镜像的路径。
BL32_EXTRA2 它为fip目标指定了Trusted OS Extra2镜像的路径。
BUILD_BASE
构建的输出目录。默认为./build
USE_COHERENT_MEM 该标志确定是否在BL存储器映射中包括一致性存储器区域(请参见“Use of Coherent memory in TF-A” section in Firmware Design)。 它可以取值为1(包括一致性存储器区域)或0(不包括一致性存储器区域)。 默认值为1。

2. 安全相关

编译选项 解释
TRUSTED_BOARD_BOOT
对Trusted Board Boot功能的支持。设置为“ 1”时,BL1和BL2映像支持加载和验证FIP中的证书和映像,而BL1包含对固件更新的支持。默认值为“ 0”。
ROT_KEY
当GENERATE_COT = 1时使用此选项。 它指定包含PEM格式的ROT私钥的文件,并强制生成公钥哈希。 如果SAVE_KEYS = 1,此文件名将用于保存密钥。
SAVE_KEYS 当GENERATE_COT = 1时使用此选项。 它告诉证书生成工具保存用于建立信任链的密钥。 允许的选项为“ 0”或“ 1”。 默认值为“ 0”(不保存)。
COT
如果使能Trusted Boot,选择意向Chain of Trust,默认为tbbr
CREATE_KEYS
当GENERATE_COT = 1时使用此选项。 它告诉证书生成工具在不存在或未指定有效密钥的情况下创建新密钥。 允许的选项为“ 0”或“ 1”。 默认值为“ 1”。
DYN_DISABLE_AUTH 提供在运行时动态禁用Trusted Board Boot身份验证的功能。 该选项仅适用于开发平台。 如果必须启用此标志,则必须设置TRUSTED_BOARD_BOOT标志。 默认值为0。
OPENSSL_DIR 此标志用于在主机上提供已安装的openssl目录路径,该路径用于构建证书生成和固件加密工具。
GENERATE_COT
布尔标志,用于根据Trusted Board Boot中所述的信任链来构建和执行cert_create工具以创建证书。 然后,构建系统调用fiptool将证书包括在FIP和FWU_FIP中。 默认值为“ 0”。
(1) TRUSTED_BOARD_BOOT = 1和GENERATE_COT = 1,以在BL1和BL2映像中包括对Trusted Board Boot功能的支持,生成相应的证书,并将这些证书包括在FIP和FWU_FIP中;
(2)如果TRUSTED_BOARD_BOOT = 0和GENERATE_COT = 1,则BL1和BL2映像将不包括对Trusted Board Boot的支持。 FIP仍将包括相应的证书。该FIP可用于通过其他机制来验证主机上的信任链;
(3)TRUSTED_BOARD_BOOT = 1和GENERATE_COT = 0,则BL1和BL2映像将包括对Trusted Board Boot的支持,但是FIP和FWU_FIP将不包括相应的证书,从而导致启动失败

2.1 签名

编译选项 解释
KEY_ALG 允此构建标志使用户可以选择用于生成PKCS密钥和证书的后续签名的算法,支持选项有rsa、rsa_1_5、ecdsa。rsa_1_5是传统的PKCS#1 RSA 1.5算法,该算法不符合TBBR,保留仅仅是为了兼容。默认为rsa
KEY_SIZE 使用户能够选择指定算法的密钥大小,有效值KEY_SIZE 取决于所选的算法和密码模块
(1)rsa : 1024 , 2048 (default), 3072, 4096*
(2)ecdsa : unavailable
BL31_KEY
当GENERATE_COT = 1时使用此选项。它指定PEM格式的BL31私钥。如果SAVE_KEYS=1,则此文件名将用于保存密钥
BL32_KEY
当GENERATE_COT = 1时使用此选项。它指定PEM格式的BL32私钥。如果SAVE_KEYS=1,则此文件名将用于保存密钥
BL33_KEY
当GENERATE_COT = 1时使用此选项。它指定PEM格式的BL33私钥。如果SAVE_KEYS=1,则此文件名将用于保存密钥
TRUSTED_WORLD_KEY
当GENERATE_COT = 1时使用此选项。它指定PEM格式Trusted World私钥。如果SAVE_KEYS=1,则此文件名将用于保存密钥
NON_TRUSTED_WORLD_KEY
当GENERATE_COT = 1时使用此选项。它指定PEM格式Non-Trusted World 私钥。如果SAVE_KEYS=1,则此文件名将用于保存密钥

2.2 加密

  通过DECRYPTION_SUPPORT选择加密算法;通过ENC_KEY选择秘钥;通过ENCRYPT_BL31/ENCRYPT_BL32选择是否加密镜像。

编译选项 解释
DECRYPTION_SUPPORT 此标志允许用户选择在引导期间用于解密镜像的已验证解密算法。它接受2个值:aes_gcm和none。此标志的默认值是none禁用镜像解密
ENC_KEY 十六进制字符串格式的32字节(256位)对称密钥。它可以是SSK或BSSK,该值取决于DECRYPTION_SUPPORT
ENCRYPT_BL31 在DECRYPTION_SUPPORT打开后,表示是否对BL31镜像进行加密
ENCRYPT_BL32 在DECRYPTION_SUPPORT打开后,表示是否对BL32镜像进行加密
FW_ENC_STATUS 指定镜像加密秘钥管理方式。
(1)0,一类设备使用相同的SSK(Secrete Symmetric Key);
(2)1,每个设备使用独有的BSSK(Binding Secret Symmetric Key)

2.3 哈希

编译选项 解释
HASH_ALG 该构建标志使用户能够选择安全哈希算法。 它接受3个值:sha256,sha384和sha512。 该标志的默认值为sha256。

2.4 中断

编译选项 解释
EL3_EXCEPTION_HANDLING
设置为1时,异常处理将由EL3进行处理;设置为0时,EL3将不会进行异常处理,结果是进行panic。
HANDLE_EA_EL3_FIRST 设置为1,将在运行时始终将外部异常中断和SError中断捕获在EL3中,即BL31中。 当设置为0(默认值)时,这些异常将被捕获在当前异常级别中(如果当前异常级别为EL0,则捕获在EL1中)。
TSP_NS_INTR_ASYNC_PREEMPT 设非零值启用中断路由模型,该模型将非安全中断从TSP异步路由到EL3,从而立即抢占TSP。EL3负责在此路由模型中保存和还原TSP上下文。默认路由模型(当值为0时)是将非安全中断路由到TSP,从而允许其保存其上下文并通过SMC同步移交给EL3。如果EL3_EXCEPTION_HANDLING是1,TSP_NS_INTR_ASYNC_PREEMPT 也必须设置为1
SEC_INT_DESC_IN_FCONF 此标志确定是否使用固件配置框架配置组0和组1安全中断。在运行时从设备树中检索特定于平台的安全中断属性描述符,而不是在编译时依赖于静态C结构

3.GICv3驱动程序选项

使用以下指定包含GICv3驱动程序文件

include drivers/arm/gic/v3/gicv3.mk

可以使用平台makefile中设置的以下选项来配置驱动程序:

编译选项 解释
GICV3_SUPPORT_GIC600 添加对GICV3的GIC-600变量的支持。启用此选项将为GIC-600添加运行时检测支持。此选项默认为0。
GICV3_IMPL_GIC600_MULTICHIP 选择具有多芯片功能的GIC-600变量。此选项默认为0
GICV3_OVERRIDE_DISTIF_PWR_OPS 允许覆盖arm_gicv3_distif_pre_save和arm_gicv3_distif_post_restore函数的默认实现。 这对于FVP平台是必需的,该平台需要在SYSTEM_SUSPEND期间模拟GIC保存和还原而无需关闭GIC的电源。 默认值为0。
GIC_ENABLE_V4_EXTN 启用GICv3驱动程序中与GICv4相关的更改。此选项默认为0。
GIC_EXT_INTID 允设置为1时,GICv3驱动程序将支持扩展的PPI(1056-1119)和SPI(4096-5119)范围。 此选项默认为0。

4. 调试选项

编译调试版本:

make PLAT=<platform> DEBUG=1 V=1 all

默认情况下,AArch64 GCC使用DWARF版本4调试符号。 某些工具(例如DS-5)可能不支持此功能,并且可能需要GCC发出较旧版本的DWARF符号。 这可以通过使用-gdwarf- 标志(将版本设置为2或3)来实现。对于早于5.16的DS-5版本,建议将版本设置为2。

调试逻辑问题时,使用-O0禁用所有编译器优化可能也很有用。但是使用-O0可能会导致输出镜像更大,并且可能需要重新计算基址(请参阅“固件设计”中的Arm开发平台上的内存布局部分4. Firmware Design)。

可以通过设置CFLAGS或 来将额外的调试选项传递给构建系统LDFLAGS:

CFLAGS='-O0 -gdwarf-2'                                     \
make PLAT=<platform> DEBUG=1 V=1 all

请注意,使用-Wl时,由于直接调用链接器,因此CFLAGS编译驱动程序选项将被忽略。

也可以引入无限循环来帮助调试TF-A的BL2后阶段。 这可以通过使用SPIN_ON_BL1_EXIT = 1构建标志重建BL1来完成。 请参阅“公共构建选项”部分。 在这种情况下,开发者可以在控制台输出指示时使用调试器来控制目标。


参考:

(1) 5. Build Options

ARM Trusted Firmware——编译选项(二)的更多相关文章

  1. Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核

    Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核 标签(空格分隔): Qemu ARM Linux 在上文<Qemu搭建ARM vexpress开发环 ...

  2. 一步步教你如何在ubuntu虚拟机中安装QEMU并模拟arm 开发环境(二)rootfs制作

    过了,一天,周又到了,博主终于可以拿出时间来把上一次没有给大家展示完了的内容今天在这里一并展示给大家,希望和大家共同进步,共同学习,同时我也虔诚的希望各位业界的朋友把自己的工作经验拿出来大家一起分享, ...

  3. linux驱动由浅入深系列:PBL-SBL1-(bootloader)LK-Android启动过程详解之一(高通MSM8953启动实例)

    转自:http://blog.csdn.net/radianceblau/article/details/73229005 http://www.aiuxian.com/article/p-14142 ...

  4. 嵌入式开发之zynqMp ---Zynq UltraScale+ MPSoC 图像编码板zcu102

    1.1 xilinx zynqMp 架构 1.1.1 16nm 级别工艺 Zynq UltraScale+  MPSoC架构 Xilinx新一代Zynq针对控制.图像和网络应用推出了差异化的产品系,这 ...

  5. ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(1)-EL/ET/ST

    1.前言 ARMV8系统级编程模型主要包括异常级别.运行状态.安全状态.同步异常.异步异常.DEBUG 本文主要对系统级编程模型做一个概要介绍 2. 异常级别 2.1 Exception level概 ...

  6. 什么是TF-A?

    1. TF-A的全称是什么? Arm Trusted Firmware 2. TF-A的作用是什么? 在secure world和non-secure world之间切换 3. TF-A涉及到哪几个部 ...

  7. 什么是OPTEE-OS

    1. 为什么会出现这种技术? 为了安全,例如:保护指纹虹膜的生物特征数据 2. 为了确保数据安全各家公司都做了些什么? Arm公司提出的了trustzone技术,用一根安全总线(称为NS位)来判断当前 ...

  8. 【原创】Linux Suspend流程分析

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  9. ARMv8 架构与指令集.学习笔记

    目 录 第1章 ARMv8简介. 3 1.1基础认识. 3 1.2 相关专业名词解释. 3 第2章 Execution State 4 2.1 提供两种Execution State 4 2.2 决定 ...

  10. Armv8之Execution State 和 Exception Level(一)

    @ 目录 1. 典型的Exception Level使用模型 2.异常相关术语 3. Execution State 3.1 两种Execution State 3.2 决定Execution Sta ...

随机推荐

  1. CRC(Cyclic Redundancy Check)

    CRC(循环冗余校验) [参考资料] https://en.wikipedia.org/wiki/Cyclic_redundancy_check https://wiki.segger.com/CRC ...

  2. 网络框架重构之路plain2.0(c++23 without module) 环境

    接下来本来就直接打算分享框架重构的具体环节,但重构的代码其实并没有完成太多,许多的实现细节在我心中还没有形成一个定型.由于最近回归岗位后,新的开发环境需要自己搭建,搭建的时间来说花了我整整一天的时间才 ...

  3. 【LeetCode动态规划#10】完全背包问题实战,其三(单词拆分,涉及集合处理字符串)

    单词拆分 力扣题目链接(opens new window) 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词. 说明: 拆 ...

  4. 开心档之MySQL 复制表

    MySQL 复制表 如果我们需要完全的复制MySQL的数据表,包括表的结构,索引,默认值等. 如果仅仅使用CREATE TABLE ... SELECT命令,是无法实现的. 本章节将为大家介绍如何完整 ...

  5. 图文介绍 Windows 系统下打包上传 IOS APP 流程

    现在很多伙伴跨平台开发应用,有些童鞋没有苹果机,本文将介绍,如何在 Windows 系统环境下直接上架 APP ,不用去搞虚拟机之类的了, Windows 下照样轻松打包上架 iOS APP . 下面 ...

  6. 这可能是最全面的Redis面试八股文了

    Redis连环40问,绝对够全! Redis是什么? Redis(Remote Dictionary Server)是一个使用 C 语言编写的,高性能非关系型的键值对数据库.与传统数据库不同的是,Re ...

  7. #Powerquery 数据结构基础 一维数据与二维数据

    本文参考了采悟老师的文章,推荐大家看原文,本文为笔记随笔 https://mp.weixin.qq.com/s?__biz=MzA4MzQwMjY4MA==&mid=2484068871&am ...

  8. 2022-04-02:你只有1*1、1*2、1*3、1*4,四种规格的砖块。 你想铺满n行m列的区域,规则如下: 1)不管那种规格的砖,都只能横着摆, 比如1*3这种规格的砖,3长度是水平

    2022-04-02:你只有11.12.13.14,四种规格的砖块. 你想铺满n行m列的区域,规则如下: 1)不管那种规格的砖,都只能横着摆, 比如1*3这种规格的砖,3长度是水平方向,1长度是竖直方 ...

  9. 2023-05-24:为什么要使用Redis做缓存?

    2023-05-24:为什么要使用Redis做缓存? 答案2023-05-24: 缓存的好处 买啤酒和喝啤酒的例子可以帮助我们理解缓存的好处. 假设你在超市里买了一箱啤酒,如果你需要每次想喝啤酒就去超 ...

  10. Experimental support for decorators is a feature that is subject to change in a future release. Set

    错误提示Experimental support for decorators is a feature that is subject to change in a future release. ...