前言:因为芯片内一些私密文档需要用到OP-TEE,貌似我这边没人搞过…so又开始自学之旅
1 目的
本文介绍了从源构建多个 OP-TEE 组件并将其部署到目标的配置和过程。 该构建示例基于 OpenSTLinux 开发包或分发包,并且还提供了裸环境的构建说明。
2 概述
OP-TEE 是适用于 Arm®v7-A 和 Arm®v8-A 平台的可信执行环境。 OP-TEE 由 OP-TEE 架构概述中描述的多个组件组成。 OP-TEE 组件生成启动映像和存储在目标中嵌入的文件系统中的文件。
- OP-TEE OS 生成 3 个启动映像文件,加载到平台启动介质的预定义分区中。生成的启动映像包括 STM32 二进制标头,支持使用经过验证的启动和闪存编程工具。
- 可以构建 OP-TEE 客户端(包 optee_client)来为 OP-TEE 操作系统生成非安全服务。 optee_client 构建生成的文件存储在嵌入式文件系统中。
- OP-TEE 项目发布了其他用于测试和演示的软件包。这些可以构建并嵌入到目标文件系统中。构建 optee_examples 和 optee_test 会生成客户端和可信应用程序以及全部存储在目标文件系统中的库。请注意,OP-TEE Linux 驱动程序内置于 Linux 内核映像中,并且是 OP-TEE 生态系统的一部分。
OP-TEE 可以作为 BL32 嵌入到 STM32 MPU 平台中,以实现 ST 可信配置
注意:OP-TEE 启动映像必须嵌入到 BL2 加载的 FIP 二进制文件中,并且可以自动进行身份验证
3 OP-TEE核心配置
OP-TEE 操作系统需要超过 256Ko RAM。 SYSRAM只有256Ko,OP-TEE内核必须使用分页模式来使用DDR扩展内存。
OP-TEE OS 由 FSBL 加载到 SYSRAM 的开头。 OP-TEE 可以将内存扩展到完整的 SYSRAM。当使用分页器时,代码的第二部分被加载到受限制的安全可访问区域中的 DDR(可分页部分)中。
OP-TEE OS 通过将其上下文保存在 DDR(加密区域)中来管理低功耗模式,该上下文由保存在安全备份 SRAM 中的受保护执行代码恢复。
OP-TEE OS 实现以下secure services:
- PSCI services
- 系统重置
- CPU热插拔
- 低电量
- SCMI services
- 时钟管理
- 重置管理
- OTP 访问 services
- PWR services
- PWR 监管机构对非安全 IP 的访问
- 唤醒源管理
- RCC services 访问受限
- OPP 请求管理
- 校准触发
4 使用分发包构建
分发包提供了从相关 bitbake 目标构建以下 OP-TEE 组件的方法:
代码语言:javascript复制 bitbake optee-os-stm32mp # OP-TEE core firmware
bitbake optee-os-sdk-stm32mp # OP-TEE development kit for Trusted Applications
bitbake optee-client # OP-TEE client
bitbake optee-test # OP-TEE test suite (optional)
bitbake optee-examples # TA and CA examples
分发包构建过程包括获取源文件、编译它们并将它们安装到目标映像。
OP-TEE 包的 Yocto 配方可以在以下位置找到:
代码语言:javascript复制meta-st/meta-st-stm32mp/recipes-security/optee/optee-os-stm32mp*
meta-st/meta-st-openstlinux/recipes-security/optee/optee-client*
meta-st/meta-st-openstlinux/recipes-security/optee/optee-examples*
meta-st/meta-st-openstlinux/recipes-security/optee/optee-test*
5 使用开发者包或裸环境构建
开发人员包和裸构建环境都希望您获取/下载 OP-TEE 包源文件树,以便构建嵌入式二进制映像。
下面的指令集假设所有 OP-TEE 包源代码树在称为 <sources>/
的基本目录中可用。源文件可从 github 存储库获取:
cd <sources>/
git clone https://github.com/STMicroelectronics/optee_os.git
git clone https://github.com/OP-TEE/optee_client.git
git clone https://github.com/OP-TEE/optee_test.git
git clone https://github.com/linaro-swg/optee_examples.git
ls -1 <sources>/
optee_client
optee_examples
optee_os
optee_test
STM32 MPU 平台可能未完全合并到官方 OP-TEE 存储库 [1] 中,因此上面提供的 URL 指的是 ST 发行版
5.1 初始化交叉编译环境
可以使用开发包提供的编译工具链,参考设置交叉编译环境。
或者,可以使用其他裸工具链来构建 OP-TEE 安全部件。在这种情况下,下面的说明期望工具链成为 PATH 的一部分,并且其前缀由 CROSS_COMPILE 定义。人们可以使用类似的东西:
代码语言:javascript复制export PATH=<path-to-toolchain>:$PATH
export CROSS_COMPILE=<toolchain-prefix>-
5.2 构建OP-TEE操作系统
5.2.1 开发者包SDK
OP-TEE 操作系统可以通过 tarball 中的开发包 Makefile.sdk 脚本构建。它会自动为 OP-TEE OS 构建设置正确的配置。从 shell 命令构建:
代码语言:javascript复制make -f Makefile.sdk CFG_EMBED_DTB_SOURCE_FILE=<board_dts_file_name>.dts
5.2.2 裸露环境
或者,也可以基于裸交叉编译工具链构建 OP-TEE 操作系统,例如用于 stm32mp157c-ev1 板:
代码语言:javascript复制cd <optee-os>
make PLATFORM=stm32mp1
CFG_EMBED_DTB_SOURCE_FILE=stm32mp157c-ev1.dts
CFG_TEE_CORE_LOG_LEVEL=2 O=out all
5.2.3 生成文件
3 个 OP-TEE 启动映像在以下路径生成:
代码语言:javascript复制<optee-os>/out/core/tee-header_v2.bin
<optee-os>/out/core/tee-pageable_v2.bin
<optee-os>/out/core/tee-pager_v2.bin
可以在此文件中获取用于构建的配置指令:
代码语言:javascript复制<optee-os>/out/conf.mk
该构建还生成一个用于构建可信应用程序二进制文件的开发工具包:
代码语言:javascript复制<optee-os>/out/export-ta_arm32/
5.2.4 构建指令详情
构建 OP-TEE 操作系统的强制性指令:
- PLATFORM=
<platform>
- Ex: PLATFORM=stm32mp1
- CFG_EMBED_DTB_SOURCE_FILE=: in-tree (core/arch/arm/dts/ ) 设备树文件名及其 .dts 扩展名。
常见的可选指令:
- CFG_TEE_CORE_DEBUG={n|y}:禁用/启用调试支持
- CFG_TEE_CORE_LOG_LEVEL={0|1|2|3|4}:定义跟踪级别(0:无跟踪,4:跟踪溢出)
- CFG_UNWIND={n|y}:禁用/启用堆栈展开支持
对于生态系统版本 ≤ v3.0.0 兼容性
注意:内部存储器大小限制了可以提供的调试支持级别。
5.2.5 故障排除
开发包工具链可能会报告跟踪中的依赖错误,例如:
代码语言:javascript复制 make PLATFORM=stm32mp1 ...
arm-openstlinux_weston-linux-gnueabi-ld.bfd: cannot find libgcc.a: No such file or directory
要解决此问题,请添加指令 LIBGCC_LOCATE_CFLAGS=--sysroot=$SDKTARGETSYSROOT。
列如:
代码语言:javascript复制 cd <optee-os>
make PLATFORM=stm32mp1
CFG_EMBED_DTB_SOURCE_FILE=stm32mp157c-ev1.dts
CFG_TEE_CORE_LOG_LEVEL=2
LIBGCC_LOCATE_CFLAGS=--sysroot=${SDKTARGETSYSROOT}
O=out all
5.3 其他OP-TEE组件的构建命令
本节介绍如何构建多个 OP-TEE 组件(不包括上一节中描述的 OP-TEE OS)。所有这些组件都会生成针对基于嵌入式 Linux 操作系统的文件系统(即 rootfs)的文件。这些文件是安全的受信任应用程序 (TA) 二进制文件以及非安全客户端应用程序 (CA)、库和测试文件。
构建 OP-TEE 组件的方法有多种。下面给出的示例将 OP-TEE 客户端、测试和示例源文件树路径引用为 <optee-client>
、<optee-test>
和 <optee-examples>
。
至少对于可信应用程序来说,构建这些组件需要构建 OP-TEE 操作系统,并且生成的 TA 开发套件可在 <optee-os>/out/export-ta_arm32/
中找到。
建议使用 CMake 来构建 Linux 用户区部分,而安全世界二进制文件 (TA) 必须从 GNU makefile 构建,因为 OP-TEE 项目尚未通过 CMake 移植安全世界二进制文件构建过程。
5.3.1 构建安全组件
构建 TA:此步骤需要构建 OP-TEE OS 以生成 32 位 TA 开发套件。假设 OP-TEE OS 构建于路径 <optee-os>/out
,则可以从路径 <optee-os>/out/export-ta_arm32/
获取 TA 开发套件。
下面的说明构建可信应用程序二进制文件并将其复制到本地 ./target/ 目录,该目录可用于填充目标文件系统。
代码语言:javascript复制 export TA_DEV_KIT_DIR=$PWD/optee_os/out/export-ta_arm32
mkdir -p ./target/lib/optee_armtz
for f in optee_test/ta/*/Makefile; do
make -C `dirname $f` O=out;
cp -f `dirname $f`/out/*.ta ./target/lib/optee_armtz;
done
本地目录./target/
中的内容为TA二进制文件:
tree target/
target
└── lib
└── optee_armtz
├── 614789f2-39c0-4ebf-b235-92b32ac107ed.ta
├── 731e279e-aafb-4575-a771-38caa6f0cca6.ta
└── (...)
需要将这些文件复制到目标文件系统。
5.3.2 构建非安全( non-secure)组件
将 OP-TEE 源文件下载到基目录中,并在基目录中创建一个 CMakeLists.txt
文件,其中列出了要通过 CMake 构建的所有包。例如:
ls
optee_client
optee_examples
optee_os
optee_test
CMakeLists.txt
cat CMakeLists.txt
add_subdirectory (optee_client)
add_subdirectory (optee_test)
add_subdirectory (optee_examples)
从基本目录中,运行 cmake 然后 make。下面的示例还创建了树文件系统 ./target/,其中填充了生成的需要安装在目标文件系统中的文件。
请注意,此示例还设置了工具链环境:
代码语言:javascript复制 cmake -DOPTEE_TEST_SDK=$PWD/optee_os/out/export-ta_arm32
-DCMAKE_INSTALL_PREFIX= -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=y
make
make DESTDIR=target install
请注意空的 CMAKE_INSTALL_PREFIX
值是从 root / 而不是从 /usr/ 安装的。 DESTDIR=target
使嵌入文件填充到本地 ./target/ 目录中。
另请注意,stm32mp1 期望工具 tee-supplicant 位于目录 /usr/bin
中,而 CMake 将其安装在目录 /usr/sbin
中。为了解决这个问题,可以建立一个指向有效位置的链接,即:
ln -s ../bin/tee-supplicant target/sbin/tee-supplicant
完成后,本地目录 ./target/
包含要复制到目标文件系统中的文件。
tree target/
target/
├── bin
│ ├── benchmark
│ ├── optee_example_acipher
│ ├── optee_example_aes
│ ├── optee_example_hello_world
│ ├── optee_example_hotp
│ ├── optee_example_random
│ ├── optee_example_secure_storage
│ ├── tee-supplicant
│ └── xtest
├── include
│ ├── tee_bench.h
│ ├── tee_client_api_extensions.h
│ ├── tee_client_api.h
│ └── teec_trace.h
├── lib
│ ├── libteec.so -> libteec.so.1
│ ├── libteec.so.1 -> libteec.so.1.0.0
│ └── libteec.so.1.0.0
│ └── optee_armtz
│ └── (...) # This directory was previously filled with TAs
└── sbin
└── tee-supplicant -> ../bin/tee-supplicant
6 更新OP-TEE启动镜像
OP-TEE 启动映像是 FIP 二进制文件的一部分。
部署 OP-TEE 操作系统的下一步是在 FIP 更新过程之后更新 FIP 二进制文件。
7 更新OP-TEE Linux文件
7.1 Update on board
其他 OP-TEE 映像存储在目标文件系统中。
例如,如果使用 SD 卡作为目标启动介质,则可以将该卡插入其 PC 读卡器并复制映像。这些文件可以简单地复制到已安装的 rootfs 中。
7.2 SD卡更新
需要复制到目标文件系统的 OP-TEE 文件安装在本地目录 ./target/
中。
一旦 SD 卡插入主机并且其文件系统安装在主机中,现在就可以将它们复制到目标 SD 卡 rootfs 分区,即
代码语言:javascript复制 cp -ar target/* /media/$USERNAME/rootfs/
8 参考文献
- https://github.com/OP-TEE/optee_os
- https://github.com/STMicroelectronics/optee_os