Skip to main content

OP-TEE GP存储错误处理和恢复机制详细分析

错误处理架构概览

OP-TEE存储系统采用多层次错误处理机制,确保在各种故障情况下的数据完整性和系统稳定性。
┌─────────────────────────────────────────────────────────────┐
│                    GP API Error Layer                      │  ← GP标准错误码
├─────────────────────────────────────────────────────────────┤
│                TEE Service Error Layer                     │  ← TEE内核错误处理
├─────────────────────────────────────────────────────────────┤
│              Storage Backend Error Layer                   │  ← 后端特定错误
├─────────────────────────────────────────────────────────────┤
│               Hash Tree Error Layer                        │  ← 完整性验证错误
├─────────────────────────────────────────────────────────────┤
│                 RPC Error Layer                           │  ← TEE-REE通信错误
├─────────────────────────────────────────────────────────────┤
│              Hardware Error Layer                          │  ← 硬件级错误处理
└─────────────────────────────────────────────────────────────┘

GP API错误处理机制

标准错误码体系

基于GlobalPlatform规范的错误码定义:

存储相关错误码

  • TEE_ERROR_STORAGE_NOT_AVAILABLE - 存储服务不可用
  • TEE_ERROR_STORAGE_NO_SPACE - 存储空间不足
  • TEE_ERROR_ITEM_NOT_FOUND - 对象未找到
  • TEE_ERROR_ACCESS_CONFLICT - 访问冲突(对象已被打开)
  • TEE_ERROR_CORRUPT_OBJECT - 对象损坏
  • TEE_ERROR_CORRUPT_OBJECT_2 - 严重对象损坏

通用错误码

  • TEE_ERROR_GENERIC - 通用错误
  • TEE_ERROR_ACCESS_DENIED - 访问被拒绝
  • TEE_ERROR_OUT_OF_MEMORY - 内存不足
  • TEE_ERROR_BAD_PARAMETERS - 参数错误
  • TEE_ERROR_SHORT_BUFFER - 缓冲区过小

API级错误处理实现

对象创建错误处理

// 源文件: optee_os/core/tee/tee_svc_storage.c
TEE_Result TEE_CreatePersistentObject()
{
    // 1. 参数验证
    if (!objectID || objectIDLen == 0)
        return TEE_ERROR_BAD_PARAMETERS;
    
    // 2. 存储可用性检查
    if (!storage_backend_available())
        return TEE_ERROR_STORAGE_NOT_AVAILABLE;
    
    // 3. 空间检查
    if (!check_storage_space(initialDataLen))
        return TEE_ERROR_STORAGE_NO_SPACE;
    
    // 4. 权限检查
    if (!check_access_rights(flags))
        return TEE_ERROR_ACCESS_DENIED;
    
    // 5. 重复性检查
    if (object_exists(objectID))
        return TEE_ERROR_ACCESS_CONFLICT;
    
    // 6. 实际创建操作
    res = create_persistent_object(...);
    if (res != TEE_SUCCESS) {
        // 清理已分配的资源
        cleanup_partial_object();
        return res;
    }
    
    return TEE_SUCCESS;
}

对象读取错误处理

// 对象完整性验证和错误恢复
TEE_Result read_persistent_object()
{
    // 1. 哈希树验证
    res = verify_hash_tree();
    if (res == TEE_ERROR_CORRUPT_OBJECT) {
        // 尝试从备份版本恢复
        res = recover_from_backup_version();
        if (res != TEE_SUCCESS)
            return TEE_ERROR_CORRUPT_OBJECT_2;
    }
    
    // 2. 解密验证
    res = decrypt_and_verify();
    if (res != TEE_SUCCESS) {
        return TEE_ERROR_CORRUPT_OBJECT;
    }
    
    return TEE_SUCCESS;
}

TEE内核级错误处理

系统调用错误转换

位置:optee_os/core/tee/tee_svc_storage.c

错误传播机制

// 内核错误到GP错误的转换
static TEE_Result convert_kernel_error(TEE_Result kernel_res)
{
    switch (kernel_res) {
    case TEE_ERROR_FS_NO_SPACE:
        return TEE_ERROR_STORAGE_NO_SPACE;
    case TEE_ERROR_FS_NOT_AVAILABLE:
        return TEE_ERROR_STORAGE_NOT_AVAILABLE;
    case TEE_ERROR_FS_CORRUPTED:
        return TEE_ERROR_CORRUPT_OBJECT;
    default:
        return kernel_res;
    }
}

