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源的目录的路径,目录下需要包含一个同名的 |
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-
调试逻辑问题时,使用-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