Documentation Index
Fetch the complete documentation index at: https://docs.z23.cc/llms.txt
Use this file to discover all available pages before exploring further.
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. 数据恢复优先级
- 高优先级: 用户数据完整性
- 中优先级: 系统元数据一致性
- 低优先级: 性能优化数据
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存储错误处理机制具有以下特点:
- 多层次防护: 从硬件到应用的全方位错误处理
- 强恢复能力: 多种错误恢复策略确保系统稳定性
- 数据保护: 优先保证数据完整性和一致性
- 性能优化: 错误处理不影响正常操作性能
- 全面测试: 完整的错误注入和恢复测试套件
这个错误处理框架为安全关键应用提供了可靠的存储服务,确保在各种异常情况下的系统稳定性和数据安全性。