Trusty系统基础入门

第七章:进程与通信模型

1. 任务隔离机制(非Linux进程模型)

Trusty OS采用了一种轻量级的任务模型,与传统的Linux进程模型有显著区别,专为安全关键环境设计。

1.1 Trusty任务模型特点

Trusty任务隔离架构

Trusty内核 任务A 任务B 任务C 非安全世界

1.2 内存隔离机制

Trusty通过以下机制实现任务间的内存隔离:

地址空间隔离

每个任务拥有独立的虚拟地址空间,通过MMU实现硬件级隔离

静态内存分配

任务内存需求在编译时确定,运行时无法动态扩展

权限控制

严格的内存访问权限控制,防止越界访问

注意:Trusty任务模型不支持动态内存分配(malloc/free),所有内存需求必须在编译时确定。

1.3 与Linux进程模型的对比

特性 Trusty任务 Linux进程
创建方式 静态创建,系统启动时初始化 动态创建(fork/exec)
内存管理 静态分配,固定大小 动态分配,支持分页和交换
调度策略 固定优先级调度 多种调度策略(CFS,实时等)
上下文切换开销 极小(仅寄存器保存) 较大(包含TLB刷新等)

2. TIPC通信协议详解

TIPC(Trusted IPC)是Trusty系统中任务间及安全世界与非安全世界间通信的核心机制。

2.1 通道建立流程

  1. 端口创建:任务通过tipc_create_port()创建通信端口
  2. 端口绑定:将端口绑定到特定服务名称或标识符
  3. 连接建立:客户端通过服务名称发起连接请求
  4. 安全验证:内核验证双方通信权限
  5. 通道激活:建立双向通信通道
// 服务端示例代码
int port = tipc_create_port("com.example.trusty.service", 
                           TIPC_PORT_ALLOW_TA_CONNECT);
if (port < 0) {
    // 错误处理
}

// 客户端示例代码
int chan = tipc_connect("com.example.trusty.service", 
                       TIPC_PORT_AUTO);
if (chan < 0) {
    // 错误处理
}
        

2.2 消息传递机制

TIPC支持两种消息传递模式:

同步消息

  • 阻塞式发送/接收
  • 类似RPC调用模型
  • 自动处理消息分段和重组
  • 内置超时机制

异步消息

  • 非阻塞操作
  • 基于事件通知机制
  • 需要手动管理消息缓冲区
  • 适合高吞吐量场景
// 同步消息发送示例
struct my_msg msg = { ... };
int rc = tipc_send(chan, &msg, sizeof(msg), 0, 1000 /* timeout_ms */);
if (rc != sizeof(msg)) {
    // 错误处理
}

// 异步消息接收示例
struct tipc_event evt;
while (tipc_wait(port, &evt, 1000) == NO_ERROR) {
    if (evt.event == TIPC_EVENT_MSG) {
        // 处理消息
        struct my_msg *msg = (struct my_msg *)evt.msg;
        // ...
        tipc_put_msg(evt.msg); // 释放消息缓冲区
    }
}
        

安全警告:TIPC消息传递虽然经过内核验证,但应用层仍需验证消息内容的完整性和真实性,防止恶意构造的消息导致安全问题。

2.3 跨世界通信

TIPC支持安全世界(Trusty)与非安全世界(Normal World)之间的通信:

3. 共享内存管理

Trusty提供了安全的共享内存机制,用于高效的数据交换,同时保证安全隔离。

3.1 共享内存类型

类型 描述 使用场景
静态共享内存 编译时预定义的固定大小内存区域 已知固定大小的数据交换
动态共享内存 运行时按需分配的内存区域 可变大小的数据交换
世界间共享内存 安全与非安全世界共享的内存区域 跨世界大数据传输

3.2 安全世界与非安全世界映射

跨世界共享内存需要特殊的映射机制:

跨世界共享内存映射

安全世界(Trusty) 非安全世界(Linux) 共享内存区域 共享内存映射 物理内存相同,虚拟地址不同

3.3 共享内存API示例

// 安全世界(Trusty)端代码 int rc; handle_t mem_handle; // 分配共享内存 rc = trusty_shared_mem_alloc(4096, 0, &mem_handle); if (rc != NO_ERROR) { // 错误处理 } // 获取内存指针 void *ptr; rc = trusty_shared_mem_map(mem_handle, &ptr); if (rc != NO_ERROR) { // 错误处理 } // 使用共享内存... // 取消映射 trusty_shared_mem_unmap(ptr); // 非安全世界(Linux)端代码 int fd = open("/dev/trusty-ipc", O_RDWR); struct trusty_shm shm; // 导入共享内存 ioctl(fd, TRUSTY_SHM_IMPORT, &shm); // 映射到用户空间 void *ptr = mmap(NULL, shm.size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, shm.offset); // 使用共享内存... // 取消映射和释放 munmap(ptr, shm.size); ioctl(f