
01 前言

在第一篇文章中,我們介紹了OP-TEE的技術(shù)背景、整體架構(gòu)以及關(guān)鍵組件。在整個(gè)OP-TEE軟件棧中,OP-TEE OS是運(yùn)行在Arm TrustZone安全世界中的核心部分,它是實(shí)現(xiàn)可信執(zhí)行環(huán)境的基礎(chǔ)。OP-TEE OS不僅提供運(yùn)行Trusted Application(TA)的執(zhí)行環(huán)境,還實(shí)現(xiàn)了內(nèi)存管理、任務(wù)調(diào)度、加密服務(wù)、安全存儲(chǔ)等功能。
本篇文章將圍繞OP-TEE OS的架構(gòu)和編譯方法進(jìn)行詳細(xì)講解,內(nèi)容包括:
OP-TEE OS的核心架構(gòu)與功能介紹。
在Yocto環(huán)境下的編譯方法(結(jié)合RZ/G2L VLP3.0.7 SDK)。
獨(dú)立于Yocto的編譯方法,便于在通用Arm平臺(tái)或自定義環(huán)境中構(gòu)建。
如何在OP-TEE OS中添加Pseudo Trusted Application(PTA),以O(shè)TP PTA為例。
如何將編譯后的OP-TEE OS進(jìn)行簽名、加密并打包進(jìn)FIP,以便在實(shí)際硬件平臺(tái)運(yùn)行。

02 OP-TEE OS架構(gòu)與功能

2.1 基本定位
OP-TEE OS是一個(gè)輕量級(jí)的安全操作系統(tǒng),運(yùn)行在Arm TrustZone的Secure World中。它遵循GlobalPlatform TEE Internal API,支持Trusted Application的動(dòng)態(tài)加載與運(yùn)行。其核心功能包括:
TA管理與調(diào)度:負(fù)責(zé)加載、運(yùn)行和卸載Trusted Application。
內(nèi)存隔離與管理:將Secure World的內(nèi)存空間與Normal World嚴(yán)格隔離,防止敏感數(shù)據(jù)泄露。
加密服務(wù):提供加密算法與密鑰管理的安全實(shí)現(xiàn)。
安全存儲(chǔ):支持通過eMMC RPMB或安全文件系統(tǒng)保存機(jī)密數(shù)據(jù)。
SMC調(diào)用處理:處理來自Normal World的調(diào)用請(qǐng)求,并分發(fā)給對(duì)應(yīng)的TA。

2.2 目錄結(jié)構(gòu)概覽
以RZ/G2L平臺(tái)為例,編譯Yocto后生成的OP-TEE OS目錄結(jié)構(gòu)大致如下:
rzg_optee-os├── core│ ├── arch│ │ └── arm│ │ └── plat-rz│ │ └── g2l│ │ ├── drivers # 驅(qū)動(dòng)代碼│ │ └── pta # Pseudo TA 代碼└── lib└── utils

在這個(gè)結(jié)構(gòu)中:
drivers/存放硬件相關(guān)驅(qū)動(dòng)(如OTP訪問驅(qū)動(dòng))。
pta/存放內(nèi)建的Pseudo TA實(shí)現(xiàn)。
lib/提供通用庫(kù)函數(shù)。

03 Yocto下的編譯方法

3.1 啟用OP-TEE支持
在RZ/G2L的VLP3.0.6或VLP3.0.7環(huán)境中,OP-TEE被作為Security Package的一部分。要啟用OP-TEE,需要在Yocto的local.conf中加入配置:
echo ENABLE_SPD_OPTEE = "1" >> conf/local.confecho TRUSTED_BOARD_BOOT = "1" >> conf/local.confecho ENABLE_RZ_SCE = "1" >> conf/local.conf
其中:
ENABLE_SPD_OPTEE表示在TF-A中啟用OP-TEE Secure Payload Dispatcher。
TRUSTED_BOARD_BOOT表示啟用安全啟動(dòng)。
ENABLE_RZ_SCE表示OPTEE中使能SCE的加解密服務(wù)功能。
3.2 編譯OP-TEE OS
Yocto環(huán)境中,進(jìn)入構(gòu)建目錄后執(zhí)行:
source poky/oe-init-build-envbitbake optee-os -fc compilebitbake optee-os -fc installbitbake optee-os -fc populate_sysroot
成功后,Yocto會(huì)在對(duì)應(yīng)的tmp/work/.../optee-os/路徑下生成編譯產(chǎn)物。
3.3 打包進(jìn)固件
更新完OP-TEE OS后,需要重新編譯firmware-pack:
bitbake firmware-pack -fc compilebitbake firmware-pack -fc deploy
編譯完成后,將固件燒錄到開發(fā)板中即可使用新的 OP-TEE OS。

04 Yocto外獨(dú)立編譯OP-TEE OS

