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

热门相关:斗神战帝   刺客之王   寂静王冠   刺客之王   仗剑高歌