资源管理和清理

// 错误时的资源清理
static void cleanup_storage_operation(struct tee_pobj *po)
{
    if (po) {
        // 1. 释放文件句柄
        if (po->fh)
            tee_file_ops->close(&po->fh);
        
        // 2. 清除缓存
        clear_object_cache(po);
        
        // 3. 释放内存
        free(po);
        
        // 4. 更新引用计数
        decrement_ref_count();
    }
}

存储后端错误处理

REE文件系统后端错误处理

位置:optee_os/core/tee/tee_ree_fs.c

写时复制错误恢复

// COW操作失败时的回滚机制
static TEE_Result cow_error_recovery(struct ree_fs_file *f)
{
    // 1. 恢复到原始版本
    if (f->backup_version) {
        restore_from_backup(f);
    }
    
    // 2. 清理临时文件
    cleanup_temp_files(f);
    
    // 3. 重置文件状态
    reset_file_state(f);
    
    return TEE_SUCCESS;
}

块级操作错误处理

// 块级读写错误处理
static TEE_Result handle_block_error(struct ree_fs_file *f, 
                                    size_t block_num, 
                                    TEE_Result error)
{
    switch (error) {
    case TEE_ERROR_COMMUNICATION:
        // RPC通信错误,重试
        return retry_block_operation(f, block_num);
    
    case TEE_ERROR_CORRUPT_OBJECT:
        // 数据损坏,尝试从哈希树恢复
        return recover_block_from_htree(f, block_num);
    
    case TEE_ERROR_STORAGE_NO_SPACE:
        // 空间不足,触发垃圾回收
        gc_trigger();
        return TEE_ERROR_STORAGE_NO_SPACE;
    
    default:
        return error;
    }
}

RPMB后端错误处理

位置:optee_os/core/tee/tee_rpmb_fs.c

RPMB硬件错误处理

// RPMB写入失败恢复
static TEE_Result rpmb_write_error_recovery(void)
{
    // 1. 检查写计数器状态
    res = check_write_counter();
    if (res != TEE_SUCCESS) {
        // 写计数器异常,系统严重错误
        return TEE_ERROR_STORAGE_NOT_AVAILABLE;
    }
    
    // 2. 验证RPMB认证
    res = verify_rpmb_auth();
    if (res != TEE_SUCCESS) {
        // 认证失败,安全威胁
        return TEE_ERROR_SECURITY;
    }
    
    // 3. 重试写入操作
    return retry_rpmb_write();
}

FAT表损坏恢复

// FAT表损坏时的恢复机制
static TEE_Result recover_fat_table(void)
{
    // 1. 扫描所有RPMB块
    scan_all_rpmb_blocks();
    
    // 2. 重建FAT表
    rebuild_fat_from_blocks();
    
    // 3. 验证重建的FAT表
    if (!verify_rebuilt_fat()) {
        // 无法恢复,格式化RPMB
        return format_rpmb_filesystem();
    }
    
    return TEE_SUCCESS;
}

哈希树完整性错误处理

位置:optee_os/core/tee/fs_htree.c

哈希验证失败处理

// 哈希验证失败时的处理
static TEE_Result handle_hash_mismatch(struct tee_fs_htree *ht, 
                                      size_t node_id)
{
    // 1. 检查是否是叶子节点
    if (is_leaf_node(node_id)) {
        // 数据块损坏,标记为坏块
        mark_bad_block(ht, node_id);
        return TEE_ERROR_CORRUPT_OBJECT;
    }
    
    // 2. 内部节点损坏,尝试重建
    res = rebuild_internal_node(ht, node_id);
    if (res != TEE_SUCCESS) {
        // 无法重建,整个树损坏
        return TEE_ERROR_CORRUPT_OBJECT_2;
    }
    
    return TEE_SUCCESS;
}

原子更新失败恢复

// 原子更新失败时的回滚
static TEE_Result rollback_htree_update(struct tee_fs_htree *ht)
{
    // 1. 恢复到上一个稳定版本
    restore_previous_version(ht);
    
    // 2. 清理临时哈希节点
    cleanup_temp_hash_nodes(ht);
    
    // 3. 重置更新状态
    reset_update_state(ht);
    
    return TEE_SUCCESS;
}

RPC通信错误处理

位置:optee_os/core/tee/tee_fs_rpc.c

RPC超时处理