在某些情況下(例如調(diào)試、裁剪,或在非Yocto平臺(tái)上使用),我們需要在Yocto之外獨(dú)立編譯OP-TEE OS。
4.1 獲取源碼
從官方倉(cāng)庫(kù)下載:
git clone https://github.com/renesas-rz/rzg_optee-os.gitcd rzg_optee-os
對(duì)于RZ/G2L平臺(tái),Renesas提供了修改過的分支,例如:
git checkout -b 3.19.0/rz origin/3.19.0/rz4.2 編譯指令
這里以使用poky交叉編譯工具鏈為例。
注:OP-TEE OS的編譯不建議使用source導(dǎo)入SDK環(huán)境腳本,原因有三:
source會(huì)設(shè)置ARCH=arm64(Linux Kernel規(guī)范),但OP-TEE需要ARCH=arm;
source會(huì)設(shè)置LDFLAGS/LD,與OP-TEE的鏈接流程不兼容;
因此采用手動(dòng)指定PATH和CROSS_COMPILE的方式,各變量互不干擾。
特別注意:編譯前請(qǐng)確保終端環(huán)境干凈,不要 source任何版本的SDK。
建議新開一個(gè)終端窗口來執(zhí)行編譯。
export PATH=/opt/poky/3.1.33/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/:$PATHexport CROSS_COMPILE=aarch64-poky-linux-export PLATFORM=rzexport PLATFORM_FLAVOR=g2l_smarc_2export CFG_ARM64_core=yexport CFG_RZ_SCE=y # 啟用后會(huì)聯(lián)動(dòng) CFG_RZ_TSIP=y,關(guān)閉 CFG_WITH_SOFTWARE_PRNGexport CFG_RZ_SCE_LIB_DIR=/path/to/your/SCE/Lib/ # 請(qǐng)?zhí)鎿Q為實(shí)際路徑make clean O=out/armmake -j$(nproc) O=out/arm \PLATFORM=${PLATFORM} \PLATFORM_FLAVOR=${PLATFORM_FLAVOR} \CFG_ARM64_core=${CFG_ARM64_core} \CFG_RZ_SCE=${CFG_RZ_SCE} \CFG_RZ_SCE_LIB_DIR=${CFG_RZ_SCE_LIB_DIR} \CROSS_COMPILE=${CROSS_COMPILE} \
編譯后會(huì)生成tee-raw.bin,它就是下圖中的BL32,這是需要打包進(jìn)FIP的核心固件文件。

rzg_optee-os也支持Linaro編譯器編譯。

05 添加Pseudo Trusted Application
(PTA)

5.1 PTA的作用
Pseudo Trusted Application(PTA)是嵌入在OP-TEE OS內(nèi)部的特殊TA,它直接運(yùn)行在Secure World的內(nèi)核空間,通常用于訪問底層安全資源(如OTP、RPMB)。相比于普通UTA,PTA更加貼近底層。
5.2 編譯指令
這里以otp的讀寫為例,步驟如下:
復(fù)制源文件
驅(qū)動(dòng)文件放入g2l/drivers/,例如otp.c、otp.h。
PTA文件放入g2l/pta/,例如pta_otp.c、pta_otp.h。
修改構(gòu)建文件
在g2l/drivers/sub.mk中添加:
srcs-y+=otp.c
在g2l/pta/sub.mk中添加:
srcs-y+=pta_otp.c
重新編譯
執(zhí)行Yocto或獨(dú)立編譯流程,新的OTP PTA會(huì)被編譯進(jìn)OP-TEE OS。
這樣,普通世界的應(yīng)用(CA)便可以通過Client API→PTA接口訪問OTP。

06 固件簽名與整合進(jìn)FIP

6.1 FIP簡(jiǎn)介
在Arm平臺(tái)中,最終的固件通常會(huì)打包成FIP(Firmware Image Package)。其中包含:
BL31(TF-A)
BL32(OP-TEE OS)
BL33(U-Boot)
在RZ/G2L平臺(tái)中,OP-TEE的tee-raw.bin會(huì)作為BL32被打包進(jìn)FIP。
6.2 打包流程
確認(rèn)編譯生成的tee-raw.bin。
使用TF-A的fiptool工具,將其打包入FIP格式固件:
$ fiptool create \--align 16 --tos-fw tee-raw.bin \--align 16 --nt-fw u-boot.bin \fip.bin
如果啟用了安全啟動(dòng),針對(duì)RZ/G2L還需要對(duì)tee-raw.bin進(jìn)行簽名與加密

然后通過fiptool工具將其打包入FIP格式固件:

確保固件不可篡改。
燒錄fip-tbb_pmic.srec到Flash,重新啟動(dòng)開發(fā)板即可。

07 總結(jié)與展望

本文圍繞OP-TEE OS展開,介紹了OP-TEE OS的架構(gòu)與功能、在Yocto下的編譯步驟與固件打包、獨(dú)立于Yocto的編譯方法、添加Pseudo TA(以O(shè)TP PTA為例)的完整流程、將OP-TEE OS簽名、打包進(jìn)FIP的方法。
通過這些內(nèi)容,讀者應(yīng)當(dāng)能夠在實(shí)際項(xiàng)目中成功構(gòu)建并部署OP-TEE OS。在下一篇文章中,我們將深入講解OP-TEE Client,包括源碼獲取、編譯方法以及l(fā)ibteec.so與tee-supplicant的作用。
如需了解更詳細(xì)的使用方法,請(qǐng)識(shí)別下方二維碼或復(fù)制鏈接到瀏覽器打開查閱。
https://www.renesas.cn/cn/zh/products/microcontrollers-microprocessors/rz-mpus/rzg2l-getting-started

https://renesas.info/wiki/Main_Page

如您在使用瑞薩MCU/MPU產(chǎn)品中有任何問題,可識(shí)別下方二維碼或復(fù)制網(wǎng)址到瀏覽器中打開,進(jìn)入瑞薩MCU/MPU官方技術(shù)論壇尋找答案或獲取在線技術(shù)支持。
https://bbs.21ic.com/renesas
未完待續(xù)
推薦閱讀
瑞薩RZ/G2L Bootloader單獨(dú)編譯方法詳解
瑞薩RZ/G2L MPU的DDR配置 (3)
瑞薩RZ/G2L量產(chǎn)提速利器:Fastboot模式下的eMMC高效燒錄方案

