Skip to main content

OP-TEE GP存储平台集成分析

平台集成架构概览

OP-TEE存储系统设计为平台无关的架构,通过抽象层支持不同硬件平台的存储特性,包括RPMB、安全存储区域和平台特定的优化。
┌─────────────────────────────────────────────────────────────┐
│                 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
# 平台特定存储配置示例
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
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
#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
#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
#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
#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
/* 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平台实现
/* 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平台实现
/* 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. 平台配置验证

配置一致性检查

/* 平台配置验证 */
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;
}

运行时平台检测

/* 运行时平台特性检测 */
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:创建平台目录

# 创建新平台目录
mkdir optee_os/core/arch/arm/plat-newplatform/

# 复制模板文件
cp optee_os/core/arch/arm/plat-vexpress/* \
   optee_os/core/arch/arm/plat-newplatform/

步骤2:配置平台特性

# 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:实现平台接口

/* 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. 平台测试和验证

功能测试

/* 平台存储功能测试 */
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);
}

性能基准测试

/* 平台存储性能测试 */
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存储平台集成框架具有以下特点:
  1. 平台无关设计: 通过抽象层支持多种硬件平台
  2. 灵活配置: 支持平台特定的配置和优化
  3. 驱动抽象: 统一的驱动接口支持不同硬件实现
  4. 运行时检测: 动态检测和适配平台特性
  5. 易于移植: 清晰的移植指南和模板代码
这个平台集成框架使OP-TEE存储系统能够在各种ARM平台上高效运行,同时保持代码的可维护性和可扩展性。