// RPC操作超时处理
static TEE_Result handle_rpc_timeout(uint32_t cmd)
{
    // 1. 检查REE状态
    if (!ree_available()) {
        return TEE_ERROR_COMMUNICATION;
    }
    
    // 2. 重试操作
    for (int retry = 0; retry < MAX_RPC_RETRIES; retry++) {
        res = send_rpc_command(cmd);
        if (res == TEE_SUCCESS)
            return TEE_SUCCESS;
        
        // 指数退避重试
        msleep(RETRY_DELAY_MS << retry);
    }
    
    return TEE_ERROR_COMMUNICATION;
}

RPC数据损坏处理

// RPC数据完整性验证
static TEE_Result verify_rpc_data_integrity(void *data, size_t len)
{
    // 1. 计算数据校验和
    uint32_t checksum = calculate_checksum(data, len);
    
    // 2. 与预期值比较
    if (checksum != expected_checksum) {
        // 数据损坏,请求重传
        request_retransmission();
        return TEE_ERROR_CORRUPT_OBJECT;
    }
    
    return TEE_SUCCESS;
}

内存错误处理

内存分配失败处理

// 内存不足时的处理策略
static TEE_Result handle_memory_shortage(size_t required_size)
{
    // 1. 尝试释放缓存
    free_storage_cache();
    
    // 2. 触发垃圾回收
    garbage_collect();
    
    // 3. 再次尝试分配
    void *ptr = malloc(required_size);
    if (!ptr) {
        // 仍然失败,降级服务
        return TEE_ERROR_OUT_OF_MEMORY;
    }
    
    return TEE_SUCCESS;
}

错误恢复策略

1. 分层恢复策略

  • 应用层: GP API错误码返回,应用决定恢复策略
  • 系统层: 自动重试、资源清理、状态重置
  • 硬件层: 硬件重置、备用路径激活

2. 数据恢复优先级

  1. 高优先级: 用户数据完整性
  2. 中优先级: 系统元数据一致性
  3. 低优先级: 性能优化数据

3. 故障隔离机制

  • TA隔离: 单个TA的错误不影响其他TA
  • 后端隔离: REE FS和RPMB FS相互独立
  • 版本隔离: 多版本数据确保回滚能力

测试和验证

错误注入测试

位置:optee_test/ta/storage/

存储错误注入

// 存储系统错误注入测试
static void test_storage_error_injection(void)
{
    // 1. 注入空间不足错误
    inject_storage_full_error();
    res = TEE_CreatePersistentObject(...);
    assert(res == TEE_ERROR_STORAGE_NO_SPACE);
    
    // 2. 注入数据损坏错误
    inject_corruption_error();
    res = TEE_ReadObjectData(...);
    assert(res == TEE_ERROR_CORRUPT_OBJECT);
    
    // 3. 注入通信错误
    inject_rpc_error();
    res = TEE_WriteObjectData(...);
    assert(res == TEE_ERROR_COMMUNICATION);
}

恢复性能测试

// 错误恢复性能基准测试
static void benchmark_error_recovery(void)
{
    // 测试各种错误场景的恢复时间
    measure_recovery_time(CORRUPTION_ERROR);
    measure_recovery_time(COMMUNICATION_ERROR);
    measure_recovery_time(MEMORY_ERROR);
}

最佳实践建议

1. 错误处理设计原则

  • Fail-Safe: 错误时保证数据安全
  • Fail-Fast: 早期检测和报告错误
  • 资源清理: 确保所有资源正确释放
  • 状态一致: 保持系统状态一致性

2. 应用开发建议

  • 检查所有返回值: 不忽略任何错误码
  • 实现重试机制: 对临时性错误进行重试
  • 备份重要数据: 定期备份关键数据
  • 监控资源使用: 避免资源泄漏

3. 系统配置建议

  • 合理配置缓存: 平衡性能和内存使用
  • 监控存储空间: 预留足够的存储空间
  • 定期维护: 执行文件系统检查和修复

总结

OP-TEE的GP存储错误处理机制具有以下特点:
  1. 多层次防护: 从硬件到应用的全方位错误处理
  2. 强恢复能力: 多种错误恢复策略确保系统稳定性
  3. 数据保护: 优先保证数据完整性和一致性
  4. 性能优化: 错误处理不影响正常操作性能
  5. 全面测试: 完整的错误注入和恢复测试套件
这个错误处理框架为安全关键应用提供了可靠的存储服务,确保在各种异常情况下的系统稳定性和数据安全性。