第2章:OP-TEE项目概览

好,咱们正式开始接触OP-TEE。这一章我会带你从三个角度切入:架构长什么样、源码怎么组织的、以及怎么把编译环境搭起来。说白了,就是让你先对整个项目有个全局印象,别一上来就扎进代码细节里出不来。

2.1 OP-TEE的架构

OP-TEE的架构,我习惯把它理解成「三块板子搭起来的桥」。哪三块?

  • REE侧(正常世界):跑Linux、Android这些通用OS的地方。应用层叫CA(Client Application),通过TEE Client API发起安全请求。
  • TEE侧(安全世界):跑OP-TEE OS的地方。这里的应用叫TA(Trusted Application),处理敏感数据,比如密钥、指纹特征。
  • Monitor模式:负责切换世界。ARM架构里叫SMC(Secure Monitor Call),这是硬件级别的上下文切换。

你想想看,为什么非得分两个世界?

我在项目中遇到过一件事:有个客户把用户密码直接存在Linux文件系统里,结果被root提权拿走了。后来改成存到TEE侧,就算Linux被攻破,密码也拿不到。这就是隔离的价值。

核心思想:REE侧不可信,TEE侧可信。所有敏感操作必须挪到TEE侧执行。

下面这张图是我自己画的架构关系,你看一眼就能明白数据流怎么走的:

REE侧(正常世界) Linux / Android CA应用 (Client App) TEE Client API SMC调用 (Monitor切换) TEE侧(安全世界) OP-TEE OS TA应用 (Trusted App) TEE Internal API 安全硬件 (密钥存储 / 安全时钟 / 真随机数)

个人经验:刚开始接触时,别纠结Monitor模式的实现细节。你只需要记住:CA调用TA时,数据会经过共享内存传递,而共享内存是双方都能访问的物理内存区域。

2.2 OP-TEE的源码结构

源码结构这事儿,我建议你直接去GitHub上拉一份下来对照着看。这里我挑几个关键目录说说:

目录/文件 作用 我踩过的坑
core/ OP-TEE内核代码,包括SMC处理、内存管理、线程调度 改过这里的线程栈大小,结果系统起不来
ta/ TA开发框架和示例TA 示例TA里的hello_world是入门最好的起点
lib/ 密码库、数学库、TEE Internal API实现 别自己造轮子,直接用libutee
scripts/ 编译脚本、签名工具、打包工具 签名脚本的参数顺序搞错过,折腾了一下午
build/ 构建系统(基于CMake) 建议用Docker编译,省去环境依赖的麻烦

嗯,这里要注意:core/arch/arm/ 下面才是真正跟硬件平台相关的代码。如果你要移植到新板子,主要改这里。

2.3 OP-TEE的编译环境搭建

编译环境搭建,说白了就是装工具链、下源码、跑脚本。我建议你直接用官方提供的Docker镜像,省心。

2.3.1 环境要求

  • 操作系统:Ubuntu 20.04/22.04(我用的是22.04,没出过问题)
  • 工具链:aarch64-linux-gnu-gcc(交叉编译用)
  • 依赖包:python3、cmake、make、git、curl、uuid-dev
  • 硬件:至少4GB内存,20GB磁盘空间

2.3.2 快速搭建步骤

我个人习惯用repo工具一次性拉取所有组件:

# 1. 安装repo
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

# 2. 初始化OP-TEE项目
mkdir op-tee && cd op-tee
repo init -u https://github.com/OP-TEE/manifest.git -m qemu_v8.xml
repo sync -j4

# 3. 编译(第一次会比较慢)
cd build
make -j4 toolchains
make -j4 all

避坑指南:我曾经因为网络问题,repo sync反复失败。解决办法是设置git代理,或者用国内镜像源。另外,make toolchains这一步会下载几百MB的交叉编译器,确保网络稳定。

2.3.3 验证编译结果

编译成功后,你会看到这些输出文件:

out/bin/
├── tee-pager_v2.bin       # OP-TEE OS镜像
├── bl31.bin               # ARM Trusted Firmware
├── Image                  # Linux内核
└── rootfs.cpio.gz         # 根文件系统

用QEMU跑一下试试:

make run-only

看到OP-TEE的启动日志,就说明环境搭好了。

小技巧:如果你只想编译TA而不编译整个系统,可以单独执行 make ta。我调试TA时经常这么干,能省一半时间。

好了,这一章的内容就这些。架构图你存好,源码结构记个大概,编译环境照着步骤来一遍。下一章我们会深入TA开发,到时候这些基础都用得上。

本章要点回顾:

  • OP-TEE分REE、TEE、Monitor三层,核心是隔离
  • 源码主要关注core/、ta/、lib/、build/四个目录
  • 编译用repo + make,推荐Docker或QEMU环境
可可精品资料库