ARM Trusted Firmware——编译选项(二)
@
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——编译选项(二)的更多相关文章
- Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核
Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核 标签(空格分隔): Qemu ARM Linux 在上文<Qemu搭建ARM vexpress开发环 ...
- 一步步教你如何在ubuntu虚拟机中安装QEMU并模拟arm 开发环境(二)rootfs制作
过了,一天,周又到了,博主终于可以拿出时间来把上一次没有给大家展示完了的内容今天在这里一并展示给大家,希望和大家共同进步,共同学习,同时我也虔诚的希望各位业界的朋友把自己的工作经验拿出来大家一起分享, ...
- linux驱动由浅入深系列:PBL-SBL1-(bootloader)LK-Android启动过程详解之一(高通MSM8953启动实例)
转自:http://blog.csdn.net/radianceblau/article/details/73229005 http://www.aiuxian.com/article/p-14142 ...
- 嵌入式开发之zynqMp ---Zynq UltraScale+ MPSoC 图像编码板zcu102
1.1 xilinx zynqMp 架构 1.1.1 16nm 级别工艺 Zynq UltraScale+ MPSoC架构 Xilinx新一代Zynq针对控制.图像和网络应用推出了差异化的产品系,这 ...
- ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(1)-EL/ET/ST
1.前言 ARMV8系统级编程模型主要包括异常级别.运行状态.安全状态.同步异常.异步异常.DEBUG 本文主要对系统级编程模型做一个概要介绍 2. 异常级别 2.1 Exception level概 ...
- 什么是TF-A?
1. TF-A的全称是什么? Arm Trusted Firmware 2. TF-A的作用是什么? 在secure world和non-secure world之间切换 3. TF-A涉及到哪几个部 ...
- 什么是OPTEE-OS
1. 为什么会出现这种技术? 为了安全,例如:保护指纹虹膜的生物特征数据 2. 为了确保数据安全各家公司都做了些什么? Arm公司提出的了trustzone技术,用一根安全总线(称为NS位)来判断当前 ...
- 【原创】Linux Suspend流程分析
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...
- ARMv8 架构与指令集.学习笔记
目 录 第1章 ARMv8简介. 3 1.1基础认识. 3 1.2 相关专业名词解释. 3 第2章 Execution State 4 2.1 提供两种Execution State 4 2.2 决定 ...
- Armv8之Execution State 和 Exception Level(一)
@ 目录 1. 典型的Exception Level使用模型 2.异常相关术语 3. Execution State 3.1 两种Execution State 3.2 决定Execution Sta ...
随机推荐
- Map集合案例:统计输入多个key值出现的次数
某商店想统计一下一天内所售出的商品以及商品的数量,请编写程序帮助实现,并展示.通过键盘录入商品名称模拟售出的商品, 录入一次表示商品售出一次,直到录入end结束.运行效果如下: 代码:
- P1350 车的放置 题解
一.题目描述: 给你一个网格棋盘,a,b,c,d 表示了对应边长度,也就是对应格子数. 例如,当 a=b=c=d=2 时,对应了下面这样一个棋盘: 想要在这个棋盘上放 k 棋子,也就是这 k 个棋子没 ...
- 03-webpack五个概念
- vue刷新当前组件的方法
一:v-if控制组件,先设false,再true强制刷新组件(有时会产生一种奇怪的效果) 1 <medical-record v-if="fresh" /> 2 3 t ...
- HTML中link标签的那些属性
在HTML中, link 标签是一个自闭合元素,通常位于文档的 head 部分.它用于建立与外部资源的关联,如样式表.图标等. link 标签具有多个属性,其中 rel 和 href 是最常用的. r ...
- 安卓机上 4G 内存跑 alpaca,欢迎试用轻量级 LLM 模型推理框架 InferLLM
从 LLM 火爆以来,社区已经出现了非常多优秀的模型,当然他们最大的特点就是体积大,最近为了让大模型可以在更低端的设备上运行,社区做了非常多的工作, gptq 实现了将模型进行低比特量化,因此降低了运 ...
- pytest测试实战和练习
开头 经过前面几章的学习,这时候要来个测试实战会比较好巩固一下学过的知识 任务要求 1.实现计算器(加法,除法)的测试用例 2.使用数据驱动完成测试用例的自动生成 3.在调用测试方法之前打印[开始计算 ...
- 2023-03-03:请用go语言调用ffmpeg,摄像头捕获并编码为h264文件,不管音频。
2023-03-03:请用go语言调用ffmpeg,摄像头捕获并编码为h264文件,不管音频. 答案2023-03-03: 使用 github.com/moonfdd/ffmpeg-go 库. 先用如 ...
- Redis数据结构一之对象的介绍及各版本对应实现
本文首发于公众号:Hunter后端 原文链接:Redis数据结构一之对象的介绍及各版本对应实现 本篇笔记开始介绍 Redis 数据结构的底层实现. 当我们被问到 Redis 中有什么数据结构,或者说数 ...
- Python潮流周刊#2:Rust 让 Python 再次伟大
这里记录每周值得分享的 Python 及通用技术内容,部分为英文,已在小标题注明.(本期标题取自其中一则分享,不代表全部内容都是该主题,特此声明.) 文章&教程 1.Python修饰器的函数式 ...