OP-TEE GP存储平台集成分析
平台集成架构概览
OP-TEE存储系统设计为平台无关的架构,通过抽象层支持不同硬件平台的存储特性,包括RPMB、安全存储区域和平台特定的优化。Copy
┌─────────────────────────────────────────────────────────────┐
│ GP Storage API Layer │ ← 平台无关API
├─────────────────────────────────────────────────────────────┤
│ Platform Abstraction Layer │ ← 平台抽象层
├─────────────────────────────────────────────────────────────┤
│ Platform-Specific Implementations │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │
│ │ ARM Plat │ │ QEMU Plat │ │ Vendor Plats │ │ ← 平台特定实现
│ └──────────────┘ └──────────────┘ └──────────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ Hardware Abstraction Layer │ ← 硬件抽象层
├─────────────────────────────────────────────────────────────┤
│ Hardware Layer │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │
│ │ eMMC │ │ Flash/NAND │ │ Secure Storage │ │ ← 硬件存储
│ │ RPMB │ │ Memory │ │ Elements │ │
│ └──────────────┘ └──────────────┘ └──────────────────┘ │
└─────────────────────────────────────────────────────────────┘
平台配置框架
1. 平台配置文件结构
通用平台配置
位置:optee_os/core/arch/arm/plat-*/conf.mk
Copy
# 平台特定存储配置示例
include core/arch/arm/cpu/cortex-armv8-0.mk
# 存储后端配置
CFG_REE_FS ?= y # 启用REE文件系统
CFG_RPMB_FS ?= y # 启用RPMB文件系统
CFG_RPMB_TESTKEY ?= y # 使用RPMB测试密钥
# 存储路径配置
CFG_TEE_FS_PARENT_PATH ?= /data/tee # REE存储根路径
# 缓存配置
CFG_RPMB_FS_CACHE_ENTRIES ?= 8 # RPMB缓存条目数
CFG_TEE_POBJ_CACHE_SIZE ?= 16 # 持久化对象缓存大小
# 安全配置
CFG_STORAGE_ENCRYPTION ?= y # 启用存储加密
CFG_STORAGE_HUK_REQUIRED ?= y # 要求硬件唯一密钥
# 性能配置
CFG_STORAGE_BLOCK_SIZE ?= 4096 # 存储块大小
CFG_STORAGE_MAX_FILE_SIZE ?= 0x100000 # 最大文件大小
ARM平台配置示例
位置:optee_os/core/arch/arm/plat-vexpress/conf.mk
Copy
include core/arch/arm/cpu/cortex-a15.mk
# VExpress平台特定配置
CFG_ARM32_core ?= y
CFG_SECURE_TIME_SOURCE_CNTPCT ?= y
# 存储配置
CFG_REE_FS ?= y
CFG_RPMB_FS ?= n # VExpress通常不支持RPMB
CFG_SQL_FS ?= n # 不使用SQL文件系统
# 内存配置
CFG_CORE_HEAP_SIZE ?= 65536 # 核心堆大小
CFG_TEE_RAM_VA_SIZE ?= 0x100000 # TEE RAM虚拟地址空间
# 调试配置
CFG_TEE_CORE_LOG_LEVEL ?= 1 # 日志级别
CFG_STORAGE_DEBUG ?= n # 存储调试开关
2. 平台硬件抽象层
RPMB硬件抽象
位置:optee_os/core/arch/arm/plat-*/platform_config.h
Copy
#ifndef PLATFORM_CONFIG_H
#define PLATFORM_CONFIG_H
#include <mm/generic_ram_layout.h>
/* 平台特定的RPMB配置 */
#define CFG_RPMB_FS 1
#define RPMB_BASE_ADDRESS 0x00000000
#define RPMB_SIZE (128 * 1024) /* 128KB RPMB */
#define RPMB_BLOCK_SIZE 256
#define RPMB_MAX_BLOCK_COUNT (RPMB_SIZE / RPMB_BLOCK_SIZE)
/* eMMC控制器配置 */
#define EMMC_BASE 0x12345000
#define EMMC_IRQ 72
/* 安全存储区域配置 */
#define SECURE_STORAGE_BASE 0x80000000
#define SECURE_STORAGE_SIZE 0x1000000 /* 16MB */
/* 密钥存储配置 */
#define HUK_STORAGE_BASE 0x81000000
#define HUK_STORAGE_SIZE 0x1000 /* 4KB */
/* 平台特定的存储路径 */
#define TEE_STORAGE_PATH "/data/tee"
#define TEE_STORAGE_BACKUP_PATH "/data/tee_backup"
#endif /* PLATFORM_CONFIG_H */
平台特定的硬件接口
位置:optee_os/core/arch/arm/plat-*/platform.c
Copy
#include <platform_config.h>
#include <tee/tee_fs.h>
#include <drivers/rpmb.h>
/* 平台初始化 */
void platform_init(void)
{
/* 初始化存储相关硬件 */
platform_storage_init();
}
/* 平台存储初始化 */
static void platform_storage_init(void)
{
TEE_Result res;
/* 1. 初始化eMMC控制器 */
res = emmc_controller_init(EMMC_BASE);
if (res != TEE_SUCCESS) {
EMSG("Failed to initialize eMMC controller: %x", res);
return;
}
/* 2. 检测RPMB支持 */
if (platform_has_rpmb()) {
res = rpmb_init();
if (res != TEE_SUCCESS) {
EMSG("Failed to initialize RPMB: %x", res);
} else {
IMSG("RPMB initialized successfully");
}
}
/* 3. 初始化安全存储区域 */
if (platform_has_secure_storage()) {
res = secure_storage_init(SECURE_STORAGE_BASE, SECURE_STORAGE_SIZE);
if (res != TEE_SUCCESS) {
EMSG("Failed to initialize secure storage: %x", res);
}
}
/* 4. 初始化HUK存储 */
res = huk_storage_init(HUK_STORAGE_BASE, HUK_STORAGE_SIZE);
if (res != TEE_SUCCESS) {
EMSG("Failed to initialize HUK storage: %x", res);
}
}
/* 平台特性检测 */
bool platform_has_rpmb(void)
{
#ifdef CFG_RPMB_FS
/* 检查硬件是否支持RPMB */
return emmc_has_rpmb_support();
#else
return false;
#endif
}
bool platform_has_secure_storage(void)
{
/* 检查是否有专用安全存储区域 */
return check_secure_storage_availability();
}
/* 平台特定的HUK获取 */
TEE_Result platform_get_huk(uint8_t *huk, size_t huk_len)
{
if (huk_len != HUK_SIZE)
return TEE_ERROR_BAD_PARAMETERS;
/* 从硬件安全区域读取HUK */
return read_hardware_unique_key(huk);
}
3. 驱动程序抽象
RPMB驱动抽象
位置:optee_os/core/drivers/rpmb.c
Copy
#include <drivers/rpmb.h>
#include <platform_config.h>
/* RPMB驱动操作结构 */
struct rpmb_driver_ops {
TEE_Result (*init)(void);
TEE_Result (*read)(uint16_t addr, uint8_t *data, uint16_t count);
TEE_Result (*write)(uint16_t addr, const uint8_t *data, uint16_t count);
TEE_Result (*get_counter)(uint32_t *counter);
TEE_Result (*program_key)(const uint8_t *key);
void (*cleanup)(void);
};
/* 平台特定的RPMB驱动 */
#ifdef PLATFORM_FLAVOR_qemu_virt
extern struct rpmb_driver_ops qemu_rpmb_ops;
#define platform_rpmb_ops qemu_rpmb_ops
#elif defined(PLATFORM_FLAVOR_hikey)
extern struct rpmb_driver_ops hikey_rpmb_ops;
#define platform_rpmb_ops hikey_rpmb_ops
#elif defined(PLATFORM_FLAVOR_rpi3)
extern struct rpmb_driver_ops rpi3_rpmb_ops;
#define platform_rpmb_ops rpi3_rpmb_ops
#else
extern struct rpmb_driver_ops generic_rpmb_ops;
#define platform_rpmb_ops generic_rpmb_ops
#endif
/* RPMB通用接口实现 */
static struct rpmb_driver_ops *rpmb_ops = &platform_rpmb_ops;
TEE_Result rpmb_init(void)
{
if (!rpmb_ops->init)
return TEE_ERROR_NOT_SUPPORTED;
return rpmb_ops->init();
}
TEE_Result rpmb_read(uint16_t addr, uint8_t *data, uint16_t count)
{
if (!rpmb_ops->read)
return TEE_ERROR_NOT_SUPPORTED;
return rpmb_ops->read(addr, data, count);
}
TEE_Result rpmb_write(uint16_t addr, const uint8_t *data, uint16_t count)
{
if (!rpmb_ops->write)
return TEE_ERROR_NOT_SUPPORTED;
return rpmb_ops->write(addr, data, count);
}
QEMU平台RPMB实现
位置:optee_os/core/arch/arm/plat-virt/rpmb_qemu.c
Copy
#include <drivers/rpmb.h>
#include <io.h>
/* QEMU RPMB模拟器寄存器 */
#define QEMU_RPMB_BASE 0x09030000
#define QEMU_RPMB_CMD_REG (QEMU_RPMB_BASE + 0x00)
#define QEMU_RPMB_ADDR_REG (QEMU_RPMB_BASE + 0x04)
#define QEMU_RPMB_DATA_REG (QEMU_RPMB_BASE + 0x08)
#define QEMU_RPMB_STATUS_REG (QEMU_RPMB_BASE + 0x0C)
#define QEMU_RPMB_COUNTER_REG (QEMU_RPMB_BASE + 0x10)
/* QEMU RPMB命令 */
#define QEMU_RPMB_CMD_READ 0x01
#define QEMU_RPMB_CMD_WRITE 0x02
#define QEMU_RPMB_CMD_GET_CNT 0x03
#define QEMU_RPMB_CMD_PROG_KEY 0x04
static TEE_Result qemu_rpmb_init(void)
{
uint32_t status;
/* 检查QEMU RPMB设备是否可用 */
status = io_read32(QEMU_RPMB_STATUS_REG);
if (status != 0x12345678) {
EMSG("QEMU RPMB device not found");
return TEE_ERROR_ITEM_NOT_FOUND;
}
IMSG("QEMU RPMB device initialized");
return TEE_SUCCESS;
}
static TEE_Result qemu_rpmb_read(uint16_t addr, uint8_t *data, uint16_t count)
{
/* 设置读取地址 */
io_write32(QEMU_RPMB_ADDR_REG, addr);
/* 发送读取命令 */
io_write32(QEMU_RPMB_CMD_REG, QEMU_RPMB_CMD_READ | (count << 16));
/* 等待操作完成 */
while (io_read32(QEMU_RPMB_STATUS_REG) & 0x1) {
/* 等待忙标志清除 */
}
/* 读取数据 */
for (uint16_t i = 0; i < count; i++) {
data[i] = io_read8(QEMU_RPMB_DATA_REG + i);
}
return TEE_SUCCESS;
}
static TEE_Result qemu_rpmb_write(uint16_t addr, const uint8_t *data,
uint16_t count)
{
/* 写入数据 */
for (uint16_t i = 0; i < count; i++) {
io_write8(QEMU_RPMB_DATA_REG + i, data[i]);
}
/* 设置写入地址 */
io_write32(QEMU_RPMB_ADDR_REG, addr);
/* 发送写入命令 */
io_write32(QEMU_RPMB_CMD_REG, QEMU_RPMB_CMD_WRITE | (count << 16));
/* 等待操作完成 */
while (io_read32(QEMU_RPMB_STATUS_REG) & 0x1) {
/* 等待忙标志清除 */
}
return TEE_SUCCESS;
}
static TEE_Result qemu_rpmb_get_counter(uint32_t *counter)
{
/* 发送获取计数器命令 */
io_write32(QEMU_RPMB_CMD_REG, QEMU_RPMB_CMD_GET_CNT);
/* 等待操作完成 */
while (io_read32(QEMU_RPMB_STATUS_REG) & 0x1) {
/* 等待忙标志清除 */
}
/* 读取计数器值 */
*counter = io_read32(QEMU_RPMB_COUNTER_REG);
return TEE_SUCCESS;
}
/* QEMU平台RPMB驱动操作 */
struct rpmb_driver_ops qemu_rpmb_ops = {
.init = qemu_rpmb_init,
.read = qemu_rpmb_read,
.write = qemu_rpmb_write,
.get_counter = qemu_rpmb_get_counter,
.program_key = NULL, /* QEMU不需要编程密钥 */
.cleanup = NULL
};
4. 平台特定优化
ARM平台优化
位置:optee_os/core/arch/arm/plat-*/platform_storage.c
Copy
/* ARM平台存储优化 */
/* 利用ARM TrustZone安全存储 */
static TEE_Result arm_secure_storage_init(void)
{
/* 配置TrustZone安全区域 */
configure_trustzone_secure_region(SECURE_STORAGE_BASE,
SECURE_STORAGE_SIZE);
/* 设置存储访问权限 */
set_secure_storage_permissions();
return TEE_SUCCESS;
}
/* ARM缓存优化 */
static void arm_storage_cache_optimize(void)
{
/* 为存储缓冲区设置缓存属性 */
set_cache_attributes(STORAGE_BUFFER_BASE, STORAGE_BUFFER_SIZE,
CACHE_WRITEBACK | CACHE_ALLOCATE);
/* 预取常用存储数据到缓存 */
prefetch_storage_metadata();
}
/* ARM DMA优化(如果支持) */
static TEE_Result arm_storage_dma_init(void)
{
if (platform_has_secure_dma()) {
return secure_dma_init_for_storage();
}
return TEE_SUCCESS;
}
供应商特定实现
HiKey平台实现
Copy
/* HiKey平台特定的存储实现 */
#define HIKEY_UFS_BASE 0xF723D000
#define HIKEY_RPMB_KEY_ADDR 0xF7110000
static TEE_Result hikey_storage_init(void)
{
TEE_Result res;
/* 初始化UFS控制器 */
res = hikey_ufs_init(HIKEY_UFS_BASE);
if (res != TEE_SUCCESS) {
return res;
}
/* 初始化RPMB with HiKey特定密钥 */
if (CFG_RPMB_FS) {
res = hikey_rpmb_init_with_key(HIKEY_RPMB_KEY_ADDR);
if (res != TEE_SUCCESS) {
EMSG("HiKey RPMB init failed: %x", res);
}
}
return TEE_SUCCESS;
}
/* HiKey特定的HUK获取 */
static TEE_Result hikey_get_huk(uint8_t *huk, size_t len)
{
/* 从HiKey安全启动密钥派生HUK */
return hikey_derive_huk_from_secure_boot_key(huk, len);
}
Raspberry Pi平台实现
Copy
/* Raspberry Pi平台存储实现 */
#define RPI_MAILBOX_BASE 0x3F00B880
#define RPI_STORAGE_PROPERTY 0x00030064
static TEE_Result rpi_storage_init(void)
{
/* Raspberry Pi通常只支持REE文件系统 */
if (CFG_REE_FS) {
/* 设置GPIO引脚用于存储指示 */
rpi_gpio_setup_storage_indicator();
/* 优化SD卡访问性能 */
rpi_sdcard_optimize_performance();
}
return TEE_SUCCESS;
}
/* 通过GPU mailbox获取设备特定信息 */
static TEE_Result rpi_get_device_info(struct device_info *info)
{
/* 使用VideoCore GPU mailbox获取设备序列号等信息 */
return rpi_mailbox_get_device_info(RPI_MAILBOX_BASE, info);
}
5. 平台配置验证
配置一致性检查
Copy
/* 平台配置验证 */
static TEE_Result validate_platform_storage_config(void)
{
TEE_Result res = TEE_SUCCESS;
/* 1. 检查存储后端配置 */
if (!CFG_REE_FS && !CFG_RPMB_FS) {
EMSG("No storage backend enabled");
res = TEE_ERROR_GENERIC;
}
/* 2. 检查RPMB配置一致性 */
if (CFG_RPMB_FS && !platform_has_rpmb()) {
EMSG("RPMB FS enabled but platform doesn't support RPMB");
res = TEE_ERROR_GENERIC;
}
/* 3. 检查内存配置 */
if (CFG_CORE_HEAP_SIZE < MIN_STORAGE_HEAP_SIZE) {
EMSG("Core heap size too small for storage operations");
res = TEE_ERROR_GENERIC;
}
/* 4. 检查路径配置 */
if (CFG_REE_FS && !CFG_TEE_FS_PARENT_PATH) {
EMSG("REE FS enabled but no parent path configured");
res = TEE_ERROR_GENERIC;
}
/* 5. 检查安全配置 */
if (CFG_STORAGE_ENCRYPTION && !CFG_STORAGE_HUK_REQUIRED) {
EMSG("Storage encryption enabled but HUK not required");
res = TEE_ERROR_GENERIC;
}
return res;
}
运行时平台检测
Copy
/* 运行时平台特性检测 */
static void detect_platform_storage_features(void)
{
struct platform_storage_caps caps = {0};
/* 检测RPMB支持 */
caps.has_rpmb = platform_has_rpmb();
if (caps.has_rpmb) {
caps.rpmb_size = get_rpmb_size();
caps.rpmb_block_size = get_rpmb_block_size();
}
/* 检测安全存储支持 */
caps.has_secure_storage = platform_has_secure_storage();
if (caps.has_secure_storage) {
caps.secure_storage_size = get_secure_storage_size();
}
/* 检测DMA支持 */
caps.has_secure_dma = platform_has_secure_dma();
/* 检测缓存特性 */
caps.cache_line_size = get_cache_line_size();
caps.has_cache_coherency = platform_has_cache_coherency();
/* 存储平台能力信息 */
store_platform_capabilities(&caps);
IMSG("Platform storage capabilities detected:");
IMSG(" RPMB: %s (size: %u)", caps.has_rpmb ? "yes" : "no", caps.rpmb_size);
IMSG(" Secure storage: %s", caps.has_secure_storage ? "yes" : "no");
IMSG(" Secure DMA: %s", caps.has_secure_dma ? "yes" : "no");
}
平台移植指南
1. 新平台移植步骤
步骤1:创建平台目录
Copy
# 创建新平台目录
mkdir optee_os/core/arch/arm/plat-newplatform/
# 复制模板文件
cp optee_os/core/arch/arm/plat-vexpress/* \
optee_os/core/arch/arm/plat-newplatform/
步骤2:配置平台特性
Copy
# conf.mk - 平台配置
include core/arch/arm/cpu/cortex-a53.mk
# 存储配置
CFG_REE_FS ?= y
CFG_RPMB_FS ?= $(call cfg-one-enabled, CFG_RPMB_EMMC)
CFG_RPMB_TESTKEY ?= n
# 平台特定存储路径
CFG_TEE_FS_PARENT_PATH ?= /mnt/secure/tee
# 性能配置
CFG_RPMB_FS_CACHE_ENTRIES ?= 16
CFG_CORE_HEAP_SIZE ?= 131072
步骤3:实现平台接口
Copy
/* platform.c - 平台特定实现 */
void platform_init(void)
{
/* 初始化平台存储 */
newplatform_storage_init();
}
TEE_Result platform_get_huk(uint8_t *huk, size_t len)
{
/* 实现平台特定的HUK获取 */
return newplatform_get_hardware_key(huk, len);
}
bool platform_has_rpmb(void)
{
/* 检查平台RPMB支持 */
return newplatform_check_rpmb_support();
}
2. 平台测试和验证
功能测试
Copy
/* 平台存储功能测试 */
static void test_platform_storage_functions(void)
{
TEE_Result res;
uint8_t test_data[256];
/* 测试HUK获取 */
res = platform_get_huk(test_data, HUK_SIZE);
assert(res == TEE_SUCCESS);
/* 测试RPMB功能(如果支持) */
if (platform_has_rpmb()) {
res = test_rpmb_read_write();
assert(res == TEE_SUCCESS);
}
/* 测试REE文件系统 */
res = test_ree_fs_operations();
assert(res == TEE_SUCCESS);
}
性能基准测试
Copy
/* 平台存储性能测试 */
static void benchmark_platform_storage(void)
{
uint64_t start_time, end_time;
/* RPMB性能测试 */
if (platform_has_rpmb()) {
start_time = get_time_us();
perform_rpmb_benchmark();
end_time = get_time_us();
IMSG("RPMB performance: %llu us", end_time - start_time);
}
/* REE FS性能测试 */
start_time = get_time_us();
perform_ree_fs_benchmark();
end_time = get_time_us();
IMSG("REE FS performance: %llu us", end_time - start_time);
}
最佳实践建议
1. 平台移植建议
- 逐步移植: 先实现基本功能,再添加优化特性
- 配置验证: 确保平台配置的一致性和正确性
- 性能测试: 针对平台特性进行性能优化
- 安全考虑: 评估平台特定的安全威胁和防护
2. 兼容性维护
- 向后兼容: 保持与现有GP API的兼容性
- 平台抽象: 使用抽象层隔离平台特定代码
- 配置灵活: 支持运行时配置和特性检测
- 文档更新: 及时更新平台特定的文档
3. 调试和优化
- 调试工具: 实现平台特定的调试接口
- 日志记录: 添加详细的平台操作日志
- 错误处理: 提供平台特定的错误恢复机制
- 监控指标: 收集平台存储性能指标
总结
OP-TEE的GP存储平台集成框架具有以下特点:- 平台无关设计: 通过抽象层支持多种硬件平台
- 灵活配置: 支持平台特定的配置和优化
- 驱动抽象: 统一的驱动接口支持不同硬件实现
- 运行时检测: 动态检测和适配平台特性
- 易于移植: 清晰的移植指南和模板代码