ARM Trusted Firmware分析——编译选项
参考文档:《Build Options》
1. 通用部分
BL2/BL31/BL31:指定生成fip文件的BL2/BL31/BL32镜像路径,指定后则不需要编译BL2镜像。
BL2_AT_EL3:使能后BL2镜像会运行在EL3异常等级。
BL2_IN_XIP_MEM:使能后BL2会运行在XIP存储设备上。只需要在RAM上初始化读写段,RO代码段不需要拷贝。
BL32_EXTRA1/BL32_EXTRA2:生成fip的TOS Extra1/Extra2镜像路径。
DISABLE_BIN_GENERATION:禁止生成二进制镜像,默认为0。如果为1,则默认只输出ELF格式镜像。
EL3_PAYLOAD_BASE:指定EL3镜像的入口地址,跳过后面镜像读取加载流程。
ENABLE_ASSERTIONS:配置编译时是否使能assert()。1表示将assert()编译在版本内;0表示关闭assert()。
ENABLE_BACKTRACE:配置编译版本是否支持backtrace dump功能。
ENABLE_LTO:仅在AARch64平台可用,配置是否支持链接时优化(Link Time Optimization)功能。
ENABLE_PIE:配置是否使能位置无关可执行代码功能,默认为0。仅支持BL2_AT_EL3、BL31、BL32。
ENABLE_STACK_PROTECTOR:配置GCC stack protection选项,允许值为all、strong、default、none。
FIP_NAME:指定FIP文件名称,默认为fip.bin。
FWU_FIP_NAME:指定FWU FIP文件名称,默认为fwu_fip.bin。
LDFLAGS:用户添加链接命令选项。
PLAT:指定编译ATF的平台配置,必须要plat/下的对应目录匹配,并包含一个platform.mk文件。
PRELOADED_BL33_BASE:从预加载的BL33镜像启动,入口地址由此配置指定。
PROGRAMMABLE_RESET_ADDRESS:1允许复位vector address可配置,0是固定。默认为0。
RESET_TO_BL31:使用BL31作为复位vector,而不是使用BL1入口。0使用BL1入口地址,1使用BL31入口地址。默认为0。
SPD:指定ATF中编译的Secure Payload Dispatcher名称,跟services/spd下目录一致。目录下需要包含一个同名的<spd-value>.mk文件。
SPIN_ON_BL1_EXIT:1表示BL1退出时进入无限循环,0表示不使用无限循环。使用1可以在镜像加载完成、MMU和Cache都关闭的时候,接入调试器进行调试。
2. 安全相关
ROT_KEY:指定包含ROT PEM格式私钥的文件并且强制生成公钥hash。
SAVE_KEYS:告诉证书生成工具将秘钥保存到指定文件。
GENERATE_COT:决定是否编译并执行TBB中对每个COT生成认证信息的工具cert_create。默认为0。
- TRUSTED_BOARD_BOOT=1且GENERATE_COT=1:
- TRUSTED_BOARD_BOOT=0且GENERATE_COT=1:
- TRUSTED_BOARD_BOOT=1且GENERATE_COT=0:
COT:如果使能Trusted Boot,选择意向Chain of Trust,默认为tbbr。
CREATE_KEYS:在GENERATE_COT=1时,告诉证书生成工具生成新key,以免遇到未指定或无效key的情况。可选0或1,默认为1。
DYN_DISABLE_AUTH:具备在运行时关闭TBB镜像验证功能,仅在开发阶段有意义。
OPENSSL_DIR:提供用来做镜像签名和加密工具的openssl安装目录。
2.1 签名
通过KEY_ALG和KEY_SIZE选择签名算法和秘钥位宽,哈希算法由HASH_ALG指定。
KEY_ALG:允许用于选择生成PKCS秘钥以及签名所使用的算法,支持选项有rsa、rsa_1_5、ecdsa。默认为rsa,兼容TBBR的PKCS#1 RSA2.1。
KEY_SIZE:允许用户选择KEY_ALG指定算法的秘钥大小。
KEY_ALG |
Possible key sizes |
---|---|
rsa |
1024, 2048(default), 3072, 4096 |
ecdsa |
unavailable |
BL31_KEY/BL32_KEY/BL33_KEY:在GENERATE_COT=1使能后,指定BL31/BL32/BL33 PEM格式私钥文件。如果指定SAVE_KEYS=1,则用于保存key。
NON_TRUSTED_WORLD_KEY:在GENERATE_COT=1时生效,指定Non-Trusted World PEM格式私钥文件。
TRUSTED_WORLD_KEY:在GENERATE_COT=1时生效,指定Trusted World PEM格式私钥文件。
2.2 加密相关
通过DECRYPTION_SUPPORT选择加密算法,以及ENC_KEY选择秘钥,ENCRYPT_BL31/ENCRYPT_BL32选择加密镜像。
DECRYPTION_SUPPORT:允许用户使用经过验证的解密算法来对启动过程中的镜像解密。两种选项aes_gcm或none。none表示关闭解密功能。是否支持其他aes模式扩展,取得性能和安全平衡?
ENC_KEY:一个32字节(256位)的对称秘钥,可以是SSK或BSSK方式。
ENC_NONCE:一个12字节(96位)的nonce或IV秘钥。nonce是一个只被使用一次的任意或非重复的随机数值。
ENCRYPT_BL31/ENCRYPT_BL32:在DECRYPTION_SUPPORT打开后,表示是否对BL31/BL32镜像进行加密。
FW_ENC_STATUS:指定镜像加密秘钥管理方式。0,一类设备使用相同的SSK(Secrete Symmetric Key);1,每个设备使用独有的BSSK(Binding Secret Symmetric Key)。
2.3 哈希
HASH_ALG:选择hash算法选项,可选sha256、sha384、sha512。默认为sha256。
2.4 中断
EL3_EXCEPTION_HANDLING:设置为1时,异常处理将由EL3进行处理;设置为0时,EL3将不会进行异常处理,结果是进行panic。
SEC_INT_DESC_IN_FCONF:用于决定是否使用关键配置框架配置Group 0和Group 1位安全中断。
GICV2_G0_FOR_EL3:不同于GICv3,GICv2没有EL3专用中断。将GICV2_G0_FOR_EL3置为1,则表示期望GICv2 Group 0中断发送到EL3。这意味着所有GICv2 Group 0中断被送到EL3,并且Secure Payload中断需要被同步送到S.EL1处理。默认值为0,表示Group 0中断默认被S.EL1处理。
HANDLE_EA_EL3_FIRST:置为1,则外部异常和SError中断会被EL3捕获。置为0,异常则会陷入当前EL(如果当前EL是EL0,则会陷入EL1。)
SP_MIN_WITH_SECURE_FIQ:
TSP_NS_INTR_ASYNC_PREEMPT:
3. 调试
编译调试版本:
make PLAT=<platform> DEBUG=1 V=1 all
DEBUG:选择编译调试版本还是发布版本,0发布版本,1调试版本。
ARM GCC默认使用DWARF 4调试符号。某些工具可能不支持,可以通过-gdwarf-<version>来指定DWARF版本,比如为2或3。
某些时候甚至需要关闭编译优化来定位问题,使用-O0。
CFLAGS='-O0 -gdwarf-2' \ make PLAT=<platform> DEBUG=1 V=1 all